Home | History | Annotate | Download | only in SemaTemplate
      1 // RUN: %clang_cc1 -fsyntax-only -verify %s
      2 
      3 namespace N1 {
      4   struct X0 { };
      5 
      6   int& f0(X0);
      7 }
      8 
      9 namespace N2 {
     10   char& f0(char);
     11 
     12   template<typename T, typename Result>
     13   struct call_f0 {
     14     void test_f0(T t) {
     15       Result result = f0(t);
     16     }
     17   };
     18 }
     19 
     20 template struct N2::call_f0<int, char&>;
     21 template struct N2::call_f0<N1::X0, int&>;
     22 
     23 namespace N3 {
     24   template<typename T, typename Result>
     25   struct call_f0 {
     26     void test_f0(T t) {
     27       Result &result = f0(t); // expected-error {{undeclared identifier}} \
     28                                  expected-error {{neither visible in the template definition nor found by argument-dependent lookup}}
     29     }
     30   };
     31 }
     32 
     33 template struct N3::call_f0<int, char&>; // expected-note{{instantiation}}
     34 template struct N3::call_f0<N1::X0, int&>;
     35 
     36 short& f0(char); // expected-note {{should be declared prior to the call site}}
     37 namespace N4 {
     38   template<typename T, typename Result>
     39   struct call_f0 {
     40     void test_f0(T t) {
     41       Result &result = f0(t);
     42     }
     43   };
     44 }
     45 
     46 template struct N4::call_f0<int, short&>;
     47 template struct N4::call_f0<N1::X0, int&>;
     48 template struct N3::call_f0<int, short&>; // expected-note{{instantiation}}
     49 
     50 // FIXME: test overloaded function call operators, calls to member
     51 // functions, etc.
     52