11.11Srillig/*	$NetBSD: lex_integer.c,v 1.11 2023/03/28 14:44:34 rillig Exp $	*/
21.1Srillig# 3 "lex_integer.c"
31.1Srillig
41.1Srillig/*
51.1Srillig * Tests for lexical analysis of integer constants.
61.1Srillig *
71.1Srillig * C99 6.4.4.1 "Integer constants"
81.1Srillig */
91.1Srillig
101.7Srillig/* lint1-only-if: lp64 */
111.11Srillig/* lint1-extra-flags: -X 351 */
121.2Srillig
131.8Srilliglong signed_long;
141.8Srilligunsigned long long unsigned_long_long_var;
151.8Srillig
161.8Srilligstruct s {
171.8Srillig	int member;
181.8Srillig};
191.8Srillig/*
201.8Srillig * When lint tries to convert the argument to 'struct s', it prints the
211.8Srillig * actual type of the argument as a side effect.
221.8Srillig */
231.8Srilligvoid print_type(struct s);
241.1Srillig
251.1Srilligvoid
261.8Srilligno_suffix(void)
271.1Srillig{
281.10Srillig	/* expect+1: ... passing 'int' ... */
291.8Srillig	print_type(0);
301.9Srillig	/* The '-' is not part of the constant, it is a unary operator. */
311.10Srillig	/* expect+1: ... passing 'int' ... */
321.8Srillig	print_type(-1);
331.9Srillig
341.10Srillig	/* expect+1: ... passing 'int' ... */
351.8Srillig	print_type(2147483647);
361.10Srillig	/* expect+1: ... passing 'int' ... */
371.8Srillig	print_type(0x7fffffff);
381.10Srillig	/* expect+1: ... passing 'int' ... */
391.9Srillig	print_type(017777777777);
401.8Srillig
411.10Srillig	/* expect+1: ... passing 'unsigned int' ... */
421.8Srillig	print_type(0x80000000);
431.10Srillig	/* expect+1: ... passing 'unsigned int' ... */
441.9Srillig	print_type(020000000000);
451.10Srillig	/* expect+1: ... passing 'unsigned int' ... */
461.8Srillig	print_type(0xffffffff);
471.8Srillig
481.10Srillig	/* expect+1: ... passing 'long' ... */
491.8Srillig	print_type(2147483648);
501.10Srillig	/* expect+1: ... passing 'long' ... */
511.8Srillig	print_type(0x0000000100000000);
521.10Srillig	/* expect+1: ... passing 'long' ... */
531.8Srillig	print_type(0x7fffffffffffffff);
541.8Srillig
551.10Srillig	/* expect+1: ... passing 'unsigned long' ... */
561.8Srillig	print_type(0x8000000000000000);
571.10Srillig	/* expect+1: ... passing 'unsigned long' ... */
581.8Srillig	print_type(0xffffffffffffffff);
591.8Srillig
601.8Srillig	/* expect+2: warning: integer constant out of range [252] */
611.10Srillig	/* expect+1: ... passing 'unsigned long' ... */
621.8Srillig	print_type(0x00010000000000000000);
631.8Srillig}
641.1Srillig
651.8Srilligvoid
661.8Srilligsuffix_u(void)
671.8Srillig{
681.10Srillig	/* expect+1: ... passing 'unsigned int' ... */
691.8Srillig	print_type(3U);
701.10Srillig	/* expect+1: ... passing 'unsigned int' ... */
711.8Srillig	print_type(3u);
721.8Srillig
731.10Srillig	/* expect+1: ... passing 'unsigned int' ... */
741.8Srillig	print_type(4294967295U);
751.10Srillig	/* expect+1: ... passing 'unsigned long' ... */
761.8Srillig	print_type(4294967296U);
771.8Srillig}
781.1Srillig
791.8Srilligvoid
801.8Srilligsuffix_l(void)
811.8Srillig{
821.10Srillig	/* expect+1: ... passing 'long' ... */
831.8Srillig	print_type(3L);
841.1Srillig
851.10Srillig	/* expect+1: ... passing 'long' ... */
861.8Srillig	print_type(3l);
871.8Srillig}
881.1Srillig
891.8Srilligvoid
901.8Srilligsuffix_ul(void)
911.8Srillig{
921.10Srillig	/* expect+1: ... passing 'unsigned long' ... */
931.8Srillig	print_type(3UL);
941.10Srillig	/* expect+1: ... passing 'unsigned long' ... */
951.8Srillig	print_type(3LU);
961.1Srillig}
971.1Srillig
981.1Srilligvoid
991.8Srilligsuffix_ll(void)
1001.1Srillig{
1011.10Srillig	/* expect+1: ... passing 'long long' ... */
1021.8Srillig	print_type(3LL);
1031.1Srillig
1041.8Srillig	/* The 'Ll' must not use mixed case. Checked by the compiler. */
1051.10Srillig	/* expect+1: ... passing 'long long' ... */
1061.8Srillig	print_type(3Ll);
1071.1Srillig
1081.10Srillig	/* expect+1: ... passing 'long long' ... */
1091.8Srillig	print_type(3ll);
1101.1Srillig}
1111.5Srillig
1121.5Srilligvoid
1131.8Srilligsuffix_ull(void)
1141.5Srillig{
1151.10Srillig	/* expect+1: ... passing 'unsigned long long' ... */
1161.8Srillig	print_type(3llu);
1171.10Srillig	/* expect+1: ... passing 'unsigned long long' ... */
1181.8Srillig	print_type(3Ull);
1191.5Srillig
1201.5Srillig	/* The 'LL' must not be split. Checked by the compiler. */
1211.10Srillig	/* expect+1: ... passing 'unsigned long long' ... */
1221.8Srillig	print_type(3lul);
1231.8Srillig
1241.8Srillig	/* The 'Ll' must not use mixed case. Checked by the compiler. */
1251.10Srillig	/* expect+1: ... passing 'unsigned long long' ... */
1261.8Srillig	print_type(3ULl);
1271.8Srillig}
1281.8Srillig
1291.8Srilligvoid
1301.8Srilligsuffix_too_many(void)
1311.8Srillig{
1321.8Srillig	/* expect+2: warning: malformed integer constant [251] */
1331.10Srillig	/* expect+1: ... passing 'long long' ... */
1341.8Srillig	print_type(3LLL);
1351.8Srillig
1361.8Srillig	/* expect+2: warning: malformed integer constant [251] */
1371.10Srillig	/* expect+1: ... passing 'unsigned int' ... */
1381.8Srillig	print_type(3uu);
1391.5Srillig}
1401.6Srillig
1411.6Srillig/* https://gcc.gnu.org/onlinedocs/gcc/Binary-constants.html */
1421.6Srilligvoid
1431.6Srilligbinary_literal(void)
1441.6Srillig{
1451.8Srillig	/* This is a GCC extension, but lint doesn't know that. */
1461.10Srillig	/* expect+1: ... passing 'int' ... */
1471.8Srillig	print_type(0b1111000001011010);
1481.8Srillig
1491.10Srillig	/* expect+1: ... passing 'unsigned int' ... */
1501.8Srillig	print_type(0b11110000111100001111000011110000);
1511.6Srillig}
152