| 1 | // RUN: %clang_cc1 -fsyntax-only -verify -pedantic -std=c++11 %s |
| 2 | |
| 3 | extern "C" { |
| 4 | extern int scanf(const char *restrict, ...); |
| 5 | extern int printf(const char *restrict, ...); |
| 6 | } |
| 7 | |
| 8 | void f(char **sp, float *fp) { |
| 9 | scanf("%as", sp); // expected-warning{{format specifies type 'float *' but the argument has type 'char **'}} |
| 10 | |
| 11 | printf("%p", sp); // expected-warning{{format specifies type 'void *' but the argument has type 'char **'}} |
| 12 | scanf("%p", sp); // expected-warning{{format specifies type 'void **' but the argument has type 'char **'}} |
| 13 | |
| 14 | printf("%a", 1.0); |
| 15 | scanf("%afoobar", fp); |
| 16 | printf(nullptr); |
| 17 | printf(*sp); // expected-warning {{not a string literal}} |
| 18 | // expected-note@-1{{treat the string as an argument to avoid this}} |
| 19 | |
| 20 | // PR13099 |
| 21 | printf( |
| 22 | R"foobar(%)foobar" |
| 23 | R"bazquux(d)bazquux" // expected-warning {{more '%' conversions than data arguments}} |
| 24 | R"xyzzy()xyzzy"); |
| 25 | |
| 26 | printf(u8"this is %d test", 0); // ok |
| 27 | printf(u8R"foo( |
| 28 | \u1234\U0010fffe |
| 29 | %d)foo" // expected-warning {{more '%' conversions than data arguments}} |
| 30 | ); |
| 31 | |
| 32 | printf("init list: %d", { 0 }); // expected-error {{cannot pass initializer list to variadic function; expected type from format string was 'int'}} |
| 33 | printf("void: %d", f(sp, fp)); // expected-error {{cannot pass expression of type 'void' to variadic function; expected type from format string was 'int'}} |
| 34 | printf(0, { 0 }); // expected-error {{cannot pass initializer list to variadic function}} |
| 35 | } |
| 36 | |