1 /* $NetBSD: expr_fold_strict_bool.c,v 1.2 2021/08/22 21:17:04 rillig Exp $ */ 2 # 3 "expr_fold_strict_bool.c" 3 4 /* 5 * Test constant folding in strict bool mode. 6 * 7 * In this mode, _Bool is not an unsigned integer type. In fact, it is not 8 * an arithmetic type at all. 9 */ 10 11 /* lint1-extra-flags: -T */ 12 /* lint1-only-if: lp64 */ 13 14 typedef long long int64_t; 15 typedef unsigned long long uint64_t; 16 17 struct fold_64_bit { 18 19 _Bool lt_signed_small_ok: -3LL < 1LL ? 1 : -1; 20 /* expect+1: error: illegal bit-field size: 255 [36] */ 21 _Bool lt_signed_small_bad: 1LL < -3LL ? 1 : -1; 22 23 _Bool lt_signed_big_ok: (int64_t)(1ULL << 63) < 1LL ? 1 : -1; 24 /* expect+1: error: illegal bit-field size: 255 [36] */ 25 _Bool lt_signed_big_bad: 1LL < (int64_t)(1ULL << 63) ? 1 : -1; 26 27 _Bool lt_unsigned_small_ok: 1ULL < 3ULL ? 1 : -1; 28 /* expect+1: error: illegal bit-field size: 255 [36] */ 29 _Bool lt_unsigned_small_bad: 3ULL < 1ULL ? 1 : -1; 30 31 /* 32 * Before tree.c 1.345 from 2021-08-22, lint wrongly assumed that the 33 * result of all binary operators were the common arithmetic type, 34 * but that was wrong for the comparison operators. The expression 35 * '1ULL < 2ULL' does not have type 'unsigned long long' but 'int' in 36 * default mode, or '_Bool' in strict bool mode. 37 */ 38 _Bool lt_unsigned_big_ok: 1ULL < 1ULL << 63 ? 1 : -1; 39 /* expect+1: error: illegal bit-field size: 255 [36] */ 40 _Bool lt_unsigned_big_bad: 1ULL << 63 < 1ULL ? 1 : -1; 41 }; 42