155ce352dSRichard Smith // RUN: %clang_cc1 -fsyntax-only -fblocks -Wformat -verify %s -Wno-error=non-pod-varargs
2*542f04ccSCharles Li // RUN: %clang_cc1 -fsyntax-only -fblocks -Wformat -verify %s -Wno-error=non-pod-varargs -std=c++98
3*542f04ccSCharles Li // RUN: %clang_cc1 -fsyntax-only -fblocks -Wformat -verify %s -Wno-error=non-pod-varargs -std=c++11
455ce352dSRichard Smith
555ce352dSRichard Smith int (^block) (int, const char *,...) __attribute__((__format__(__printf__,2,3))) = ^ __attribute__((__format__(__printf__,2,3))) (int arg, const char *format,...) {return 5;};
655ce352dSRichard Smith
755ce352dSRichard Smith class HasNoCStr {
855ce352dSRichard Smith const char *str;
955ce352dSRichard Smith public:
HasNoCStr(const char * s)1055ce352dSRichard Smith HasNoCStr(const char *s): str(s) { }
not_c_str()1155ce352dSRichard Smith const char *not_c_str() {return str;}
1255ce352dSRichard Smith };
1355ce352dSRichard Smith
test_block()1455ce352dSRichard Smith void test_block() {
1555ce352dSRichard Smith const char str[] = "test";
1655ce352dSRichard Smith HasNoCStr hncs(str);
1755ce352dSRichard Smith int n = 4;
1855ce352dSRichard Smith block(n, "%s %d", str, n); // no-warning
19*542f04ccSCharles Li block(n, "%s %s", hncs, n);
20*542f04ccSCharles Li #if __cplusplus <= 199711L // C++03 or earlier modes
21*542f04ccSCharles Li // expected-warning@-2{{cannot pass non-POD object of type 'HasNoCStr' to variadic block; expected type from format string was 'char *'}}
22*542f04ccSCharles Li #else
23*542f04ccSCharles Li // expected-warning@-4{{format specifies type 'char *' but the argument has type 'HasNoCStr'}}
24*542f04ccSCharles Li #endif
25*542f04ccSCharles Li // expected-warning@-6{{format specifies type 'char *' but the argument has type 'int'}}
2655ce352dSRichard Smith }
27