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