msg_342.c revision 1.5
11.5Srillig/*	$NetBSD: msg_342.c,v 1.5 2023/03/28 14:44:35 rillig Exp $	*/
21.4Srillig# 3 "msg_342.c"
31.1Srillig
41.1Srillig// Test for message: argument to '%s' must be cast to 'unsigned char', not to '%s' [342]
51.1Srillig
61.1Srillig/*
71.1Srillig * Ensure that the functions from <ctype.h> are called with the correct
81.1Srillig * argument.
91.1Srillig */
101.1Srillig
111.5Srillig/* lint1-extra-flags: -X 351 */
121.5Srillig
131.1Srillig/* NetBSD 9.99.81, <ctype.h> */
141.1Srilligextern const unsigned short *_ctype_tab_;
151.1Srilligextern const short *_tolower_tab_;
161.1Srilligextern const short *_toupper_tab_;
171.2Srilligint isalnum(int);
181.2Srilligint isalpha(int);
191.2Srilligint isblank(int);
201.2Srilligint iscntrl(int);
211.2Srilligint isdigit(int);
221.2Srilligint isgraph(int);
231.2Srilligint islower(int);
241.2Srilligint isprint(int);
251.2Srilligint ispunct(int);
261.1Srilligint isspace(int);
271.2Srilligint isupper(int);
281.2Srilligint isxdigit(int);
291.2Srilligint tolower(int);
301.2Srilligint toupper(int);
311.1Srillig
321.3Srilligint is_other(int);
331.3Srilligint to_other(int);
341.3Srillig
351.1Srilligvoid sink(int);
361.1Srillig
371.1Srilligvoid
381.2Srilligcover_is_ctype_function(char c)
391.2Srillig{
401.2Srillig	/* expect+1: warning: argument to 'isalnum' must be 'unsigned char' or EOF, not 'char' [341] */
411.2Srillig	isalnum(c);
421.2Srillig	/* expect+1: warning: argument to 'isalpha' must be 'unsigned char' or EOF, not 'char' [341] */
431.2Srillig	isalpha(c);
441.2Srillig	/* expect+1: warning: argument to 'isblank' must be 'unsigned char' or EOF, not 'char' [341] */
451.2Srillig	isblank(c);
461.2Srillig	/* expect+1: warning: argument to 'iscntrl' must be 'unsigned char' or EOF, not 'char' [341] */
471.2Srillig	iscntrl(c);
481.2Srillig	/* expect+1: warning: argument to 'isdigit' must be 'unsigned char' or EOF, not 'char' [341] */
491.2Srillig	isdigit(c);
501.2Srillig	/* expect+1: warning: argument to 'isgraph' must be 'unsigned char' or EOF, not 'char' [341] */
511.2Srillig	isgraph(c);
521.2Srillig	/* expect+1: warning: argument to 'islower' must be 'unsigned char' or EOF, not 'char' [341] */
531.2Srillig	islower(c);
541.2Srillig	/* expect+1: warning: argument to 'isprint' must be 'unsigned char' or EOF, not 'char' [341] */
551.2Srillig	isprint(c);
561.2Srillig	/* expect+1: warning: argument to 'ispunct' must be 'unsigned char' or EOF, not 'char' [341] */
571.2Srillig	ispunct(c);
581.2Srillig	/* expect+1: warning: argument to 'isspace' must be 'unsigned char' or EOF, not 'char' [341] */
591.2Srillig	isspace(c);
601.2Srillig	/* expect+1: warning: argument to 'isupper' must be 'unsigned char' or EOF, not 'char' [341] */
611.2Srillig	isupper(c);
621.2Srillig	/* expect+1: warning: argument to 'isxdigit' must be 'unsigned char' or EOF, not 'char' [341] */
631.2Srillig	isxdigit(c);
641.2Srillig	/* expect+1: warning: argument to 'tolower' must be 'unsigned char' or EOF, not 'char' [341] */
651.2Srillig	tolower(c);
661.2Srillig	/* expect+1: warning: argument to 'toupper' must be 'unsigned char' or EOF, not 'char' [341] */
671.2Srillig	toupper(c);
681.3Srillig
691.3Srillig	/* Functions with similar names are not checked. */
701.3Srillig	is_other(c);
711.3Srillig	to_other(c);
721.2Srillig}
731.2Srillig
741.2Srilligvoid
751.1Srilligfunction_call_char(char c)
761.1Srillig{
771.1Srillig
781.4Srillig	/* expect+1: warning: argument to 'isspace' must be 'unsigned char' or EOF, not 'char' [341] */
791.1Srillig	(isspace)(c);
801.1Srillig
811.1Srillig	/* This is the only allowed form. */
821.1Srillig	isspace((unsigned char)c);
831.1Srillig
841.1Srillig	/* The cast to 'int' is redundant, it doesn't hurt though. */
851.1Srillig	isspace((int)(unsigned char)c);
861.1Srillig
871.4Srillig	/* expect+1: warning: argument to 'isspace' must be cast to 'unsigned char', not to 'int' [342] */
881.1Srillig	isspace((int)c);
891.1Srillig
901.4Srillig	/* expect+1: warning: argument to 'isspace' must be cast to 'unsigned char', not to 'unsigned int' [342] */
911.1Srillig	isspace((unsigned int)c);
921.1Srillig}
931.1Srillig
941.1Srillig/*
951.1Srillig * If the expression starts with type 'unsigned char', it can be cast to any
961.1Srillig * other type.  Chances are low enough that the cast is to 'char', which would
971.1Srillig * be the only bad type.
981.1Srillig */
991.1Srilligvoid
1001.1Srilligfunction_call_unsigned_char(unsigned char c)
1011.1Srillig{
1021.1Srillig
1031.1Srillig	(isspace)(c);
1041.1Srillig	isspace((unsigned char)c);
1051.1Srillig	isspace((int)c);
1061.1Srillig	isspace((unsigned int)c);
1071.1Srillig}
1081.1Srillig
1091.1Srillig/* When used in a loop of fgetc, the type is already 'int'.  That's fine. */
1101.1Srilligvoid
1111.1Srilligfunction_call_int(int c)
1121.1Srillig{
1131.1Srillig
1141.1Srillig	isspace(c);
1151.1Srillig}
1161.1Srillig
1171.1Srilligvoid
1181.1Srilligmacro_invocation_NetBSD(char c)
1191.1Srillig{
1201.1Srillig
1211.4Srillig	/* expect+1: warning: argument to 'function from <ctype.h>' must be 'unsigned char' or EOF, not 'char' [341] */
1221.1Srillig	sink(((int)((_ctype_tab_ + 1)[(c)] & 0x0040)));
1231.1Srillig
1241.1Srillig	/* This is the only allowed form. */
1251.1Srillig	sink(((int)((_ctype_tab_ + 1)[((unsigned char)c)] & 0x0040)));
1261.1Srillig
1271.4Srillig	/* expect+1: warning: argument to 'function from <ctype.h>' must be cast to 'unsigned char', not to 'int' [342] */
1281.1Srillig	sink(((int)((_ctype_tab_ + 1)[((int)c)] & 0x0040)));
1291.1Srillig
1301.4Srillig	/* expect+1: warning: argument to 'function from <ctype.h>' must be cast to 'unsigned char', not to 'unsigned int' [342] */
1311.1Srillig	sink(((int)((_ctype_tab_ + 1)[((unsigned int)c)] & 0x0040)));
1321.1Srillig}
133