Home | History | Annotate | Download | only in Sema
      1 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -verify %s
      2 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -x c++ -verify %s
      3 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -x c++ -std=c++11 -verify %s
      4 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -x objective-c -verify %s
      5 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -x objective-c++ -std=c++11 -verify %s
      6 
      7 #ifdef __cplusplus
      8 # define EXTERN_C extern "C"
      9 #else
     10 # define EXTERN_C extern
     11 #endif
     12 
     13 EXTERN_C int printf(const char *,...);
     14 
     15 typedef enum { Constant = 0 } TestEnum;
     16 // Note that in C, the type of 'Constant' is 'int'. In C++ it is 'TestEnum'.
     17 // This is why we don't check for that in the expected output.
     18 
     19 void test(TestEnum input) {
     20     printf("%d", input); // no-warning
     21     printf("%d", Constant); // no-warning
     22 
     23     printf("%lld", input); // expected-warning-re{{format specifies type 'long long' but the argument has underlying type '{{(unsigned)?}} int'}}
     24     printf("%lld", Constant); // expected-warning{{format specifies type 'long long'}}
     25 }
     26 
     27 
     28 typedef enum { LongConstant = ~0UL } LongEnum;
     29 
     30 void testLong(LongEnum input) {
     31   printf("%u", input); // expected-warning{{format specifies type 'unsigned int' but the argument has underlying type}}
     32   printf("%u", LongConstant); // expected-warning{{format specifies type 'unsigned int'}}
     33 
     34   printf("%lu", input);
     35   printf("%lu", LongConstant);
     36 }
     37