1 1.11 rillig /* $NetBSD: d_c99_bool.c,v 1.11 2023/07/03 09:37:14 rillig Exp $ */ 2 1.5 rillig # 3 "d_c99_bool.c" 3 1.1 rillig 4 1.1 rillig /* 5 1.1 rillig * C99 6.3.1.2 says: "When any scalar value is converted to _Bool, the result 6 1.1 rillig * is 0 if the value compares equal to 0; otherwise the result is 1." 7 1.1 rillig * 8 1.1 rillig * This is different from the other integer types, which get truncated or 9 1.1 rillig * invoke undefined behavior. 10 1.1 rillig */ 11 1.1 rillig 12 1.10 rillig /* lint1-extra-flags: -X 351 */ 13 1.10 rillig 14 1.11 rillig /* expect+1: error: negative array dimension (-2) [20] */ 15 1.11 rillig int int_0[(_Bool)0 ? -1 : -2]; 16 1.1 rillig 17 1.8 rillig /* expect+1: error: negative array dimension (-1) [20] */ 18 1.11 rillig int int_1[(_Bool)1 ? -1 : -2]; 19 1.1 rillig 20 1.8 rillig /* expect+1: error: negative array dimension (-1) [20] */ 21 1.11 rillig int int_2[(_Bool)2 ? -1 : -2]; 22 1.1 rillig 23 1.8 rillig /* expect+1: error: negative array dimension (-1) [20] */ 24 1.11 rillig int int_256[(_Bool)256 ? -1 : -2]; 25 1.1 rillig 26 1.11 rillig /* expect+1: error: negative array dimension (-2) [20] */ 27 1.11 rillig int null_pointer[(_Bool)(void *)0 ? -1 : -2]; 28 1.1 rillig 29 1.5 rillig /* 30 1.11 rillig * XXX: In initializers for global variables, taking the address of a variable 31 1.11 rillig * is allowed and may be modified by a constant offset. This is not a constant 32 1.11 rillig * expression though. 33 1.5 rillig * 34 1.11 rillig * In such a case, the grammar rule array_size_opt calls to_int_constant, which 35 1.11 rillig * returns 1 for the array size without reporting an error. This is why 36 1.11 rillig * neither of the following array declarations generates an error message. 37 1.5 rillig */ 38 1.5 rillig char ch; 39 1.5 rillig int nonnull_pointer_converts_to_false[(_Bool)&ch ? -1 : 1]; 40 1.5 rillig int nonnull_pointer_converts_to_true_[(_Bool)&ch ? 1 : -1]; 41 1.1 rillig 42 1.8 rillig /* expect+1: error: negative array dimension (-1) [20] */ 43 1.11 rillig int double_minus_1_0[(_Bool)-1.0 ? -1 : -2]; 44 1.1 rillig 45 1.8 rillig /* expect+1: error: negative array dimension (-1) [20] */ 46 1.11 rillig int double_minus_0_5[(_Bool)-0.5 ? -1 : -2]; 47 1.1 rillig 48 1.11 rillig /* expect+1: error: negative array dimension (-2) [20] */ 49 1.11 rillig int double_minus_0_0[(_Bool)-0.0 ? -1 : -2]; 50 1.1 rillig 51 1.11 rillig /* expect+1: error: negative array dimension (-2) [20] */ 52 1.11 rillig int double_0_0[(_Bool)0.0 ? -1 : -2]; 53 1.1 rillig 54 1.1 rillig /* The C99 rationale explains in 6.3.1.2 why (_Bool)0.5 is true. */ 55 1.8 rillig /* expect+1: error: negative array dimension (-1) [20] */ 56 1.11 rillig int double_0_5_converts_to_false[(_Bool)0.5 ? -1 : -2]; 57 1.1 rillig 58 1.8 rillig /* expect+1: error: negative array dimension (-1) [20] */ 59 1.11 rillig int double_1_0_converts_to_false[(_Bool)1.0 ? -1 : -2]; 60 1.2 rillig 61 1.2 rillig _Bool 62 1.11 rillig convert_to_bool(int selector) 63 1.2 rillig { 64 1.11 rillig static struct variant { 65 1.11 rillig _Bool b; 66 1.11 rillig char c; 67 1.11 rillig int i; 68 1.11 rillig double d; 69 1.11 rillig enum color { 70 1.11 rillig RED 71 1.11 rillig } e; 72 1.11 rillig const char *pcc; 73 1.11 rillig void (*f)(void); 74 1.11 rillig double _Complex dc; 75 1.11 rillig } v = { .i = 0 }; 76 1.11 rillig 77 1.11 rillig switch (selector) { 78 1.11 rillig case 0: return v.b; 79 1.11 rillig case 1: return v.c; 80 1.11 rillig case 2: return v.i; 81 1.11 rillig case 3: return v.d; 82 1.11 rillig case 4: return v.e; 83 1.11 rillig case 5: return v.pcc; 84 1.11 rillig case 6: return v.f; 85 1.11 rillig case 7: return v.dc; 86 1.11 rillig default: return v.b; 87 1.11 rillig } 88 1.2 rillig } 89