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