2011-12-28 21:10:50 +08:00
// RUN: %clang_cc1 -fsyntax-only -verify -pedantic -std=c++11 %s
extern " C " {
extern int scanf ( const char * restrict , . . . ) ;
extern int printf ( const char * restrict , . . . ) ;
}
void f ( char * * sp , float * fp ) {
2012-01-21 05:52:58 +08:00
scanf ( " %as " , sp ) ; // expected-warning{{format specifies type 'float *' but the argument has type 'char **'}}
2011-12-28 21:10:50 +08:00
2015-03-04 11:12:10 +08:00
printf ( " %p " , sp ) ; // expected-warning{{format specifies type 'void *' but the argument has type 'char **'}}
scanf ( " %p " , sp ) ; // expected-warning{{format specifies type 'void **' but the argument has type 'char **'}}
2011-12-28 21:10:50 +08:00
printf ( " %a " , 1.0 ) ;
scanf ( " %afoobar " , fp ) ;
2012-02-11 05:07:25 +08:00
printf ( nullptr ) ;
printf ( * sp ) ; // expected-warning {{not a string literal}}
2016-03-16 04:56:38 +08:00
// expected-note@-1{{treat the string as an argument to avoid this}}
2012-06-13 13:37:23 +08:00
// PR13099
printf (
R " foobar(%)foobar "
R " bazquux(d)bazquux " // expected-warning {{more '%' conversions than data arguments}}
R " xyzzy()xyzzy " ) ;
printf ( u8 " this is %d test " , 0 ) ; // ok
printf ( u8R " foo(
\ u1234 \ U0010fffe
% d ) foo " // expected-warning {{more '%' conversions than data arguments}}
) ;
2013-08-06 02:49:43 +08:00
printf ( " init list: %d " , { 0 } ) ; // expected-error {{cannot pass initializer list to variadic function; expected type from format string was 'int'}}
printf ( " void: %d " , f ( sp , fp ) ) ; // expected-error {{cannot pass expression of type 'void' to variadic function; expected type from format string was 'int'}}
printf ( 0 , { 0 } ) ; // expected-error {{cannot pass initializer list to variadic function}}
2011-12-28 21:10:50 +08:00
}