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