lex_integer.c revision 1.10
11.10Srillig/*	$NetBSD: lex_integer.c,v 1.10 2022/06/17 18:54:53 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.2Srillig
121.8Srilliglong signed_long;
131.8Srilligunsigned long long unsigned_long_long_var;
141.8Srillig
151.8Srilligstruct s {
161.8Srillig	int member;
171.8Srillig};
181.8Srillig/*
191.8Srillig * When lint tries to convert the argument to 'struct s', it prints the
201.8Srillig * actual type of the argument as a side effect.
211.8Srillig */
221.8Srilligvoid print_type(struct s);
231.1Srillig
241.1Srilligvoid
251.8Srilligno_suffix(void)
261.1Srillig{
271.10Srillig	/* expect+1: ... passing 'int' ... */
281.8Srillig	print_type(0);
291.9Srillig	/* The '-' is not part of the constant, it is a unary operator. */
301.10Srillig	/* expect+1: ... passing 'int' ... */
311.8Srillig	print_type(-1);
321.9Srillig
331.10Srillig	/* expect+1: ... passing 'int' ... */
341.8Srillig	print_type(2147483647);
351.10Srillig	/* expect+1: ... passing 'int' ... */
361.8Srillig	print_type(0x7fffffff);
371.10Srillig	/* expect+1: ... passing 'int' ... */
381.9Srillig	print_type(017777777777);
391.8Srillig
401.10Srillig	/* expect+1: ... passing 'unsigned int' ... */
411.8Srillig	print_type(0x80000000);
421.10Srillig	/* expect+1: ... passing 'unsigned int' ... */
431.9Srillig	print_type(020000000000);
441.10Srillig	/* expect+1: ... passing 'unsigned int' ... */
451.8Srillig	print_type(0xffffffff);
461.8Srillig
471.10Srillig	/* expect+1: ... passing 'long' ... */
481.8Srillig	print_type(2147483648);
491.10Srillig	/* expect+1: ... passing 'long' ... */
501.8Srillig	print_type(0x0000000100000000);
511.10Srillig	/* expect+1: ... passing 'long' ... */
521.8Srillig	print_type(0x7fffffffffffffff);
531.8Srillig
541.10Srillig	/* expect+1: ... passing 'unsigned long' ... */
551.8Srillig	print_type(0x8000000000000000);
561.10Srillig	/* expect+1: ... passing 'unsigned long' ... */
571.8Srillig	print_type(0xffffffffffffffff);
581.8Srillig
591.8Srillig	/* expect+2: warning: integer constant out of range [252] */
601.10Srillig	/* expect+1: ... passing 'unsigned long' ... */
611.8Srillig	print_type(0x00010000000000000000);
621.8Srillig}
631.1Srillig
641.8Srilligvoid
651.8Srilligsuffix_u(void)
661.8Srillig{
671.10Srillig	/* expect+1: ... passing 'unsigned int' ... */
681.8Srillig	print_type(3U);
691.10Srillig	/* expect+1: ... passing 'unsigned int' ... */
701.8Srillig	print_type(3u);
711.8Srillig
721.10Srillig	/* expect+1: ... passing 'unsigned int' ... */
731.8Srillig	print_type(4294967295U);
741.10Srillig	/* expect+1: ... passing 'unsigned long' ... */
751.8Srillig	print_type(4294967296U);
761.8Srillig}
771.1Srillig
781.8Srilligvoid
791.8Srilligsuffix_l(void)
801.8Srillig{
811.10Srillig	/* expect+1: ... passing 'long' ... */
821.8Srillig	print_type(3L);
831.1Srillig
841.10Srillig	/* expect+1: ... passing 'long' ... */
851.8Srillig	print_type(3l);
861.8Srillig}
871.1Srillig
881.8Srilligvoid
891.8Srilligsuffix_ul(void)
901.8Srillig{
911.10Srillig	/* expect+1: ... passing 'unsigned long' ... */
921.8Srillig	print_type(3UL);
931.10Srillig	/* expect+1: ... passing 'unsigned long' ... */
941.8Srillig	print_type(3LU);
951.1Srillig}
961.1Srillig
971.1Srilligvoid
981.8Srilligsuffix_ll(void)
991.1Srillig{
1001.10Srillig	/* expect+1: ... passing 'long long' ... */
1011.8Srillig	print_type(3LL);
1021.1Srillig
1031.8Srillig	/* The 'Ll' must not use mixed case. Checked by the compiler. */
1041.10Srillig	/* expect+1: ... passing 'long long' ... */
1051.8Srillig	print_type(3Ll);
1061.1Srillig
1071.10Srillig	/* expect+1: ... passing 'long long' ... */
1081.8Srillig	print_type(3ll);
1091.1Srillig}
1101.5Srillig
1111.5Srilligvoid
1121.8Srilligsuffix_ull(void)
1131.5Srillig{
1141.10Srillig	/* expect+1: ... passing 'unsigned long long' ... */
1151.8Srillig	print_type(3llu);
1161.10Srillig	/* expect+1: ... passing 'unsigned long long' ... */
1171.8Srillig	print_type(3Ull);
1181.5Srillig
1191.5Srillig	/* The 'LL' must not be split. Checked by the compiler. */
1201.10Srillig	/* expect+1: ... passing 'unsigned long long' ... */
1211.8Srillig	print_type(3lul);
1221.8Srillig
1231.8Srillig	/* The 'Ll' must not use mixed case. Checked by the compiler. */
1241.10Srillig	/* expect+1: ... passing 'unsigned long long' ... */
1251.8Srillig	print_type(3ULl);
1261.8Srillig}
1271.8Srillig
1281.8Srilligvoid
1291.8Srilligsuffix_too_many(void)
1301.8Srillig{
1311.8Srillig	/* expect+2: warning: malformed integer constant [251] */
1321.10Srillig	/* expect+1: ... passing 'long long' ... */
1331.8Srillig	print_type(3LLL);
1341.8Srillig
1351.8Srillig	/* expect+2: warning: malformed integer constant [251] */
1361.10Srillig	/* expect+1: ... passing 'unsigned int' ... */
1371.8Srillig	print_type(3uu);
1381.5Srillig}
1391.6Srillig
1401.6Srillig/* https://gcc.gnu.org/onlinedocs/gcc/Binary-constants.html */
1411.6Srilligvoid
1421.6Srilligbinary_literal(void)
1431.6Srillig{
1441.8Srillig	/* This is a GCC extension, but lint doesn't know that. */
1451.10Srillig	/* expect+1: ... passing 'int' ... */
1461.8Srillig	print_type(0b1111000001011010);
1471.8Srillig
1481.10Srillig	/* expect+1: ... passing 'unsigned int' ... */
1491.8Srillig	print_type(0b11110000111100001111000011110000);
1501.6Srillig}
151