1 // RUN: %clang_cc1 -fsyntax-only -verify %s 2 3 #define NULL (void*)0 4 5 #define ATTR __attribute__ ((__sentinel__)) 6 7 void foo1 (int x, ...) ATTR; // expected-note 2 {{function has been explicitly marked sentinel here}} 8 void foo5 (int x, ...) __attribute__ ((__sentinel__(1))); // expected-note {{function has been explicitly marked sentinel here}} 9 void foo6 (int x, ...) __attribute__ ((__sentinel__(5))); // expected-note {{function has been explicitly marked sentinel here}} 10 void foo7 (int x, ...) __attribute__ ((__sentinel__(0))); // expected-note {{function has been explicitly marked sentinel here}} 11 void foo10 (int x, ...) __attribute__ ((__sentinel__(1,1))); 12 void foo12 (int x, ... ) ATTR; // expected-note {{function has been explicitly marked sentinel here}} 13 14 void test1() { 15 foo1(1, NULL); // OK 16 foo1(1, 0) ; // expected-warning {{missing sentinel in function call}} 17 foo5(1, NULL, 2); // OK 18 foo5(1,2,NULL, 1); // OK 19 foo5(1, NULL, 2, 1); // expected-warning {{missing sentinel in function call}} 20 21 foo6(1,2,3,4,5,6,7); // expected-warning {{missing sentinel in function call}} 22 foo6(1,NULL,3,4,5,6,7); // OK 23 foo7(1); // expected-warning {{not enough variable arguments in 'foo7' declaration to fit a sentinel}} 24 foo7(1, NULL); // OK 25 26 foo12(1); // expected-warning {{not enough variable arguments in 'foo12' declaration to fit a sentinel}} 27 28 // PR 5685 29 struct A {}; 30 struct A a, b, c; 31 foo1(3, &a, &b, &c); // expected-warning {{missing sentinel in function call}} 32 foo1(3, &a, &b, &c, (struct A*) 0); 33 } 34 35 36 37 void (*e) (int arg, const char * format, ...) __attribute__ ((__sentinel__ (1,1))); 38 39 void test2() { 40 void (*b) (int arg, const char * format, ...) __attribute__ ((__sentinel__)); // expected-note {{function has been explicitly marked sentinel here}} 41 void (*z) (int arg, const char * format, ...) __attribute__ ((__sentinel__ (2))); // expected-note {{function has been explicitly marked sentinel here}} 42 43 44 void (*y) (int arg, const char * format, ...) __attribute__ ((__sentinel__ (5))); // expected-note {{function has been explicitly marked sentinel here}} 45 46 b(1, "%s", (void*)0); // OK 47 b(1, "%s", 0); // expected-warning {{missing sentinel in function call}} 48 z(1, "%s",4 ,1,0); // expected-warning {{missing sentinel in function call}} 49 z(1, "%s", (void*)0, 1, 0); // OK 50 51 y(1, "%s", 1,2,3,4,5,6,7); // expected-warning {{missing sentinel in function call}} 52 53 y(1, "%s", (void*)0,3,4,5,6,7); // OK 54 } 55