1 /* $NetBSD: lex_integer.c,v 1.11 2023/03/28 14:44:34 rillig Exp $ */ 2 # 3 "lex_integer.c" 3 4 /* 5 * Tests for lexical analysis of integer constants. 6 * 7 * C99 6.4.4.1 "Integer constants" 8 */ 9 10 /* lint1-only-if: lp64 */ 11 /* lint1-extra-flags: -X 351 */ 12 13 long signed_long; 14 unsigned long long unsigned_long_long_var; 15 16 struct s { 17 int member; 18 }; 19 /* 20 * When lint tries to convert the argument to 'struct s', it prints the 21 * actual type of the argument as a side effect. 22 */ 23 void print_type(struct s); 24 25 void no_suffix(void)26no_suffix(void) 27 { 28 /* expect+1: ... passing 'int' ... */ 29 print_type(0); 30 /* The '-' is not part of the constant, it is a unary operator. */ 31 /* expect+1: ... passing 'int' ... */ 32 print_type(-1); 33 34 /* expect+1: ... passing 'int' ... */ 35 print_type(2147483647); 36 /* expect+1: ... passing 'int' ... */ 37 print_type(0x7fffffff); 38 /* expect+1: ... passing 'int' ... */ 39 print_type(017777777777); 40 41 /* expect+1: ... passing 'unsigned int' ... */ 42 print_type(0x80000000); 43 /* expect+1: ... passing 'unsigned int' ... */ 44 print_type(020000000000); 45 /* expect+1: ... passing 'unsigned int' ... */ 46 print_type(0xffffffff); 47 48 /* expect+1: ... passing 'long' ... */ 49 print_type(2147483648); 50 /* expect+1: ... passing 'long' ... */ 51 print_type(0x0000000100000000); 52 /* expect+1: ... passing 'long' ... */ 53 print_type(0x7fffffffffffffff); 54 55 /* expect+1: ... passing 'unsigned long' ... */ 56 print_type(0x8000000000000000); 57 /* expect+1: ... passing 'unsigned long' ... */ 58 print_type(0xffffffffffffffff); 59 60 /* expect+2: warning: integer constant out of range [252] */ 61 /* expect+1: ... passing 'unsigned long' ... */ 62 print_type(0x00010000000000000000); 63 } 64 65 void suffix_u(void)66suffix_u(void) 67 { 68 /* expect+1: ... passing 'unsigned int' ... */ 69 print_type(3U); 70 /* expect+1: ... passing 'unsigned int' ... */ 71 print_type(3u); 72 73 /* expect+1: ... passing 'unsigned int' ... */ 74 print_type(4294967295U); 75 /* expect+1: ... passing 'unsigned long' ... */ 76 print_type(4294967296U); 77 } 78 79 void suffix_l(void)80suffix_l(void) 81 { 82 /* expect+1: ... passing 'long' ... */ 83 print_type(3L); 84 85 /* expect+1: ... passing 'long' ... */ 86 print_type(3l); 87 } 88 89 void suffix_ul(void)90suffix_ul(void) 91 { 92 /* expect+1: ... passing 'unsigned long' ... */ 93 print_type(3UL); 94 /* expect+1: ... passing 'unsigned long' ... */ 95 print_type(3LU); 96 } 97 98 void suffix_ll(void)99suffix_ll(void) 100 { 101 /* expect+1: ... passing 'long long' ... */ 102 print_type(3LL); 103 104 /* The 'Ll' must not use mixed case. Checked by the compiler. */ 105 /* expect+1: ... passing 'long long' ... */ 106 print_type(3Ll); 107 108 /* expect+1: ... passing 'long long' ... */ 109 print_type(3ll); 110 } 111 112 void suffix_ull(void)113suffix_ull(void) 114 { 115 /* expect+1: ... passing 'unsigned long long' ... */ 116 print_type(3llu); 117 /* expect+1: ... passing 'unsigned long long' ... */ 118 print_type(3Ull); 119 120 /* The 'LL' must not be split. Checked by the compiler. */ 121 /* expect+1: ... passing 'unsigned long long' ... */ 122 print_type(3lul); 123 124 /* The 'Ll' must not use mixed case. Checked by the compiler. */ 125 /* expect+1: ... passing 'unsigned long long' ... */ 126 print_type(3ULl); 127 } 128 129 void suffix_too_many(void)130suffix_too_many(void) 131 { 132 /* expect+2: warning: malformed integer constant [251] */ 133 /* expect+1: ... passing 'long long' ... */ 134 print_type(3LLL); 135 136 /* expect+2: warning: malformed integer constant [251] */ 137 /* expect+1: ... passing 'unsigned int' ... */ 138 print_type(3uu); 139 } 140 141 /* https://gcc.gnu.org/onlinedocs/gcc/Binary-constants.html */ 142 void binary_literal(void)143binary_literal(void) 144 { 145 /* This is a GCC extension, but lint doesn't know that. */ 146 /* expect+1: ... passing 'int' ... */ 147 print_type(0b1111000001011010); 148 149 /* expect+1: ... passing 'unsigned int' ... */ 150 print_type(0b11110000111100001111000011110000); 151 } 152