msg_204.c revision 1.9
11.9Srillig/* $NetBSD: msg_204.c,v 1.9 2023/07/09 11:18:55 rillig Exp $ */ 21.1Srillig# 3 "msg_204.c" 31.1Srillig 41.1Srillig// Test for message: controlling expressions must have scalar type [204] 51.1Srillig 61.8Srillig/* Suppress messages for unused arguments and for 'extern' declarations. */ 71.8Srillig/* lint1-extra-flags: -X 231 -X 351 */ 81.7Srillig 91.2Srilligextern void 101.2Srilligextern_function(void); 111.2Srillig 121.2Srilligvoid (*function_pointer)(void); 131.2Srillig 141.2Srillig/* 151.2Srillig * Since func.c 1.39 from 2020-12-31 18:51:28, lint had produced an error 161.2Srillig * when a controlling expression was a function. Pointers to functions were 171.2Srillig * ok though. 181.2Srillig */ 191.2Srilligvoid 201.2Srilligbug_between_2020_12_31_and_2021_01_08(void) 211.2Srillig{ 221.2Srillig if (extern_function) 231.2Srillig extern_function(); 241.2Srillig 251.2Srillig /* 261.2Srillig * FIXME: For some reason, the ampersand is discarded in 271.4Srillig * build_address. This only has a visible effect if the 281.2Srillig * t_spec in check_controlling_expression is evaluated too early, 291.2Srillig * as has been the case before func.c 1.52 from 2021-01-08. 301.2Srillig */ 311.2Srillig if (&extern_function) 321.2Srillig extern_function(); 331.2Srillig 341.2Srillig /* This one has always been ok since pointers are scalar types. */ 351.2Srillig if (function_pointer) 361.2Srillig function_pointer(); 371.2Srillig} 381.3Srillig 391.3Srilligstruct s { 401.3Srillig int member; 411.3Srillig}; 421.3Srillig 431.3Srilligunion u { 441.3Srillig int member; 451.3Srillig}; 461.3Srillig 471.3Srilligenum e { 481.3Srillig E 491.3Srillig}; 501.3Srillig 511.3Srilligstruct arr { 521.3Srillig int arr[4]; 531.3Srillig}; 541.3Srillig 551.3Srillig/* C99 6.2.5p2 */ 561.3Srilligvoid if_Bool(_Bool b) { if (b) return; } 571.3Srillig 581.3Srillig/* C99 6.2.5p3 */ 591.3Srilligvoid if_char(char c) { if (c) return; } 601.3Srillig 611.3Srillig/* C99 6.2.5p4 */ 621.3Srilligvoid if_signed_char(signed char sc) { if (sc) return; } 631.3Srilligvoid if_short_int(short s) { if (s) return; } 641.3Srilligvoid if_int(int i) { if (i) return; } 651.3Srilligvoid if_long_int(long int l) { if (l) return; } 661.3Srilligvoid if_long_long_int(long long int ll) { if (ll) return; } 671.3Srillig 681.3Srillig/* C99 6.2.5p6 */ 691.3Srilligvoid if_unsigned_char(unsigned char uc) { if (uc) return; } 701.3Srilligvoid if_unsigned_short_int(unsigned short us) { if (us) return; } 711.3Srilligvoid if_unsigned_int(unsigned int ui) { if (ui) return; } 721.3Srilligvoid if_unsigned_long_int(unsigned long int ul) { if (ul) return; } 731.3Srilligvoid if_unsigned_long_long_int(unsigned long long int ull) { if (ull) return; } 741.3Srillig 751.3Srillig/* C99 6.2.5p10 */ 761.3Srilligvoid if_float(float f) { if (f) return; } 771.3Srilligvoid if_double(double d) { if (d) return; } 781.3Srilligvoid if_long_double(long double ld) { if (ld) return; } 791.3Srillig 801.3Srillig/* C99 6.2.5p11 */ 811.3Srilligvoid if_float_Complex(float _Complex fc) { if (fc) return; } 821.3Srilligvoid if_double_Complex(double _Complex dc) { if (dc) return; } 831.3Srilligvoid if_long_double_Complex(long double _Complex ldc) { if (ldc) return; } 841.3Srillig 851.3Srillig/* C99 6.2.5p16 */ 861.3Srilligvoid if_enum(enum e e) { if (e) return; } 871.3Srillig 881.3Srillig/* C99 6.2.5p20 */ 891.3Srilligvoid if_array(struct arr arr) { if (arr.arr) return; } 901.7Srillig/* expect+1: error: controlling expressions must have scalar type [204] */ 911.7Srilligvoid if_struct(struct s s) { if (s) return; } 921.7Srillig/* expect+1: error: controlling expressions must have scalar type [204] */ 931.7Srilligvoid if_union(union u u) { if (u) return; } 941.3Srilligvoid if_function(void) { if (if_function) return; } 951.3Srilligvoid if_pointer(void *p) { if (p) return; } 961.3Srillig 971.3Srillig/* C99 6.8.5 */ 981.7Srillig/* expect+1: error: controlling expressions must have scalar type [204] */ 991.7Srilligvoid while_struct(struct s s) { while (s) return; } 1001.7Srillig/* expect+2: error: controlling expressions must have scalar type [204] */ 1011.7Srillig/* expect+1: warning: end-of-loop code not reached [223] */ 1021.7Srilligvoid for_struct(struct s s) { for (;s;) return; } 1031.7Srillig/* expect+1: error: controlling expressions must have scalar type [204] */ 1041.7Srilligvoid do_while_struct(struct s s) { do { return; } while (s); } 1051.3Srillig 1061.3Srillig/* 1071.3Srillig * C99 6.5.15 for the '?:' operator does not explicitly mention that the 1081.3Srillig * controlling expression must have a scalar type, curiously. 1091.3Srillig */ 1101.9Srillig/* expect+2: error: first operand of '?' must have scalar type [170] */ 1111.7Srillig/* expect+1: warning: function 'conditional_struct' expects to return value [214] */ 1121.7Srilligint conditional_struct(struct s s) { return s ? 1 : 2; } 113