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