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