xref: /netbsd-src/tests/usr.bin/xlint/lint1/msg_341.c (revision 6bf2647feca48e066f181ac19000bffe75e2a408)
1*6bf2647fSrillig /*	$NetBSD: msg_341.c,v 1.4 2024/12/18 18:14:54 rillig Exp $	*/
2b5bd70afSrillig # 3 "msg_341.c"
3b5bd70afSrillig 
4b5bd70afSrillig // Test for message: argument to '%s' must be 'unsigned char' or EOF, not '%s' [341]
5b5bd70afSrillig 
6b5bd70afSrillig /*
7b5bd70afSrillig  * Ensure that the functions from <ctype.h> are called with the correct
8b5bd70afSrillig  * argument.
9b5bd70afSrillig  */
10b5bd70afSrillig 
11b2baa501Srillig /* lint1-extra-flags: -X 351 */
12b2baa501Srillig 
13b5bd70afSrillig /* NetBSD 9.99.81, <ctype.h> */
14b5bd70afSrillig extern const unsigned short *_ctype_tab_;
15b5bd70afSrillig extern const short *_tolower_tab_;
16b5bd70afSrillig extern const short *_toupper_tab_;
17b5bd70afSrillig int isspace(int);
18b5bd70afSrillig 
19b5bd70afSrillig void sink(int);
20b5bd70afSrillig 
21b5bd70afSrillig void
22b5bd70afSrillig function_call_char(char c)
23b5bd70afSrillig {
24b5bd70afSrillig 
25c83f7defSrillig 	/* expect+1: warning: argument to 'isspace' must be 'unsigned char' or EOF, not 'char' [341] */
26b5bd70afSrillig 	(isspace)(c);
27b5bd70afSrillig 
28b5bd70afSrillig 	/* This is the only allowed form. */
29b5bd70afSrillig 	isspace((unsigned char)c);
30b5bd70afSrillig 
31b5bd70afSrillig 	/* The cast to 'int' is redundant, it doesn't hurt though. */
32b5bd70afSrillig 	isspace((int)(unsigned char)c);
33b5bd70afSrillig 
34c83f7defSrillig 	/* expect+1: warning: argument to 'isspace' must be cast to 'unsigned char', not to 'int' [342] */
35b5bd70afSrillig 	isspace((int)c);
36b5bd70afSrillig 
37c83f7defSrillig 	/* expect+1: warning: argument to 'isspace' must be cast to 'unsigned char', not to 'unsigned int' [342] */
38b5bd70afSrillig 	isspace((unsigned int)c);
39b5bd70afSrillig }
40b5bd70afSrillig 
41b5bd70afSrillig /*
42b5bd70afSrillig  * If the expression starts with type 'unsigned char', it can be cast to any
43b5bd70afSrillig  * other type.  Chances are low enough that the cast is to 'char', which would
44b5bd70afSrillig  * be the only bad type.
45b5bd70afSrillig  */
46b5bd70afSrillig void
47b5bd70afSrillig function_call_unsigned_char(unsigned char c)
48b5bd70afSrillig {
49b5bd70afSrillig 
50b5bd70afSrillig 	(isspace)(c);
51b5bd70afSrillig 	isspace((unsigned char)c);
52b5bd70afSrillig 	isspace((int)c);
53b5bd70afSrillig 	isspace((unsigned int)c);
54b5bd70afSrillig }
55b5bd70afSrillig 
56b5bd70afSrillig /* When used in a loop of fgetc, the type is already 'int'.  That's fine. */
57b5bd70afSrillig void
58b5bd70afSrillig function_call_int(int c)
59b5bd70afSrillig {
60b5bd70afSrillig 
61b5bd70afSrillig 	isspace(c);
62b5bd70afSrillig }
63b5bd70afSrillig 
64b5bd70afSrillig void
65*6bf2647fSrillig macro_invocation_NetBSD(char c, signed char sc)
66b5bd70afSrillig {
67b5bd70afSrillig 
68c83f7defSrillig 	/* expect+1: warning: argument to 'function from <ctype.h>' must be 'unsigned char' or EOF, not 'char' [341] */
69b5bd70afSrillig 	sink(((int)((_ctype_tab_ + 1)[(c)] & 0x0040)));
70b5bd70afSrillig 
71b5bd70afSrillig 	/* This is the only allowed form. */
72b5bd70afSrillig 	sink(((int)((_ctype_tab_ + 1)[((unsigned char)c)] & 0x0040)));
73b5bd70afSrillig 
74c83f7defSrillig 	/* expect+1: warning: argument to 'function from <ctype.h>' must be cast to 'unsigned char', not to 'int' [342] */
75b5bd70afSrillig 	sink(((int)((_ctype_tab_ + 1)[((int)c)] & 0x0040)));
76b5bd70afSrillig 
77c83f7defSrillig 	/* expect+1: warning: argument to 'function from <ctype.h>' must be cast to 'unsigned char', not to 'unsigned int' [342] */
78b5bd70afSrillig 	sink(((int)((_ctype_tab_ + 1)[((unsigned int)c)] & 0x0040)));
79*6bf2647fSrillig 
80*6bf2647fSrillig 	// https://mail-index.netbsd.org/current-users/2024/12/15/msg045888.html
81*6bf2647fSrillig 	/* expect+1: warning: argument to 'function from <ctype.h>' must be 'unsigned char' or EOF, not 'unsigned int' [341] */
82*6bf2647fSrillig 	sink(((int)((_ctype_tab_ + 1)[(0xffffffffu)])));
83*6bf2647fSrillig 
84*6bf2647fSrillig 	/* expect+1: warning: argument to 'function from <ctype.h>' must be 'unsigned char' or EOF, not 'signed char' [341] */
85*6bf2647fSrillig 	sink(((int)((_ctype_tab_ + 1)[sc])));
86b5bd70afSrillig }
87