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