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