Home | History | Annotate | Download | only in SemaTemplate
      1 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
      2 
      3 typedef double A;
      4 template<typename T> class B {
      5   typedef int A;
      6 };
      7 
      8 template<typename T> struct X : B<T> {
      9   static A a;
     10 };
     11 
     12 int a0[sizeof(X<int>::a) == sizeof(double) ? 1 : -1];
     13 
     14 // PR4365.
     15 template<class T> class Q;
     16 template<class T> class R : Q<T> {T current;};
     17 
     18 
     19 namespace test0 {
     20   template <class T> class Base {
     21   public:
     22     void instance_foo();
     23     static void static_foo();
     24     class Inner {
     25     public:
     26       void instance_foo();
     27       static void static_foo();
     28     };
     29   };
     30 
     31   template <class T> class Derived1 : Base<T> {
     32   public:
     33     void test0() {
     34       Base<T>::static_foo();
     35       Base<T>::instance_foo();
     36     }
     37 
     38     void test1() {
     39       Base<T>::Inner::static_foo();
     40       Base<T>::Inner::instance_foo(); // expected-error {{call to non-static member function without an object argument}}
     41     }
     42 
     43     static void test2() {
     44       Base<T>::static_foo();
     45       Base<T>::instance_foo(); // expected-error {{call to non-static member function without an object argument}}
     46     }
     47 
     48     static void test3() {
     49       Base<T>::Inner::static_foo();
     50       Base<T>::Inner::instance_foo(); // expected-error {{call to non-static member function without an object argument}}
     51     }
     52   };
     53 
     54   template <class T> class Derived2 : Base<T>::Inner {
     55   public:
     56     void test0() {
     57       Base<T>::static_foo();
     58       Base<T>::instance_foo(); // expected-error {{call to non-static member function without an object argument}}
     59     }
     60 
     61     void test1() {
     62       Base<T>::Inner::static_foo();
     63       Base<T>::Inner::instance_foo();
     64     }
     65 
     66     static void test2() {
     67       Base<T>::static_foo();
     68       Base<T>::instance_foo(); // expected-error {{call to non-static member function without an object argument}}
     69     }
     70 
     71     static void test3() {
     72       Base<T>::Inner::static_foo();
     73       Base<T>::Inner::instance_foo(); // expected-error {{call to non-static member function without an object argument}}
     74     }
     75   };
     76 
     77   void test0() {
     78     Derived1<int> d1;
     79     d1.test0();
     80     d1.test1(); // expected-note {{in instantiation of member function}}
     81     d1.test2(); // expected-note {{in instantiation of member function}}
     82     d1.test3(); // expected-note {{in instantiation of member function}}
     83 
     84     Derived2<int> d2;
     85     d2.test0(); // expected-note {{in instantiation of member function}}
     86     d2.test1();
     87     d2.test2(); // expected-note {{in instantiation of member function}}
     88     d2.test3(); // expected-note {{in instantiation of member function}}
     89   }
     90 }
     91 
     92 namespace test1 {
     93   template <class T> struct Base {
     94     void foo(T); // expected-note {{must qualify identifier to find this declaration in dependent base class}}
     95   };
     96 
     97   template <class T> struct Derived : Base<T> {
     98     void doFoo(T v) {
     99       foo(v); // expected-error {{use of undeclared identifier}}
    100     }
    101   };
    102 
    103   template struct Derived<int>; // expected-note {{requested here}}
    104 }
    105 
    106 namespace PR8966 {
    107   template <class T>
    108   class MyClassCore
    109   {
    110   };
    111 
    112   template <class T>
    113   class MyClass : public MyClassCore<T>
    114   {
    115   public:
    116     enum  {
    117       N
    118     };
    119 
    120     // static member declaration
    121     static const char* array [N];
    122 
    123     void f() {
    124       MyClass<T>::InBase = 17;
    125     }
    126   };
    127 
    128   // static member definition
    129   template <class T>
    130   const char* MyClass<T>::array [MyClass<T>::N] = { "A", "B", "C" };
    131 }
    132 
    133 namespace std {
    134   inline namespace v1 {
    135     template<typename T> struct basic_ostream;
    136   }
    137   namespace inner {
    138     template<typename T> struct vector {};
    139   }
    140   using inner::vector;
    141   template<typename T, typename U> struct pair {};
    142   typedef basic_ostream<char> ostream;
    143   extern ostream cout;
    144   std::ostream &operator<<(std::ostream &out, const char *);
    145 }
    146 
    147 namespace PR10053 {
    148   template<typename T> struct A {
    149     T t;
    150     A() {
    151       f(t); // expected-error {{call to function 'f' that is neither visible in the template definition nor found by argument-dependent lookup}}
    152     }
    153   };
    154 
    155   void f(int&); // expected-note {{'f' should be declared prior to the call site}}
    156 
    157   A<int> a; // expected-note {{in instantiation of member function}}
    158 
    159 
    160   namespace N {
    161     namespace M {
    162       template<typename T> int g(T t) {
    163         f(t); // expected-error {{call to function 'f' that is neither visible in the template definition nor found by argument-dependent lookup}}
    164       };
    165     }
    166 
    167     void f(char&); // expected-note {{'f' should be declared prior to the call site}}
    168   }
    169 
    170   void f(char&);
    171 
    172   int k = N::M::g<char>(0);; // expected-note {{in instantiation of function}}
    173 
    174 
    175   namespace O {
    176     void f(char&); // expected-note {{candidate function not viable}}
    177 
    178     template<typename T> struct C {
    179       static const int n = f(T()); // expected-error {{no matching function}}
    180     };
    181   }
    182 
    183   int f(double); // no note, shadowed by O::f
    184   O::C<double> c; // expected-note {{requested here}}
    185 
    186 
    187   // Example from www/compatibility.html
    188   namespace my_file {
    189     template <typename T> T Squared(T x) {
    190       return Multiply(x, x); // expected-error {{neither visible in the template definition nor found by argument-dependent lookup}}
    191     }
    192 
    193     int Multiply(int x, int y) { // expected-note {{should be declared prior to the call site}}
    194       return x * y;
    195     }
    196 
    197     int main() {
    198       Squared(5); // expected-note {{here}}
    199     }
    200   }
    201 
    202   // Example from www/compatibility.html
    203   namespace my_file2 {
    204     template<typename T>
    205     void Dump(const T& value) {
    206       std::cout << value << "\n"; // expected-error {{neither visible in the template definition nor found by argument-dependent lookup}}
    207     }
    208 
    209     namespace ns {
    210       struct Data {};
    211     }
    212 
    213     std::ostream& operator<<(std::ostream& out, ns::Data data) { // expected-note {{should be declared prior to the call site or in namespace 'PR10053::my_file2::ns'}}
    214       return out << "Some data";
    215     }
    216 
    217     void Use() {
    218       Dump(ns::Data()); // expected-note {{here}}
    219     }
    220   }
    221 
    222   namespace my_file2_a {
    223     template<typename T>
    224     void Dump(const T &value) {
    225       print(std::cout, value); // expected-error 4{{neither visible in the template definition nor found by argument-dependent lookup}}
    226     }
    227 
    228     namespace ns {
    229       struct Data {};
    230     }
    231     namespace ns2 {
    232       struct Data {};
    233     }
    234 
    235     std::ostream &print(std::ostream &out, int); // expected-note-re {{should be declared prior to the call site{{$}}}}
    236     std::ostream &print(std::ostream &out, ns::Data); // expected-note {{should be declared prior to the call site or in namespace 'PR10053::my_file2_a::ns'}}
    237     std::ostream &print(std::ostream &out, std::vector<ns2::Data>); // expected-note {{should be declared prior to the call site or in namespace 'PR10053::my_file2_a::ns2'}}
    238     std::ostream &print(std::ostream &out, std::pair<ns::Data, ns2::Data>); // expected-note {{should be declared prior to the call site or in an associated namespace of one of its arguments}}
    239 
    240     void Use() {
    241       Dump(0); // expected-note {{requested here}}
    242       Dump(ns::Data()); // expected-note {{requested here}}
    243       Dump(std::vector<ns2::Data>()); // expected-note {{requested here}}
    244       Dump(std::pair<ns::Data, ns2::Data>()); // expected-note {{requested here}}
    245     }
    246   }
    247 
    248   namespace unary {
    249     template<typename T>
    250     T Negate(const T& value) {
    251       return !value; // expected-error {{call to function 'operator!' that is neither visible in the template definition nor found by argument-dependent lookup}}
    252     }
    253 
    254     namespace ns {
    255       struct Data {};
    256     }
    257 
    258     ns::Data operator!(ns::Data); // expected-note {{should be declared prior to the call site or in namespace 'PR10053::unary::ns'}}
    259 
    260     void Use() {
    261       Negate(ns::Data()); // expected-note {{requested here}}
    262     }
    263   }
    264 }
    265 
    266 namespace PR10187 {
    267   namespace A1 {
    268     template<typename T>
    269     struct S {
    270       void f() {
    271         for (auto &a : e)
    272           __range(a); // expected-error {{undeclared identifier '__range'}}
    273       }
    274       int e[10];
    275     };
    276     void g() {
    277       S<int>().f(); // expected-note {{here}}
    278     }
    279   }
    280 
    281   namespace A2 {
    282     template<typename T>
    283     struct S {
    284       void f() {
    285         for (auto &a : e)
    286           __range(a); // expected-error {{undeclared identifier '__range'}}
    287       }
    288       T e[10];
    289     };
    290     void g() {
    291       S<int>().f(); // expected-note {{here}}
    292     }
    293     struct X {};
    294     void __range(X);
    295     void h() {
    296       S<X>().f();
    297     }
    298   }
    299 
    300   namespace B {
    301     template<typename T> void g(); // expected-note {{not viable}}
    302     template<typename T> void f() {
    303       g<int>(T()); // expected-error {{no matching function}}
    304     }
    305 
    306     namespace {
    307       struct S {};
    308     }
    309     void g(S);
    310 
    311     template void f<S>(); // expected-note {{here}}
    312   }
    313 }
    314 
    315 namespace rdar11242625 {
    316 
    317 template <typename T>
    318 struct Main {
    319   struct default_names {
    320     typedef int id;
    321   };
    322 
    323   template <typename T2 = typename default_names::id>
    324   struct TS {
    325     T2 q;
    326   };
    327 };
    328 
    329 struct Sub : public Main<int> {
    330   TS<> ff;
    331 };
    332 
    333 int arr[sizeof(Sub)];
    334 
    335 }
    336 
    337 namespace PR11421 {
    338 template < unsigned > struct X {
    339   static const unsigned dimension = 3;
    340   template<unsigned dim=dimension>
    341   struct Y: Y<dim> { }; // expected-error{{circular inheritance between 'Y<dim>' and 'Y<dim>'}}
    342 };
    343 typedef X<3> X3;
    344 X3::Y<>::iterator it; // expected-error {{no type named 'iterator' in 'PR11421::X<3>::Y<3>'}}
    345 }
    346 
    347 namespace rdar12629723 {
    348   template<class T>
    349   struct X {
    350     struct C : public C { }; // expected-error{{circular inheritance between 'rdar12629723::X::C' and 'rdar12629723::X::C'}}
    351 
    352     struct B;
    353 
    354     struct A : public B {  // expected-note{{'rdar12629723::X::A' declared here}}
    355       virtual void foo() { }
    356     };
    357 
    358     struct D : T::foo { };
    359     struct E : D { };
    360   };
    361 
    362   template<class T>
    363   struct X<T>::B : public A {  // expected-error{{circular inheritance between 'rdar12629723::X::A' and 'rdar12629723::X::B'}}
    364     virtual void foo() { }
    365   };
    366 }
    367 
    368 namespace test_reserved_identifiers {
    369   template<typename A, typename B> void tempf(A a, B b) {
    370     a + b;  // expected-error{{call to function 'operator+' that is neither visible in the template definition nor found by argument-dependent lookup}}
    371   }
    372   namespace __gnu_cxx { struct X {}; }
    373   namespace ns { struct Y {}; }
    374   void operator+(__gnu_cxx::X, ns::Y);  // expected-note{{or in namespace 'test_reserved_identifiers::ns'}}
    375   void test() {
    376     __gnu_cxx::X x;
    377     ns::Y y;
    378     tempf(x, y);  // expected-note{{in instantiation of}}
    379   }
    380 }
    381 
    382 // This test must live in the global namespace.
    383 struct PR14695_X {};
    384 // FIXME: This note is bogus; it is the using directive which would need to move
    385 // to prior to the call site to fix the problem.
    386 namespace PR14695_A { void PR14695_f(PR14695_X); } // expected-note {{'PR14695_f' should be declared prior to the call site or in the global namespace}}
    387 template<typename T> void PR14695_g(T t) { PR14695_f(t); } // expected-error {{call to function 'PR14695_f' that is neither visible in the template definition nor found by argument-dependent lookup}}
    388 using namespace PR14695_A;
    389 template void PR14695_g(PR14695_X); // expected-note{{requested here}}
    390 
    391 namespace OperatorNew {
    392   template<typename T> void f(T t) {
    393     operator new(100, t); // expected-error{{call to function 'operator new' that is neither visible in the template definition nor found by argument-dependent lookup}}
    394     // FIXME: This should give the same error.
    395     new (t) int;
    396   }
    397   struct X {};
    398 };
    399 using size_t = decltype(sizeof(0));
    400 void *operator new(size_t, OperatorNew::X); // expected-note-re {{should be declared prior to the call site{{$}}}}
    401 template void OperatorNew::f(OperatorNew::X); // expected-note {{instantiation of}}
    402 
    403 namespace PR19936 {
    404   template<typename T> decltype(*T()) f() {} // expected-note {{previous}}
    405   template<typename T> decltype(T() * T()) g() {} // expected-note {{previous}}
    406 
    407   // Create some overloaded operators so we build an overload operator call
    408   // instead of a builtin operator call for the dependent expression.
    409   enum E {};
    410   int operator*(E);
    411   int operator*(E, E);
    412 
    413   // Check that they still profile the same.
    414   template<typename T> decltype(*T()) f() {} // expected-error {{redefinition}}
    415   template<typename T> decltype(T() * T()) g() {} // expected-error {{redefinition}}
    416 }
    417 
    418 template <typename> struct CT2 {
    419   template <class U> struct X;
    420 };
    421 template <typename T> int CT2<int>::X<>; // expected-error {{template parameter list matching the non-templated nested type 'CT2<int>' should be empty}}
    422