1 /* $NetBSD: msg_342.c,v 1.5 2023/03/28 14:44:35 rillig Exp $ */
2 # 3 "msg_342.c"
3
4 // Test for message: argument to '%s' must be cast to 'unsigned char', not to '%s' [342]
5
6 /*
7 * Ensure that the functions from <ctype.h> are called with the correct
8 * argument.
9 */
10
11 /* lint1-extra-flags: -X 351 */
12
13 /* NetBSD 9.99.81, <ctype.h> */
14 extern const unsigned short *_ctype_tab_;
15 extern const short *_tolower_tab_;
16 extern const short *_toupper_tab_;
17 int isalnum(int);
18 int isalpha(int);
19 int isblank(int);
20 int iscntrl(int);
21 int isdigit(int);
22 int isgraph(int);
23 int islower(int);
24 int isprint(int);
25 int ispunct(int);
26 int isspace(int);
27 int isupper(int);
28 int isxdigit(int);
29 int tolower(int);
30 int toupper(int);
31
32 int is_other(int);
33 int to_other(int);
34
35 void sink(int);
36
37 void
cover_is_ctype_function(char c)38 cover_is_ctype_function(char c)
39 {
40 /* expect+1: warning: argument to 'isalnum' must be 'unsigned char' or EOF, not 'char' [341] */
41 isalnum(c);
42 /* expect+1: warning: argument to 'isalpha' must be 'unsigned char' or EOF, not 'char' [341] */
43 isalpha(c);
44 /* expect+1: warning: argument to 'isblank' must be 'unsigned char' or EOF, not 'char' [341] */
45 isblank(c);
46 /* expect+1: warning: argument to 'iscntrl' must be 'unsigned char' or EOF, not 'char' [341] */
47 iscntrl(c);
48 /* expect+1: warning: argument to 'isdigit' must be 'unsigned char' or EOF, not 'char' [341] */
49 isdigit(c);
50 /* expect+1: warning: argument to 'isgraph' must be 'unsigned char' or EOF, not 'char' [341] */
51 isgraph(c);
52 /* expect+1: warning: argument to 'islower' must be 'unsigned char' or EOF, not 'char' [341] */
53 islower(c);
54 /* expect+1: warning: argument to 'isprint' must be 'unsigned char' or EOF, not 'char' [341] */
55 isprint(c);
56 /* expect+1: warning: argument to 'ispunct' must be 'unsigned char' or EOF, not 'char' [341] */
57 ispunct(c);
58 /* expect+1: warning: argument to 'isspace' must be 'unsigned char' or EOF, not 'char' [341] */
59 isspace(c);
60 /* expect+1: warning: argument to 'isupper' must be 'unsigned char' or EOF, not 'char' [341] */
61 isupper(c);
62 /* expect+1: warning: argument to 'isxdigit' must be 'unsigned char' or EOF, not 'char' [341] */
63 isxdigit(c);
64 /* expect+1: warning: argument to 'tolower' must be 'unsigned char' or EOF, not 'char' [341] */
65 tolower(c);
66 /* expect+1: warning: argument to 'toupper' must be 'unsigned char' or EOF, not 'char' [341] */
67 toupper(c);
68
69 /* Functions with similar names are not checked. */
70 is_other(c);
71 to_other(c);
72 }
73
74 void
function_call_char(char c)75 function_call_char(char c)
76 {
77
78 /* expect+1: warning: argument to 'isspace' must be 'unsigned char' or EOF, not 'char' [341] */
79 (isspace)(c);
80
81 /* This is the only allowed form. */
82 isspace((unsigned char)c);
83
84 /* The cast to 'int' is redundant, it doesn't hurt though. */
85 isspace((int)(unsigned char)c);
86
87 /* expect+1: warning: argument to 'isspace' must be cast to 'unsigned char', not to 'int' [342] */
88 isspace((int)c);
89
90 /* expect+1: warning: argument to 'isspace' must be cast to 'unsigned char', not to 'unsigned int' [342] */
91 isspace((unsigned int)c);
92 }
93
94 /*
95 * If the expression starts with type 'unsigned char', it can be cast to any
96 * other type. Chances are low enough that the cast is to 'char', which would
97 * be the only bad type.
98 */
99 void
function_call_unsigned_char(unsigned char c)100 function_call_unsigned_char(unsigned char c)
101 {
102
103 (isspace)(c);
104 isspace((unsigned char)c);
105 isspace((int)c);
106 isspace((unsigned int)c);
107 }
108
109 /* When used in a loop of fgetc, the type is already 'int'. That's fine. */
110 void
function_call_int(int c)111 function_call_int(int c)
112 {
113
114 isspace(c);
115 }
116
117 void
macro_invocation_NetBSD(char c)118 macro_invocation_NetBSD(char c)
119 {
120
121 /* expect+1: warning: argument to 'function from <ctype.h>' must be 'unsigned char' or EOF, not 'char' [341] */
122 sink(((int)((_ctype_tab_ + 1)[(c)] & 0x0040)));
123
124 /* This is the only allowed form. */
125 sink(((int)((_ctype_tab_ + 1)[((unsigned char)c)] & 0x0040)));
126
127 /* expect+1: warning: argument to 'function from <ctype.h>' must be cast to 'unsigned char', not to 'int' [342] */
128 sink(((int)((_ctype_tab_ + 1)[((int)c)] & 0x0040)));
129
130 /* expect+1: warning: argument to 'function from <ctype.h>' must be cast to 'unsigned char', not to 'unsigned int' [342] */
131 sink(((int)((_ctype_tab_ + 1)[((unsigned int)c)] & 0x0040)));
132 }
133