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