xref: /netbsd-src/tests/usr.bin/xlint/lint1/msg_342.c (revision 82d56013d7b633d116a93943de88e08335357a7c)
1 /*	$NetBSD: msg_342.c,v 1.1 2021/04/05 02:05:47 rillig Exp $	*/
2 # 3 "msg_341.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 /* NetBSD 9.99.81, <ctype.h> */
12 extern const unsigned short *_ctype_tab_;
13 extern const short *_tolower_tab_;
14 extern const short *_toupper_tab_;
15 int isspace(int);
16 
17 void sink(int);
18 
19 void
20 function_call_char(char c)
21 {
22 
23 	/* expect+1: argument to 'isspace' must be 'unsigned char' or EOF, not 'char' */
24 	(isspace)(c);
25 
26 	/* This is the only allowed form. */
27 	isspace((unsigned char)c);
28 
29 	/* The cast to 'int' is redundant, it doesn't hurt though. */
30 	isspace((int)(unsigned char)c);
31 
32 	/* expect+1: argument to 'isspace' must be cast to 'unsigned char', not to 'int' */
33 	isspace((int)c);
34 
35 	/* expect+1: argument to 'isspace' must be cast to 'unsigned char', not to 'unsigned int' */
36 	isspace((unsigned int)c);
37 }
38 
39 /*
40  * If the expression starts with type 'unsigned char', it can be cast to any
41  * other type.  Chances are low enough that the cast is to 'char', which would
42  * be the only bad type.
43  */
44 void
45 function_call_unsigned_char(unsigned char c)
46 {
47 
48 	(isspace)(c);
49 	isspace((unsigned char)c);
50 	isspace((int)c);
51 	isspace((unsigned int)c);
52 }
53 
54 /* When used in a loop of fgetc, the type is already 'int'.  That's fine. */
55 void
56 function_call_int(int c)
57 {
58 
59 	isspace(c);
60 }
61 
62 void
63 macro_invocation_NetBSD(char c)
64 {
65 
66 	/* expect+1: argument to 'function from <ctype.h>' must be 'unsigned char' or EOF, not 'char' */
67 	sink(((int)((_ctype_tab_ + 1)[(c)] & 0x0040)));
68 
69 	/* This is the only allowed form. */
70 	sink(((int)((_ctype_tab_ + 1)[((unsigned char)c)] & 0x0040)));
71 
72 	/* expect+1: argument to 'function from <ctype.h>' must be cast to 'unsigned char', not to 'int' */
73 	sink(((int)((_ctype_tab_ + 1)[((int)c)] & 0x0040)));
74 
75 	/* expect+1: argument to 'function from <ctype.h>' must be cast to 'unsigned char', not to 'unsigned int' */
76 	sink(((int)((_ctype_tab_ + 1)[((unsigned int)c)] & 0x0040)));
77 }
78