1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar//RUN: %clang_cc1 -fsyntax-only -verify %s 2aa8f976111e75427fa41e0f84b78fe086ce0f4e6Ted Kremenek 3aa8f976111e75427fa41e0f84b78fe086ce0f4e6Ted Kremenek#include <stdarg.h> 4aa8f976111e75427fa41e0f84b78fe086ce0f4e6Ted Kremenek 5aa8f976111e75427fa41e0f84b78fe086ce0f4e6Ted Kremenekvoid a(const char *a, ...) __attribute__((format(printf, 1,2))); // no-error 6aa8f976111e75427fa41e0f84b78fe086ce0f4e6Ted Kremenekvoid b(const char *a, ...) __attribute__((format(printf, 1,1))); // expected-error {{'format' attribute parameter 3 is out of bounds}} 7aa8f976111e75427fa41e0f84b78fe086ce0f4e6Ted Kremenekvoid c(const char *a, ...) __attribute__((format(printf, 0,2))); // expected-error {{'format' attribute parameter 2 is out of bounds}} 8aa8f976111e75427fa41e0f84b78fe086ce0f4e6Ted Kremenekvoid d(const char *a, int c) __attribute__((format(printf, 1,2))); // expected-error {{format attribute requires variadic function}} 9aa8f976111e75427fa41e0f84b78fe086ce0f4e6Ted Kremenekvoid e(char *str, int c, ...) __attribute__((format(printf, 2,3))); // expected-error {{format argument not a string type}} 10aa8f976111e75427fa41e0f84b78fe086ce0f4e6Ted Kremenek 11aa8f976111e75427fa41e0f84b78fe086ce0f4e6Ted Kremenektypedef const char* xpto; 12aa8f976111e75427fa41e0f84b78fe086ce0f4e6Ted Kremenekvoid f(xpto c, va_list list) __attribute__((format(printf, 1, 0))); // no-error 13aa8f976111e75427fa41e0f84b78fe086ce0f4e6Ted Kremenekvoid g(xpto c) __attribute__((format(printf, 1, 0))); // no-error 14aa8f976111e75427fa41e0f84b78fe086ce0f4e6Ted Kremenek 15aa8f976111e75427fa41e0f84b78fe086ce0f4e6Ted Kremenekvoid y(char *str) __attribute__((format(strftime, 1,0))); // no-error 16aa8f976111e75427fa41e0f84b78fe086ce0f4e6Ted Kremenekvoid z(char *str, int c, ...) __attribute__((format(strftime, 1,2))); // expected-error {{strftime format attribute requires 3rd parameter to be 0}} 178c1a9a80ba2e200f9180867e133563b15223dca2Nuno Lopes 188c1a9a80ba2e200f9180867e133563b15223dca2Nuno Lopesint (*f_ptr)(char*,...) __attribute__((format(printf, 1,2))); // no-error 198c1a9a80ba2e200f9180867e133563b15223dca2Nuno Lopesint (*f2_ptr)(double,...) __attribute__((format(printf, 1, 2))); // expected-error {{format argument not a string type}} 2059b6d5ae1c42515340a48040f6ff576a6f48a9c3Nuno Lopes 2159b6d5ae1c42515340a48040f6ff576a6f48a9c3Nuno Lopesstruct _mystruct { 2259b6d5ae1c42515340a48040f6ff576a6f48a9c3Nuno Lopes int (*printf)(const char *format, ...) __attribute__((__format__(printf, 1, 2))); // no-error 2359b6d5ae1c42515340a48040f6ff576a6f48a9c3Nuno Lopes int (*printf2)(double format, ...) __attribute__((__format__(printf, 1, 2))); // expected-error {{format argument not a string type}} 2459b6d5ae1c42515340a48040f6ff576a6f48a9c3Nuno Lopes}; 2572786e009bd0519882ceac874e618134d2200d95Ted Kremenek 2672786e009bd0519882ceac874e618134d2200d95Ted Kremenektypedef int (*f3_ptr)(char*,...) __attribute__((format(printf,1,0))); // no-error 273d692df4b9c58895f9843b03543ec57447c93679Ted Kremenek 283d692df4b9c58895f9843b03543ec57447c93679Ted Kremenek// <rdar://problem/6623513> 293d692df4b9c58895f9843b03543ec57447c93679Ted Kremenekint rdar6623513(void *, const char*, const char*, ...) 303d692df4b9c58895f9843b03543ec57447c93679Ted Kremenek __attribute__ ((format (printf, 3, 0))); 313d692df4b9c58895f9843b03543ec57447c93679Ted Kremenek 323d692df4b9c58895f9843b03543ec57447c93679Ted Kremenekint rdar6623513_aux(int len, const char* s) { 333d692df4b9c58895f9843b03543ec57447c93679Ted Kremenek rdar6623513(0, "hello", "%.*s", len, s); 343d692df4b9c58895f9843b03543ec57447c93679Ted Kremenek} 35a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattner 36a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattner 37a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattner 38a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattner// same as format(printf(...))... 39a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattnervoid a2(const char *a, ...) __attribute__((format(printf0, 1,2))); // no-error 40a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattnervoid b2(const char *a, ...) __attribute__((format(printf0, 1,1))); // expected-error {{'format' attribute parameter 3 is out of bounds}} 41a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattnervoid c2(const char *a, ...) __attribute__((format(printf0, 0,2))); // expected-error {{'format' attribute parameter 2 is out of bounds}} 42a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattnervoid d2(const char *a, int c) __attribute__((format(printf0, 1,2))); // expected-error {{format attribute requires variadic function}} 43a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattnervoid e2(char *str, int c, ...) __attribute__((format(printf0, 2,3))); // expected-error {{format argument not a string type}} 44a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattner 45a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattner// FreeBSD usage 46a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattner#define __printf0like(fmt,va) __attribute__((__format__(__printf0__,fmt,va))) 47a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattnervoid null(int i, const char *a, ...) __printf0like(2,0); // no-error 48a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregorvoid null(int i, const char *a, ...) { // expected-note{{passing argument to parameter 'a' here}} 49a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattner if (a) 50a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattner (void)0/* vprintf(...) would go here */; 51a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattner} 52a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattner 53a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattnervoid callnull(void){ 54a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattner null(0, 0); // no error 55a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattner null(0, (char*)0); // no error 56a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattner null(0, (void*)0); // no error 57a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattner null(0, (int*)0); // expected-warning {{incompatible pointer types}} 58a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattner} 59a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattner 60a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattner 61a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattner 62a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattner// PR4470 63a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattnerint xx_vprintf(const char *, va_list); 64a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattner 65a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattnerconst char *foo(const char *format) __attribute__((format_arg(1))); 66a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattner 67a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattnervoid __attribute__((format(printf, 1, 0))) 68a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattnerfoo2(const char *fmt, va_list va) { 69a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattner xx_vprintf(foo(fmt), va); 70a87d477c69ec31a0d24b7c53e4a781fb76617809Chris Lattner} 713c989027f68e2d9dfd57c018ccc550bd9fb79920Chris Lattner 723c989027f68e2d9dfd57c018ccc550bd9fb79920Chris Lattner// PR6542 733c989027f68e2d9dfd57c018ccc550bd9fb79920Chris Lattnerextern void gcc_format (const char *, ...) 74bc52595e01323ca22d65c68aafd53a1acb8c1fb6Duncan Sands __attribute__ ((__format__(__gcc_diag__, 1, 2))); 75bc52595e01323ca22d65c68aafd53a1acb8c1fb6Duncan Sandsextern void gcc_cformat (const char *, ...) 76bc52595e01323ca22d65c68aafd53a1acb8c1fb6Duncan Sands __attribute__ ((__format__(__gcc_cdiag__, 1, 2))); 77bc52595e01323ca22d65c68aafd53a1acb8c1fb6Duncan Sandsextern void gcc_cxxformat (const char *, ...) 78bc52595e01323ca22d65c68aafd53a1acb8c1fb6Duncan Sands __attribute__ ((__format__(__gcc_cxxdiag__, 1, 2))); 79bc52595e01323ca22d65c68aafd53a1acb8c1fb6Duncan Sandsextern void gcc_tformat (const char *, ...) 803c989027f68e2d9dfd57c018ccc550bd9fb79920Chris Lattner __attribute__ ((__format__(__gcc_tdiag__, 1, 2))); 81b3d7efe0f95bc44f0e93602f4617a53ca3b66e3aAaron Ballman 82b3d7efe0f95bc44f0e93602f4617a53ca3b66e3aAaron Ballmanconst char *foo3(const char *format) __attribute__((format_arg("foo"))); // expected-error{{'format_arg' attribute requires parameter 1 to be an integer constant}} 83