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