// RUN: %clang_cc1 -xc %s -verify -DBOOL=_Bool // RUN: %clang_cc1 -xc++ %s -verify -DBOOL=bool // RUN: %clang_cc1 -xobjective-c %s -verify -DBOOL=_Bool // RUN: %clang_cc1 -xc %s -verify -DBOOL=_Bool -Wformat-type-confusion -DTYPE_CONF // RUN: %clang_cc1 -xc++ %s -verify -DBOOL=bool -Wformat-type-confusion -DTYPE_CONF __attribute__((format(__printf__, 1, 2))) int p(const char *fmt, ...); BOOL b; #ifdef __OBJC__ @interface NSString +(NSString *)stringWithFormat:(NSString *)fmt, ... __attribute__((format(__NSString__, 1, 2))); @end #define YES __objc_yes #define NO __objc_no #endif int main() { p("%d", b); p("%hd", b); #ifdef TYPE_CONF // expected-warning@-2 {{format specifies type 'short' but the argument has type}} #endif p("%hhd", b); p("%u", b); p("%hu", b); #ifdef TYPE_CONF // expected-warning@-2 {{format specifies type 'unsigned short' but the argument has type}} #endif p("%hhu", b); p("%c", b); // expected-warning {{using '%c' format specifier, but argument has boolean value}} p("%lc", b); // expected-warning {{using '%lc' format specifier, but argument has boolean value}} p("%c", 1 == 1); // expected-warning {{using '%c' format specifier, but argument has boolean value}} p("%f", b); // expected-warning{{format specifies type 'double' but the argument has type}} p("%ld", b); // expected-warning{{format specifies type 'long' but the argument has type}} p("%lld", b); // expected-warning{{format specifies type 'long long' but the argument has type}} #ifdef __OBJC__ [NSString stringWithFormat: @"%c", 0]; // probably fine? [NSString stringWithFormat: @"%c", NO]; // expected-warning {{using '%c' format specifier, but argument has boolean value}} #endif }