1/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, October 2010.  */
2/* { dg-do compile } */
3/* { dg-options "-Wall" } */
4
5#include <objc/objc.h>
6#include <stdlib.h>
7
8@interface LogObject
9{
10  Class isa;
11}
12+ (void) log: (int)level  message: (const char *) my_format, ...  __attribute__ ((format (printf, 2, 3)));
13- (void) log: (int)level  message: (const char *) my_format, ...  __attribute__ ((format (printf, 2, 3)));
14
15+ (void) debug: (const char *) my_format, ...  __attribute__ ((format (printf, 1, 2)));
16- (void) debug: (const char *) my_format, ...  __attribute__ ((format (printf, 1, 2)));
17
18/* Just make sure a missing or invalid attribute won't crash the compiler.  */
19- (void) log2: (int)level  message: (const char *) my_format, ...  __attribute__ ((format (printf, 2)));    /* { dg-error "wrong" } */
20+ (void) debug2: (const char *) my_format, ...  __attribute__ ((format (printf))); /* { dg-error "wrong" } */
21- (void) debug2: (const char *) my_format, ...  __attribute__ ((format (printf))); /* { dg-error "wrong" } */
22+ (void) alert: (const char *) my_format __attribute__ ((format (printf, 1, 2))); /* { dg-error "args to be formatted is not ..." } */
23- (void) alert: (const char *) my_format __attribute__ ((format (printf, 1, 2))); /* { dg-error "args to be formatted is not ..." } */
24@end
25
26void test (LogObject *object)
27{
28  [object log: 2  message: "attribute only applies to variadic functions"];
29  [object log: 2  message: "attribute %s only applies to variadic functions", "'format'"];
30  [object log: 2  message: "attribute %s only applies to variadic functions"]; /* { dg-warning "expects a matching" } */
31
32  [object debug: "attribute only applies to variadic functions"];
33  [object debug: "attribute %s only applies to variadic functions", "'format'"];
34  [object debug: "attribute %s only applies to variadic functions"]; /* { dg-warning "expects a matching" } */
35
36  [LogObject log: 2  message: "attribute only applies to variadic functions"];
37  [LogObject log: 2  message: "attribute %s only applies to variadic functions", "'format'"];
38  [LogObject log: 2  message: "attribute %s only applies to variadic functions"]; /* { dg-warning "expects a matching" } */
39
40  [LogObject debug: "attribute only applies to variadic functions"];
41  [LogObject debug: "attribute %s only applies to variadic functions", "'format'"];
42  [LogObject debug: "attribute %s only applies to variadic functions"]; /* { dg-warning "expects a matching" } */
43}
44