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