xref: /netbsd-src/tests/usr.bin/xlint/lint1/msg_342.c (revision b2baa50111d645353fa30b4deab0f79d93650c8c)
1*b2baa501Srillig /*	$NetBSD: msg_342.c,v 1.5 2023/03/28 14:44:35 rillig Exp $	*/
2c83f7defSrillig # 3 "msg_342.c"
3b5bd70afSrillig 
4b5bd70afSrillig // Test for message: argument to '%s' must be cast to 'unsigned char', not to '%s' [342]
5b5bd70afSrillig 
6b5bd70afSrillig /*
7b5bd70afSrillig  * Ensure that the functions from <ctype.h> are called with the correct
8b5bd70afSrillig  * argument.
9b5bd70afSrillig  */
10b5bd70afSrillig 
11*b2baa501Srillig /* lint1-extra-flags: -X 351 */
12*b2baa501Srillig 
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_;
177ed694cbSrillig int isalnum(int);
187ed694cbSrillig int isalpha(int);
197ed694cbSrillig int isblank(int);
207ed694cbSrillig int iscntrl(int);
217ed694cbSrillig int isdigit(int);
227ed694cbSrillig int isgraph(int);
237ed694cbSrillig int islower(int);
247ed694cbSrillig int isprint(int);
257ed694cbSrillig int ispunct(int);
26b5bd70afSrillig int isspace(int);
277ed694cbSrillig int isupper(int);
287ed694cbSrillig int isxdigit(int);
297ed694cbSrillig int tolower(int);
307ed694cbSrillig int toupper(int);
31b5bd70afSrillig 
3252d06849Srillig int is_other(int);
3352d06849Srillig int to_other(int);
3452d06849Srillig 
35b5bd70afSrillig void sink(int);
36b5bd70afSrillig 
37b5bd70afSrillig void
cover_is_ctype_function(char c)387ed694cbSrillig cover_is_ctype_function(char c)
397ed694cbSrillig {
407ed694cbSrillig 	/* expect+1: warning: argument to 'isalnum' must be 'unsigned char' or EOF, not 'char' [341] */
417ed694cbSrillig 	isalnum(c);
427ed694cbSrillig 	/* expect+1: warning: argument to 'isalpha' must be 'unsigned char' or EOF, not 'char' [341] */
437ed694cbSrillig 	isalpha(c);
447ed694cbSrillig 	/* expect+1: warning: argument to 'isblank' must be 'unsigned char' or EOF, not 'char' [341] */
457ed694cbSrillig 	isblank(c);
467ed694cbSrillig 	/* expect+1: warning: argument to 'iscntrl' must be 'unsigned char' or EOF, not 'char' [341] */
477ed694cbSrillig 	iscntrl(c);
487ed694cbSrillig 	/* expect+1: warning: argument to 'isdigit' must be 'unsigned char' or EOF, not 'char' [341] */
497ed694cbSrillig 	isdigit(c);
507ed694cbSrillig 	/* expect+1: warning: argument to 'isgraph' must be 'unsigned char' or EOF, not 'char' [341] */
517ed694cbSrillig 	isgraph(c);
527ed694cbSrillig 	/* expect+1: warning: argument to 'islower' must be 'unsigned char' or EOF, not 'char' [341] */
537ed694cbSrillig 	islower(c);
547ed694cbSrillig 	/* expect+1: warning: argument to 'isprint' must be 'unsigned char' or EOF, not 'char' [341] */
557ed694cbSrillig 	isprint(c);
567ed694cbSrillig 	/* expect+1: warning: argument to 'ispunct' must be 'unsigned char' or EOF, not 'char' [341] */
577ed694cbSrillig 	ispunct(c);
587ed694cbSrillig 	/* expect+1: warning: argument to 'isspace' must be 'unsigned char' or EOF, not 'char' [341] */
597ed694cbSrillig 	isspace(c);
607ed694cbSrillig 	/* expect+1: warning: argument to 'isupper' must be 'unsigned char' or EOF, not 'char' [341] */
617ed694cbSrillig 	isupper(c);
627ed694cbSrillig 	/* expect+1: warning: argument to 'isxdigit' must be 'unsigned char' or EOF, not 'char' [341] */
637ed694cbSrillig 	isxdigit(c);
647ed694cbSrillig 	/* expect+1: warning: argument to 'tolower' must be 'unsigned char' or EOF, not 'char' [341] */
657ed694cbSrillig 	tolower(c);
667ed694cbSrillig 	/* expect+1: warning: argument to 'toupper' must be 'unsigned char' or EOF, not 'char' [341] */
677ed694cbSrillig 	toupper(c);
6852d06849Srillig 
6952d06849Srillig 	/* Functions with similar names are not checked. */
7052d06849Srillig 	is_other(c);
7152d06849Srillig 	to_other(c);
727ed694cbSrillig }
737ed694cbSrillig 
747ed694cbSrillig void
function_call_char(char c)75b5bd70afSrillig function_call_char(char c)
76b5bd70afSrillig {
77b5bd70afSrillig 
78c83f7defSrillig 	/* expect+1: warning: argument to 'isspace' must be 'unsigned char' or EOF, not 'char' [341] */
79b5bd70afSrillig 	(isspace)(c);
80b5bd70afSrillig 
81b5bd70afSrillig 	/* This is the only allowed form. */
82b5bd70afSrillig 	isspace((unsigned char)c);
83b5bd70afSrillig 
84b5bd70afSrillig 	/* The cast to 'int' is redundant, it doesn't hurt though. */
85b5bd70afSrillig 	isspace((int)(unsigned char)c);
86b5bd70afSrillig 
87c83f7defSrillig 	/* expect+1: warning: argument to 'isspace' must be cast to 'unsigned char', not to 'int' [342] */
88b5bd70afSrillig 	isspace((int)c);
89b5bd70afSrillig 
90c83f7defSrillig 	/* expect+1: warning: argument to 'isspace' must be cast to 'unsigned char', not to 'unsigned int' [342] */
91b5bd70afSrillig 	isspace((unsigned int)c);
92b5bd70afSrillig }
93b5bd70afSrillig 
94b5bd70afSrillig /*
95b5bd70afSrillig  * If the expression starts with type 'unsigned char', it can be cast to any
96b5bd70afSrillig  * other type.  Chances are low enough that the cast is to 'char', which would
97b5bd70afSrillig  * be the only bad type.
98b5bd70afSrillig  */
99b5bd70afSrillig void
function_call_unsigned_char(unsigned char c)100b5bd70afSrillig function_call_unsigned_char(unsigned char c)
101b5bd70afSrillig {
102b5bd70afSrillig 
103b5bd70afSrillig 	(isspace)(c);
104b5bd70afSrillig 	isspace((unsigned char)c);
105b5bd70afSrillig 	isspace((int)c);
106b5bd70afSrillig 	isspace((unsigned int)c);
107b5bd70afSrillig }
108b5bd70afSrillig 
109b5bd70afSrillig /* When used in a loop of fgetc, the type is already 'int'.  That's fine. */
110b5bd70afSrillig void
function_call_int(int c)111b5bd70afSrillig function_call_int(int c)
112b5bd70afSrillig {
113b5bd70afSrillig 
114b5bd70afSrillig 	isspace(c);
115b5bd70afSrillig }
116b5bd70afSrillig 
117b5bd70afSrillig void
macro_invocation_NetBSD(char c)118b5bd70afSrillig macro_invocation_NetBSD(char c)
119b5bd70afSrillig {
120b5bd70afSrillig 
121c83f7defSrillig 	/* expect+1: warning: argument to 'function from <ctype.h>' must be 'unsigned char' or EOF, not 'char' [341] */
122b5bd70afSrillig 	sink(((int)((_ctype_tab_ + 1)[(c)] & 0x0040)));
123b5bd70afSrillig 
124b5bd70afSrillig 	/* This is the only allowed form. */
125b5bd70afSrillig 	sink(((int)((_ctype_tab_ + 1)[((unsigned char)c)] & 0x0040)));
126b5bd70afSrillig 
127c83f7defSrillig 	/* expect+1: warning: argument to 'function from <ctype.h>' must be cast to 'unsigned char', not to 'int' [342] */
128b5bd70afSrillig 	sink(((int)((_ctype_tab_ + 1)[((int)c)] & 0x0040)));
129b5bd70afSrillig 
130c83f7defSrillig 	/* expect+1: warning: argument to 'function from <ctype.h>' must be cast to 'unsigned char', not to 'unsigned int' [342] */
131b5bd70afSrillig 	sink(((int)((_ctype_tab_ + 1)[((unsigned int)c)] & 0x0040)));
132b5bd70afSrillig }
133