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