1b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// RUN: %clang_cc1 -DX32TYPE=ULONG -triple powerpc-unknown-linux-gnu -std=c89 -x c %s -verify
2b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// RUN: %clang_cc1 -DX32TYPE=ULONG -triple powerpc-unknown-linux-gnu -std=iso9899:199409 -x c %s -verify
3b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// RUN: %clang_cc1 -DX32TYPE=ULONG -triple powerpc-unknown-linux-gnu -std=c++98 -x c++ %s -verify
4b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// RUN: %clang_cc1 -DX32TYPE=LLONG -triple powerpc-unknown-linux-gnu -std=c99 -x c %s -verify
5b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// RUN: %clang_cc1 -DX32TYPE=LLONG -triple powerpc-unknown-linux-gnu -std=c11 -x c %s -verify
6b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// RUN: %clang_cc1 -DX32TYPE=LLONG -triple powerpc-unknown-linux-gnu -std=c++11 -x c++ %s -verify
7b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// RUN: %clang_cc1 -DX32TYPE=LLONG -triple powerpc-unknown-linux-gnu -std=c++1y -x c++ %s -verify
8b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// RUN: %clang_cc1 -DX32TYPE=LLONG -triple powerpc-unknown-linux-gnu -std=c++1z -x c++ %s -verify
9b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// RUN: %clang_cc1 -DX64TYPE=ULONG -triple powerpc64-unknown-linux-gnu -std=c89 -x c %s -verify
10b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// RUN: %clang_cc1 -DX64TYPE=ULONG -triple powerpc64-unknown-linux-gnu -std=iso9899:199409 -x c %s -verify
11b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// RUN: %clang_cc1 -DX64TYPE=ULONG -triple powerpc64-unknown-linux-gnu -std=c++98 -x c++ %s -verify
12b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// RUN: %clang_cc1 -DX64TYPE=ULLONG -triple powerpc64-unknown-linux-gnu -std=c99 -x c %s -verify
13b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// RUN: %clang_cc1 -DX64TYPE=ULLONG -triple powerpc64-unknown-linux-gnu -std=c11 -x c %s -verify
14b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// RUN: %clang_cc1 -DX64TYPE=ULLONG -triple powerpc64-unknown-linux-gnu -std=c++11 -x c++ %s -verify
15b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// RUN: %clang_cc1 -DX64TYPE=ULLONG -triple powerpc64-unknown-linux-gnu -std=c++1y -x c++ %s -verify
16b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// RUN: %clang_cc1 -DX64TYPE=ULLONG -triple powerpc64-unknown-linux-gnu -std=c++1z -x c++ %s -verify
17b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
18b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#ifdef X64TYPE
19b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#define X32TYPE long
20b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#endif
21b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
22b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#define IS_ULONG_ULONG 1
23b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#define IS_ULONG2(X) IS_ULONG_##X
24b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#define IS_ULONG(X) IS_ULONG2(X)
25b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
26b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#if !defined(X64TYPE) && !IS_ULONG(X32TYPE)
27b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// expected-no-diagnostics
28b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#endif
29b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
30b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainartypedef unsigned long ULONG;
31b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainartypedef long long LLONG;
32b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainartypedef unsigned long long ULLONG;
33b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
34b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
35b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar/******************************************************************************
36b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar * Test 2^31 as a decimal literal with no suffix and with the "l" and "L" cases.
37b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ******************************************************************************/
38b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarextern X32TYPE x32;
39b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarextern __typeof__(2147483648) x32;
40b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarextern __typeof__(2147483648l) x32;
41b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarextern __typeof__(2147483648L) x32;
42b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
43b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#if IS_ULONG(X32TYPE)
44b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#if !__cplusplus
45b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
46b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar/******************************************************************************
47b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar * Under pre-C99 ISO C, unsigned long is attempted for decimal integer literals
48b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar * that do not have a suffix containing "u" or "U" if the literal does not fit
49b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar * within the range of int or long. See 6.1.3.2 paragraph 5.
50b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ******************************************************************************/
51b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// expected-warning@39 {{integer literal is too large to be represented in type 'long', interpreting as 'unsigned long' per C89; this literal will have type 'long long' in C99 onwards}}
52b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// expected-warning@40 {{integer literal is too large to be represented in type 'long', interpreting as 'unsigned long' per C89; this literal will have type 'long long' in C99 onwards}}
53b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// expected-warning@41 {{integer literal is too large to be represented in type 'long', interpreting as 'unsigned long' per C89; this literal will have type 'long long' in C99 onwards}}
54b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#else
55b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
56b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar/******************************************************************************
57b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar * Under pre-C++11 ISO C++, the same holds if the literal contains an "l" or "L"
58b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar * in its suffix; otherwise, the behavior is undefined. See 2.13.1 [lex.icon]
59b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar * paragraph 2.
60b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ******************************************************************************/
61b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// expected-warning@39 {{integer literal is too large to be represented in type 'long' and is subject to undefined behavior under C++98, interpreting as 'unsigned long'; this literal will have type 'long long' in C++11 onwards}}
62b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// expected-warning@40 {{integer literal is too large to be represented in type 'long', interpreting as 'unsigned long' per C++98; this literal will have type 'long long' in C++11 onwards}}
63b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// expected-warning@41 {{integer literal is too large to be represented in type 'long', interpreting as 'unsigned long' per C++98; this literal will have type 'long long' in C++11 onwards}}
64b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#endif
65b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#endif
66b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
67b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
68b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#ifdef X64TYPE
69b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
70b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar/******************************************************************************
71b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar * Test 2^63 as a decimal literal with no suffix and with the "l" and "L" cases.
72b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ******************************************************************************/
73b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarextern X64TYPE x64;
74b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarextern __typeof__(9223372036854775808) x64;
75b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarextern __typeof__(9223372036854775808l) x64;
76b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarextern __typeof__(9223372036854775808L) x64;
77b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
78b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#if IS_ULONG(X64TYPE)
79b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
80b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#if !__cplusplus
81b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
82b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar/******************************************************************************
83b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar * Under pre-C99 ISO C, unsigned long is attempted for decimal integer literals
84b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar * that do not have a suffix containing "u" or "U" if the literal does not fit
85b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar * within the range of int or long. See 6.1.3.2 paragraph 5.
86b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ******************************************************************************/
87b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// expected-warning@74 {{integer literal is too large to be represented in type 'long', interpreting as 'unsigned long' per C89; this literal will be ill-formed in C99 onwards}}
88b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// expected-warning@75 {{integer literal is too large to be represented in type 'long', interpreting as 'unsigned long' per C89; this literal will be ill-formed in C99 onwards}}
89b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// expected-warning@76 {{integer literal is too large to be represented in type 'long', interpreting as 'unsigned long' per C89; this literal will be ill-formed in C99 onwards}}
90b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#else
91b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
92b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar/******************************************************************************
93b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar * Under pre-C++11 ISO C++, the same holds if the literal contains an "l" or "L"
94b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar * in its suffix; otherwise, the behavior is undefined. See 2.13.1 [lex.icon]
95b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar * paragraph 2.
96b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ******************************************************************************/
97b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// expected-warning@74 {{integer literal is too large to be represented in type 'long' and is subject to undefined behavior under C++98, interpreting as 'unsigned long'; this literal will be ill-formed in C++11 onwards}}
98b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// expected-warning@75 {{integer literal is too large to be represented in type 'long', interpreting as 'unsigned long' per C++98; this literal will be ill-formed in C++11 onwards}}
99b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// expected-warning@76 {{integer literal is too large to be represented in type 'long', interpreting as 'unsigned long' per C++98; this literal will be ill-formed in C++11 onwards}}
100b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#endif
101b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#else
102b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
103b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar/******************************************************************************
104b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar * The status quo in C99/C++11-and-later modes for the literals in question is
105b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar * to interpret them as unsigned as an extension.
106b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ******************************************************************************/
107b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// expected-warning@74 {{integer literal is too large to be represented in a signed integer type, interpreting as unsigned}}
108b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// expected-warning@75 {{integer literal is too large to be represented in a signed integer type, interpreting as unsigned}}
109b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// expected-warning@76 {{integer literal is too large to be represented in a signed integer type, interpreting as unsigned}}
110b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#endif
111b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#endif
112b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
113b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
114b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar/******************************************************************************
115b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar * Test preprocessor arithmetic with 2^31 as a decimal literal with no suffix
116b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar * and with the "l" and "L" cases.
117b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ******************************************************************************/
118b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#if !IS_ULONG(X32TYPE)
119b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
120b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar/******************************************************************************
121b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar * If the literal is signed without need for the modified range of the signed
122b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar * integer types within the controlling constant expression for conditional
123b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar * inclusion, then it will also be signed with said modified range.
124b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ******************************************************************************/
125b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#define EXPR(X) ((X - X) - 1 < 0)
126b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#else
127b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
128b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar/******************************************************************************
129b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar * Strictly speaking, in pre-C99/C++11 ISO C/C++, the preprocessor arithmetic is
130b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar * evaluated with the range of long/unsigned long; however, both Clang and GCC
131b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar * evaluate using 64-bits even when long/unsigned long are 32-bits outside of
132b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar * preprocessing.
133b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar *
134b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar * If the range used becomes 32-bits, then this test will enforce the treatment
135b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar * as unsigned of the literals in question.
136b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar *
137b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar * Note:
138b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar * Under pre-C99/C++11 ISO C/C++, whether the interpretation of the literal is
139b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar * affected by the modified range of the signed and unsigned integer types
140b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar * within the controlling constant expression for conditional inclusion is
141b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar * unclear.
142b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ******************************************************************************/
143b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#define PP_LONG_MAX ((0ul - 1ul) >> 1)
144b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#define EXPR(X)                                                                \
145b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  (PP_LONG_MAX >= 0x80000000 || (X - X) - 1 > 0) // either 2^31 fits into a
146b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar                                                 // preprocessor "long" or the
147b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar                                                 // literals in question are
148b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar                                                 // unsigned
149b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#endif
150b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
151b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#if !(EXPR(2147483648) && EXPR(2147483648l) && EXPR(2147483648L))
152b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#error Unexpected signedness or conversion behavior
153b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#endif
154