xref: /netbsd-src/tests/usr.bin/xlint/lint1/d_c99_bool.c (revision e5eea854b31bf95dbb1c168e919464b9e30aeabf)
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*e5eea854Srillig convert_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