Home | History | Annotate | Line # | Download | only in lint1
expr_binary.c revision 1.5
      1  1.5  rillig /*	$NetBSD: expr_binary.c,v 1.5 2021/08/01 14:51:41 rillig Exp $	*/
      2  1.1  rillig # 3 "expr_binary.c"
      3  1.1  rillig 
      4  1.1  rillig /*
      5  1.4  rillig  * Test binary operators.
      6  1.1  rillig  */
      7  1.1  rillig 
      8  1.1  rillig /* lint1-only-if: lp64 */
      9  1.1  rillig 
     10  1.1  rillig struct incompatible {		/* just to generate the error message */
     11  1.1  rillig 	int member;
     12  1.1  rillig };
     13  1.1  rillig void sink(struct incompatible);
     14  1.1  rillig 
     15  1.4  rillig /*
     16  1.4  rillig  * Test the usual arithmetic conversions.
     17  1.4  rillig  *
     18  1.4  rillig  * C99 6.3.1.8 "Usual arithmetic conversions"
     19  1.4  rillig  */
     20  1.1  rillig void
     21  1.1  rillig cover_balance(void)
     22  1.1  rillig {
     23  1.4  rillig 	/* expect+1: 'pointer to void' */
     24  1.4  rillig 	sink((void *)0 + 0);
     25  1.4  rillig 
     26  1.4  rillig 	/* expect+1: 'pointer to void' */
     27  1.4  rillig 	sink(0 + (void *)0);
     28  1.4  rillig 
     29  1.1  rillig 	/* expect+1: 'int' */
     30  1.4  rillig 	sink(1 + 1);
     31  1.1  rillig 
     32  1.4  rillig 	/* expect+1: 'const int' */
     33  1.4  rillig 	sink((const int)1 + (volatile int)1);
     34  1.4  rillig 
     35  1.4  rillig 	/* expect+1: 'volatile int' */
     36  1.4  rillig 	sink((volatile int)1 + (const int)1);
     37  1.1  rillig 
     38  1.4  rillig 	long double _Complex cldbl = 0.0;
     39  1.4  rillig 	double _Complex cdbl = 0.0;
     40  1.4  rillig 	float _Complex cflt = 0.0f;
     41  1.4  rillig 	/* expect+1: error: invalid type for _Complex [308] */
     42  1.4  rillig 	_Complex invalid = 0.0;
     43  1.4  rillig 
     44  1.4  rillig 	/* expect+1: 'long double _Complex' */
     45  1.4  rillig 	sink(cldbl + 0);
     46  1.4  rillig 	/* expect+1: 'long double _Complex' */
     47  1.4  rillig 	sink(0 + cldbl);
     48  1.4  rillig 	/* expect+1: 'long double _Complex' */
     49  1.4  rillig 	sink(cldbl + cdbl);
     50  1.4  rillig 	/* expect+1: 'long double _Complex' */
     51  1.4  rillig 	sink(cdbl + cldbl);
     52  1.4  rillig 
     53  1.4  rillig 	/* expect+1: 'double _Complex' */
     54  1.4  rillig 	sink(cdbl + 0);
     55  1.4  rillig 	/* expect+1: 'double _Complex' */
     56  1.4  rillig 	sink(0 + cdbl);
     57  1.4  rillig 	/* expect+1: 'double _Complex' */
     58  1.4  rillig 	sink(cdbl + cflt);
     59  1.4  rillig 	/* expect+1: 'double _Complex' */
     60  1.4  rillig 	sink(cflt + cdbl);
     61  1.4  rillig 
     62  1.4  rillig 	/* expect+1: 'float _Complex' */
     63  1.4  rillig 	sink(cflt + 0);
     64  1.4  rillig 	/* expect+1: 'float _Complex' */
     65  1.4  rillig 	sink(0 + cflt);
     66  1.4  rillig 	/* expect+1: 'float _Complex' */
     67  1.4  rillig 	sink(cflt + (__uint128_t)0);
     68  1.4  rillig 	/* expect+1: 'float _Complex' */
     69  1.4  rillig 	sink((__uint128_t)0 + cflt);
     70  1.4  rillig 
     71  1.4  rillig 	/*
     72  1.4  rillig 	 * The type specifier '_Complex' is only used during parsing, it does
     73  1.4  rillig 	 * not make it to the expression.
     74  1.4  rillig 	 */
     75  1.4  rillig 	/* expect+1: 'double _Complex' */
     76  1.4  rillig 	sink(invalid + 0);
     77  1.4  rillig 
     78  1.4  rillig 	/* expect+1: 'long double' */
     79  1.4  rillig 	sink(0.0L + 0);
     80  1.4  rillig 	/* expect+1: 'long double' */
     81  1.4  rillig 	sink(0 + 0.0L);
     82  1.4  rillig 	/* expect+1: 'long double' */
     83  1.4  rillig 	sink(0.0L + 0.0);
     84  1.4  rillig 	/* expect+1: 'long double' */
     85  1.4  rillig 	sink(0.0 + 0.0L);
     86  1.1  rillig 
     87  1.1  rillig 	/* expect+1: 'double' */
     88  1.4  rillig 	sink(0.0 + 0);
     89  1.4  rillig 	/* expect+1: 'double' */
     90  1.4  rillig 	sink(0 + 0.0);
     91  1.4  rillig 	/* expect+1: 'double' */
     92  1.4  rillig 	sink(0.0 + 0.0f);
     93  1.4  rillig 	/* expect+1: 'double' */
     94  1.4  rillig 	sink(0.0f + 0.0);
     95  1.1  rillig 
     96  1.1  rillig 	/* expect+1: 'float' */
     97  1.4  rillig 	sink(0.0f + 0);
     98  1.4  rillig 	/* expect+1: 'float' */
     99  1.4  rillig 	sink(0 + 0.0f);
    100  1.1  rillig 	/* expect+1: 'float' */
    101  1.4  rillig 	sink(0.0f + (__uint128_t)0);
    102  1.1  rillig 	/* expect+1: 'float' */
    103  1.4  rillig 	sink((__uint128_t)0 + 0.0f);
    104  1.2  rillig 
    105  1.4  rillig 	/* expect+1: 'unsigned long long' */
    106  1.4  rillig 	sink(0ULL + 0);
    107  1.4  rillig 	/* expect+1: 'unsigned long long' */
    108  1.4  rillig 	sink(0 + 0ULL);
    109  1.4  rillig 
    110  1.4  rillig 	/* expect+1: 'unsigned long long' */
    111  1.4  rillig 	sink(0ULL + 0LL);
    112  1.4  rillig 	/* expect+1: 'unsigned long long' */
    113  1.4  rillig 	sink(0LL + 0ULL);
    114  1.4  rillig 
    115  1.4  rillig 	/* If the bit-width is the same, prefer the unsigned variant. */
    116  1.4  rillig 	/* expect+1: 'unsigned long long' */
    117  1.4  rillig 	sink(0UL + 0LL);
    118  1.4  rillig 	/* expect+1: 'unsigned long long' */
    119  1.4  rillig 	sink(0LL + 0UL);
    120  1.5  rillig 
    121  1.5  rillig 	/*
    122  1.5  rillig 	 * Ensure that __int128_t is listed in the integer ranks.  This table
    123  1.5  rillig 	 * only becomes relevant when both operands have the same width.
    124  1.5  rillig 	 */
    125  1.5  rillig 	/* expect+1: '__uint128_t' */
    126  1.5  rillig 	sink((__uint128_t)1 + (__int128_t)1);
    127  1.5  rillig 	/* expect+1: '__uint128_t' */
    128  1.5  rillig 	sink((__int128_t)1 + (__uint128_t)1);
    129  1.1  rillig }
    130