Home | History | Annotate | Download | only in SemaCXX
      1 // RUN: %clang_cc1 -fsyntax-only -Wformat-nonliteral -verify %s
      2 struct S {
      3   static void f(const char*, ...) __attribute__((format(printf, 1, 2)));
      4   static const char* f2(const char*) __attribute__((format_arg(1)));
      5 
      6   // GCC has a hidden 'this' argument in member functions which is why
      7   // the format argument is argument 2 here.
      8   void g(const char*, ...) __attribute__((format(printf, 2, 3)));
      9   const char* g2(const char*) __attribute__((format_arg(2)));
     10 
     11   void h(const char*, ...) __attribute__((format(printf, 1, 4))); // \
     12       expected-error{{implicit this argument as the format string}}
     13   void h2(const char*, ...) __attribute__((format(printf, 2, 1))); // \
     14       expected-error{{out of bounds}}
     15   const char* h3(const char*) __attribute__((format_arg(1))); // \
     16       expected-error{{invalid for the implicit this argument}}
     17 
     18   void operator() (const char*, ...) __attribute__((format(printf, 2, 3)));
     19 };
     20 
     21 // PR5521
     22 struct A { void a(const char*,...) __attribute((format(printf,2,3))); };
     23 void b(A x) {
     24   x.a("%d", 3);
     25 }
     26 
     27 // PR8625: correctly interpret static member calls as not having an implicit
     28 // 'this' argument.
     29 namespace PR8625 {
     30   struct S {
     31     static void f(const char*, const char*, ...)
     32       __attribute__((format(printf, 2, 3)));
     33   };
     34   void test(S s, const char* str) {
     35     s.f(str, "%s", str);
     36   }
     37 }
     38 
     39 // Make sure we interpret member operator calls as having an implicit
     40 // this argument.
     41 void test_operator_call(S s, const char* str) {
     42   s("%s", str);
     43 }
     44