1 1.2 rillig /* $NetBSD: d_c99_bool.c,v 1.2 2021/01/10 12:29:46 rillig Exp $ */ 2 1.1 rillig # 3 "d_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.1 rillig /* Below, the wrong assertions produce warning 20. */ 13 1.1 rillig 14 1.1 rillig int int_0_converts_to_false[(_Bool)0 ? -1 : 1]; 15 1.1 rillig int int_0_converts_to_true_[(_Bool)0 ? 1 : -1]; 16 1.1 rillig 17 1.1 rillig int int_1_converts_to_false[(_Bool)1 ? -1 : 1]; 18 1.1 rillig int int_1_converts_to_true_[(_Bool)1 ? 1 : -1]; 19 1.1 rillig 20 1.1 rillig int int_2_converts_to_false[(_Bool)2 ? -1 : 1]; 21 1.1 rillig int int_2_converts_to_true_[(_Bool)2 ? 1 : -1]; 22 1.1 rillig 23 1.1 rillig int int_256_converts_to_false[(_Bool)256 ? -1 : 1]; // FIXME 24 1.1 rillig int int_256_converts_to_true_[(_Bool)256 ? 1 : -1]; // FIXME 25 1.1 rillig 26 1.1 rillig int null_pointer_converts_to_false[(_Bool)(void *)0 ? -1 : 1]; 27 1.1 rillig int null_pointer_converts_to_true_[(_Bool)(void *)0 ? 1 : -1]; 28 1.1 rillig 29 1.1 rillig int nonnull_pointer_converts_to_false[(_Bool)"not null" ? -1 : 1]; // FIXME 133 30 1.1 rillig int nonnull_pointer_converts_to_true_[(_Bool)"not null" ? 1 : -1]; // FIXME 133 31 1.1 rillig 32 1.1 rillig int double_minus_1_0_converts_to_false[(_Bool)-1.0 ? -1 : 1]; // FIXME 119 33 1.1 rillig int double_minus_1_0_converts_to_true_[(_Bool)-1.0 ? 1 : -1]; // FIXME 20, 119 34 1.1 rillig 35 1.1 rillig int double_minus_0_5_converts_to_false[(_Bool)-0.5 ? -1 : 1]; // FIXME 119 36 1.1 rillig int double_minus_0_5_converts_to_true_[(_Bool)-0.5 ? 1 : -1]; // FIXME 20, 119 37 1.1 rillig 38 1.1 rillig int double_minus_0_0_converts_to_false[(_Bool)-0.0 ? -1 : 1]; 39 1.1 rillig int double_minus_0_0_converts_to_true_[(_Bool)-0.0 ? 1 : -1]; 40 1.1 rillig 41 1.1 rillig int double_0_0_converts_to_false[(_Bool)0.0 ? -1 : 1]; 42 1.1 rillig int double_0_0_converts_to_true_[(_Bool)0.0 ? 1 : -1]; 43 1.1 rillig 44 1.1 rillig /* The C99 rationale explains in 6.3.1.2 why (_Bool)0.5 is true. */ 45 1.1 rillig int double_0_5_converts_to_false[(_Bool)0.5 ? -1 : 1]; // FIXME 20 46 1.1 rillig int double_0_5_converts_to_true_[(_Bool)0.5 ? 1 : -1]; // FIXME 20 47 1.1 rillig 48 1.1 rillig int double_1_0_converts_to_false[(_Bool)1.0 ? -1 : 1]; 49 1.1 rillig int double_1_0_converts_to_true_[(_Bool)1.0 ? 1 : -1]; 50 1.2 rillig 51 1.2 rillig _Bool 52 1.2 rillig bool_to_bool(_Bool b) 53 1.2 rillig { 54 1.2 rillig return b; 55 1.2 rillig } 56 1.2 rillig 57 1.2 rillig _Bool 58 1.2 rillig char_to_bool(char c) 59 1.2 rillig { 60 1.2 rillig return c; 61 1.2 rillig } 62 1.2 rillig 63 1.2 rillig _Bool 64 1.2 rillig int_to_bool(int i) 65 1.2 rillig { 66 1.2 rillig return i; 67 1.2 rillig } 68 1.2 rillig 69 1.2 rillig _Bool 70 1.2 rillig double_to_bool(double d) 71 1.2 rillig { 72 1.2 rillig return d; 73 1.2 rillig } 74 1.2 rillig 75 1.2 rillig enum color { 76 1.2 rillig RED 77 1.2 rillig }; 78 1.2 rillig 79 1.2 rillig _Bool 80 1.2 rillig enum_to_bool(enum color e) 81 1.2 rillig { 82 1.2 rillig return e; 83 1.2 rillig } 84 1.2 rillig 85 1.2 rillig _Bool 86 1.2 rillig pointer_to_bool(const char *p) 87 1.2 rillig { 88 1.2 rillig return p; // FIXME 183 89 1.2 rillig } 90 1.2 rillig 91 1.2 rillig _Bool 92 1.2 rillig function_pointer_to_bool(void (*f)(void)) 93 1.2 rillig { 94 1.2 rillig return f; // FIXME 183 95 1.2 rillig } 96 1.2 rillig 97 1.2 rillig _Bool 98 1.2 rillig complex_to_bool(double _Complex c) 99 1.2 rillig { 100 1.2 rillig return c; 101 1.2 rillig } 102