1 1.1 rillig # 2 "d_fold_test.c" 2 1.1 rillig 3 1.1 rillig /* 4 1.1 rillig * Test how expressions are handled in a context where they are tested for 5 1.1 rillig * truthiness, such as in the condition of an if statement. 6 1.1 rillig */ 7 1.1 rillig 8 1.6 rillig /* lint1-extra-flags: -X 351 */ 9 1.6 rillig 10 1.1 rillig struct s { 11 1.1 rillig int member; 12 1.1 rillig }; 13 1.1 rillig 14 1.1 rillig union u { 15 1.1 rillig int member; 16 1.1 rillig }; 17 1.1 rillig 18 1.1 rillig enum e { 19 1.1 rillig E 20 1.1 rillig }; 21 1.1 rillig 22 1.1 rillig struct arr { 23 1.1 rillig int arr[4]; 24 1.1 rillig }; 25 1.1 rillig 26 1.1 rillig /* C99 6.2.5p2 */ 27 1.1 rillig void if_Bool(_Bool b) { if (b) return; } 28 1.1 rillig 29 1.1 rillig /* C99 6.2.5p3 */ 30 1.1 rillig void if_char(char c) { if (c) return; } 31 1.1 rillig 32 1.1 rillig /* C99 6.2.5p4 */ 33 1.1 rillig void if_signed_char(signed char sc) { if (sc) return; } 34 1.1 rillig void if_short_int(short s) { if (s) return; } 35 1.1 rillig void if_int(int i) { if (i) return; } 36 1.1 rillig void if_long_int(long int l) { if (l) return; } 37 1.1 rillig void if_long_long_int(long long int ll) { if (ll) return; } 38 1.1 rillig 39 1.1 rillig /* C99 6.2.5p6 */ 40 1.1 rillig void if_unsigned_char(unsigned char uc) { if (uc) return; } 41 1.1 rillig void if_unsigned_short_int(unsigned short us) { if (us) return; } 42 1.1 rillig void if_unsigned_int(unsigned int ui) { if (ui) return; } 43 1.1 rillig void if_unsigned_long_int(unsigned long int ul) { if (ul) return; } 44 1.1 rillig void if_unsigned_long_long_int(unsigned long long int ull) { if (ull) return; } 45 1.1 rillig 46 1.1 rillig /* C99 6.2.5p10 */ 47 1.1 rillig void if_float(float f) { if (f) return; } 48 1.1 rillig void if_double(double d) { if (d) return; } 49 1.1 rillig void if_long_double(long double ld) { if (ld) return; } 50 1.1 rillig 51 1.1 rillig /* C99 6.2.5p11 */ 52 1.1 rillig void if_float_Complex(float _Complex fc) { if (fc) return; } 53 1.1 rillig void if_double_Complex(double _Complex dc) { if (dc) return; } 54 1.1 rillig void if_long_double_Complex(long double _Complex ldc) { if (ldc) return; } 55 1.1 rillig 56 1.1 rillig /* C99 6.2.5p16 */ 57 1.1 rillig void if_enum(enum e e) { if (e) return; } 58 1.1 rillig 59 1.1 rillig /* C99 6.2.5p20 */ 60 1.1 rillig void if_array(struct arr arr) { if (arr.arr) return; } 61 1.5 rillig /* expect+2: error: controlling expressions must have scalar type [204] */ 62 1.7 rillig /* expect+1: warning: parameter 's' unused in function 'if_struct' [231] */ 63 1.5 rillig void if_struct(struct s s) { if (s) return; } 64 1.5 rillig /* expect+2: error: controlling expressions must have scalar type [204] */ 65 1.7 rillig /* expect+1: warning: parameter 'u' unused in function 'if_union' [231] */ 66 1.5 rillig void if_union(union u u) { if (u) return; } 67 1.2 rillig void if_function(void) { if (if_function) return; } 68 1.1 rillig void if_pointer(void *p) { if (p) return; } 69 1.1 rillig 70 1.1 rillig /* C99 6.8.5 */ 71 1.5 rillig /* expect+2: error: controlling expressions must have scalar type [204] */ 72 1.7 rillig /* expect+1: warning: parameter 's' unused in function 'while_struct' [231] */ 73 1.5 rillig void while_struct(struct s s) { while (s) return; } 74 1.5 rillig /* expect+3: error: controlling expressions must have scalar type [204] */ 75 1.5 rillig /* expect+2: warning: end-of-loop code not reached [223] */ 76 1.7 rillig /* expect+1: warning: parameter 's' unused in function 'for_struct' [231] */ 77 1.5 rillig void for_struct(struct s s) { for (;s;) return; } 78 1.5 rillig /* expect+2: error: controlling expressions must have scalar type [204] */ 79 1.7 rillig /* expect+1: warning: parameter 's' unused in function 'do_while_struct' [231] */ 80 1.5 rillig void do_while_struct(struct s s) { do { return; } while (s); } 81 1.1 rillig 82 1.1 rillig /* C99 6.5.15 does not require a scalar type, curiously. */ 83 1.7 rillig /* expect+3: error: first operand of '?' must have scalar type [170] */ 84 1.8 rillig /* expect+2: error: function 'conditional_struct' expects to return value [214] */ 85 1.7 rillig /* expect+1: warning: parameter 's' unused in function 'conditional_struct' [231] */ 86 1.5 rillig int conditional_struct(struct s s) { return s ? 1 : 2; } 87