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