lex_integer.c revision 1.8
11.8Srillig/*	$NetBSD: lex_integer.c,v 1.8 2021/08/28 20:51:10 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.8Srillig	/* expect+1: passing 'int' */
281.8Srillig	print_type(0);
291.8Srillig	/* The '-' is not part of the constant, it's a unary operator. */
301.8Srillig	/* expect+1: passing 'int' */
311.8Srillig	print_type(-1);
321.8Srillig	/* expect+1: passing 'int' */
331.8Srillig	print_type(2147483647);
341.8Srillig	/* expect+1: passing 'int' */
351.8Srillig	print_type(0x7fffffff);
361.8Srillig
371.8Srillig	/* expect+1: passing 'unsigned int' */
381.8Srillig	print_type(0x80000000);
391.8Srillig	/* expect+1: passing 'unsigned int' */
401.8Srillig	print_type(0xffffffff);
411.8Srillig
421.8Srillig	/* expect+1: passing 'long' */
431.8Srillig	print_type(2147483648);
441.8Srillig	/* expect+1: passing 'long' */
451.8Srillig	print_type(0x0000000100000000);
461.8Srillig	/* expect+1: passing 'long' */
471.8Srillig	print_type(0x7fffffffffffffff);
481.8Srillig
491.8Srillig	/* expect+1: passing 'unsigned long' */
501.8Srillig	print_type(0x8000000000000000);
511.8Srillig	/* expect+1: passing 'unsigned long' */
521.8Srillig	print_type(0xffffffffffffffff);
531.8Srillig
541.8Srillig	/* expect+2: warning: integer constant out of range [252] */
551.8Srillig	/* expect+1: warning: passing 'unsigned long' */
561.8Srillig	print_type(0x00010000000000000000);
571.8Srillig}
581.1Srillig
591.8Srilligvoid
601.8Srilligsuffix_u(void)
611.8Srillig{
621.8Srillig	/* expect+1: passing 'unsigned int' */
631.8Srillig	print_type(3U);
641.8Srillig	/* expect+1: passing 'unsigned int' */
651.8Srillig	print_type(3u);
661.8Srillig
671.8Srillig	/* expect+1: passing 'unsigned int' */
681.8Srillig	print_type(4294967295U);
691.8Srillig	/* expect+1: passing 'unsigned long' */
701.8Srillig	print_type(4294967296U);
711.8Srillig}
721.1Srillig
731.8Srilligvoid
741.8Srilligsuffix_l(void)
751.8Srillig{
761.8Srillig	/* expect+1: passing 'long' */
771.8Srillig	print_type(3L);
781.1Srillig
791.8Srillig	/* expect+1: passing 'long' */
801.8Srillig	print_type(3l);
811.8Srillig}
821.1Srillig
831.8Srilligvoid
841.8Srilligsuffix_ul(void)
851.8Srillig{
861.8Srillig	/* expect+1: passing 'unsigned long' */
871.8Srillig	print_type(3UL);
881.8Srillig	/* expect+1: passing 'unsigned long' */
891.8Srillig	print_type(3LU);
901.1Srillig}
911.1Srillig
921.1Srilligvoid
931.8Srilligsuffix_ll(void)
941.1Srillig{
951.8Srillig	/* expect+1: passing 'long long' */
961.8Srillig	print_type(3LL);
971.1Srillig
981.8Srillig	/* The 'Ll' must not use mixed case. Checked by the compiler. */
991.8Srillig	/* expect+1: passing 'long long' */
1001.8Srillig	print_type(3Ll);
1011.1Srillig
1021.8Srillig	/* expect+1: passing 'long long' */
1031.8Srillig	print_type(3ll);
1041.1Srillig}
1051.5Srillig
1061.5Srilligvoid
1071.8Srilligsuffix_ull(void)
1081.5Srillig{
1091.8Srillig	/* expect+1: passing 'unsigned long long' */
1101.8Srillig	print_type(3llu);
1111.8Srillig	/* expect+1: passing 'unsigned long long' */
1121.8Srillig	print_type(3Ull);
1131.5Srillig
1141.5Srillig	/* The 'LL' must not be split. Checked by the compiler. */
1151.8Srillig	/* expect+1: passing 'unsigned long long' */
1161.8Srillig	print_type(3lul);
1171.8Srillig
1181.8Srillig	/* The 'Ll' must not use mixed case. Checked by the compiler. */
1191.8Srillig	/* expect+1: passing 'unsigned long long' */
1201.8Srillig	print_type(3ULl);
1211.8Srillig}
1221.8Srillig
1231.8Srilligvoid
1241.8Srilligsuffix_too_many(void)
1251.8Srillig{
1261.8Srillig	/* expect+2: warning: malformed integer constant [251] */
1271.8Srillig	/* expect+1: passing 'long long' */
1281.8Srillig	print_type(3LLL);
1291.8Srillig
1301.8Srillig	/* expect+2: warning: malformed integer constant [251] */
1311.8Srillig	/* expect+1: passing 'unsigned int' */
1321.8Srillig	print_type(3uu);
1331.5Srillig}
1341.6Srillig
1351.6Srillig/* https://gcc.gnu.org/onlinedocs/gcc/Binary-constants.html */
1361.6Srilligvoid
1371.6Srilligbinary_literal(void)
1381.6Srillig{
1391.8Srillig	/* This is a GCC extension, but lint doesn't know that. */
1401.8Srillig	/* expect+1: passing 'int' */
1411.8Srillig	print_type(0b1111000001011010);
1421.8Srillig
1431.8Srillig	/* expect+1: passing 'unsigned int' */
1441.8Srillig	print_type(0b11110000111100001111000011110000);
1451.6Srillig}
146