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 { test_f0N2::call_f014 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 { test_f0N3::call_f026 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 { test_f0N4::call_f040 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