1 1.10 rillig /* $NetBSD: d_c99_bool.c,v 1.10 2023/03/28 14:44:34 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.7 rillig /* Below, each false statement produces "negative array dimension" [20]. */ 15 1.1 rillig 16 1.1 rillig int int_0_converts_to_false[(_Bool)0 ? -1 : 1]; 17 1.8 rillig /* expect+1: error: negative array dimension (-1) [20] */ 18 1.8 rillig int int_0_converts_to_true_[(_Bool)0 ? 1 : -1]; 19 1.1 rillig 20 1.8 rillig /* expect+1: error: negative array dimension (-1) [20] */ 21 1.8 rillig int int_1_converts_to_false[(_Bool)1 ? -1 : 1]; 22 1.1 rillig int int_1_converts_to_true_[(_Bool)1 ? 1 : -1]; 23 1.1 rillig 24 1.8 rillig /* expect+1: error: negative array dimension (-1) [20] */ 25 1.8 rillig int int_2_converts_to_false[(_Bool)2 ? -1 : 1]; 26 1.1 rillig int int_2_converts_to_true_[(_Bool)2 ? 1 : -1]; 27 1.1 rillig 28 1.8 rillig /* expect+1: error: negative array dimension (-1) [20] */ 29 1.8 rillig int int_256_converts_to_false[(_Bool)256 ? -1 : 1]; 30 1.3 rillig int int_256_converts_to_true_[(_Bool)256 ? 1 : -1]; 31 1.1 rillig 32 1.1 rillig int null_pointer_converts_to_false[(_Bool)(void *)0 ? -1 : 1]; 33 1.8 rillig /* expect+1: error: negative array dimension (-1) [20] */ 34 1.8 rillig int null_pointer_converts_to_true_[(_Bool)(void *)0 ? 1 : -1]; 35 1.1 rillig 36 1.5 rillig /* 37 1.5 rillig * XXX: lint does not treat the address of a global variable as a constant 38 1.5 rillig * expression. This goes against C99 6.6p7 but is probably not too relevant 39 1.5 rillig * in practice. 40 1.5 rillig * 41 1.9 rillig * In such a case, to_int_constant(tn, false) in cgram.y:array_size_opt 42 1.9 rillig * returns 1 for the array size. This is why neither of the following array 43 1.9 rillig * declarations generates an error message. 44 1.5 rillig */ 45 1.5 rillig char ch; 46 1.5 rillig int nonnull_pointer_converts_to_false[(_Bool)&ch ? -1 : 1]; 47 1.5 rillig int nonnull_pointer_converts_to_true_[(_Bool)&ch ? 1 : -1]; 48 1.1 rillig 49 1.8 rillig /* expect+1: error: negative array dimension (-1) [20] */ 50 1.8 rillig int double_minus_1_0_converts_to_false[(_Bool)-1.0 ? -1 : 1]; 51 1.3 rillig int double_minus_1_0_converts_to_true_[(_Bool)-1.0 ? 1 : -1]; 52 1.1 rillig 53 1.8 rillig /* expect+1: error: negative array dimension (-1) [20] */ 54 1.8 rillig int double_minus_0_5_converts_to_false[(_Bool)-0.5 ? -1 : 1]; 55 1.3 rillig int double_minus_0_5_converts_to_true_[(_Bool)-0.5 ? 1 : -1]; 56 1.1 rillig 57 1.1 rillig int double_minus_0_0_converts_to_false[(_Bool)-0.0 ? -1 : 1]; 58 1.8 rillig /* expect+1: error: negative array dimension (-1) [20] */ 59 1.8 rillig int double_minus_0_0_converts_to_true_[(_Bool)-0.0 ? 1 : -1]; 60 1.1 rillig 61 1.1 rillig int double_0_0_converts_to_false[(_Bool)0.0 ? -1 : 1]; 62 1.8 rillig /* expect+1: error: negative array dimension (-1) [20] */ 63 1.8 rillig int double_0_0_converts_to_true_[(_Bool)0.0 ? 1 : -1]; 64 1.1 rillig 65 1.1 rillig /* The C99 rationale explains in 6.3.1.2 why (_Bool)0.5 is true. */ 66 1.8 rillig /* expect+1: error: negative array dimension (-1) [20] */ 67 1.8 rillig int double_0_5_converts_to_false[(_Bool)0.5 ? -1 : 1]; 68 1.3 rillig int double_0_5_converts_to_true_[(_Bool)0.5 ? 1 : -1]; 69 1.1 rillig 70 1.8 rillig /* expect+1: error: negative array dimension (-1) [20] */ 71 1.8 rillig int double_1_0_converts_to_false[(_Bool)1.0 ? -1 : 1]; 72 1.1 rillig int double_1_0_converts_to_true_[(_Bool)1.0 ? 1 : -1]; 73 1.2 rillig 74 1.2 rillig _Bool 75 1.2 rillig bool_to_bool(_Bool b) 76 1.2 rillig { 77 1.2 rillig return b; 78 1.2 rillig } 79 1.2 rillig 80 1.2 rillig _Bool 81 1.2 rillig char_to_bool(char c) 82 1.2 rillig { 83 1.2 rillig return c; 84 1.2 rillig } 85 1.2 rillig 86 1.2 rillig _Bool 87 1.2 rillig int_to_bool(int i) 88 1.2 rillig { 89 1.2 rillig return i; 90 1.2 rillig } 91 1.2 rillig 92 1.2 rillig _Bool 93 1.2 rillig double_to_bool(double d) 94 1.2 rillig { 95 1.2 rillig return d; 96 1.2 rillig } 97 1.2 rillig 98 1.2 rillig enum color { 99 1.2 rillig RED 100 1.2 rillig }; 101 1.2 rillig 102 1.2 rillig _Bool 103 1.2 rillig enum_to_bool(enum color e) 104 1.2 rillig { 105 1.2 rillig return e; 106 1.2 rillig } 107 1.2 rillig 108 1.2 rillig _Bool 109 1.2 rillig pointer_to_bool(const char *p) 110 1.2 rillig { 111 1.4 rillig return p; 112 1.2 rillig } 113 1.2 rillig 114 1.2 rillig _Bool 115 1.2 rillig function_pointer_to_bool(void (*f)(void)) 116 1.2 rillig { 117 1.4 rillig return f; 118 1.2 rillig } 119 1.2 rillig 120 1.2 rillig _Bool 121 1.2 rillig complex_to_bool(double _Complex c) 122 1.2 rillig { 123 1.2 rillig return c; 124 1.2 rillig } 125