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