|  | // RUN: %clang_cc1 -fsyntax-only -verify %s | 
|  |  | 
|  | int printf(const char *, ...); | 
|  |  | 
|  | const char* f(const char *s) __attribute__((format_arg(1))); | 
|  |  | 
|  | const char *h(const char *msg1, const char *msg2) | 
|  | __attribute__((__format_arg__(1))) __attribute__((__format_arg__(2))); | 
|  |  | 
|  | void g(const char *s) { | 
|  | printf("%d", 123); | 
|  | printf("%d %d", 123); // expected-warning{{more '%' conversions than data arguments}} | 
|  |  | 
|  | printf(f("%d"), 123); | 
|  | printf(f("%d %d"), 123); // expected-warning{{more '%' conversions than data arguments}} | 
|  |  | 
|  | printf(h( | 
|  | "", // expected-warning {{format string is empty}} | 
|  | ""  // expected-warning {{format string is empty}} | 
|  | ), 123); | 
|  | printf(h( | 
|  | "%d", | 
|  | ""  // expected-warning {{format string is empty}} | 
|  | ), 123); | 
|  | printf(h( | 
|  | "", // expected-warning {{format string is empty}} | 
|  | "%d" | 
|  | ), 123); | 
|  | printf(h("%d", "%d"), 123); | 
|  | } |