| // RUN: %clang_cc1 -fsyntax-only -verify %s |
| |
| namespace N1 { |
| struct X0 { }; |
| |
| int& f0(X0); |
| } |
| |
| namespace N2 { |
| char& f0(char); |
| |
| template<typename T, typename Result> |
| struct call_f0 { |
| void test_f0(T t) { |
| Result result = f0(t); |
| } |
| }; |
| } |
| |
| template struct N2::call_f0<int, char&>; |
| template struct N2::call_f0<N1::X0, int&>; |
| |
| namespace N3 { |
| template<typename T, typename Result> |
| struct call_f0 { |
| void test_f0(T t) { |
| Result &result = f0(t); // expected-error {{undeclared identifier}} \ |
| expected-error {{neither visible in the template definition nor found by argument-dependent lookup}} |
| } |
| }; |
| } |
| |
| template struct N3::call_f0<int, char&>; // expected-note{{instantiation}} |
| template struct N3::call_f0<N1::X0, int&>; |
| |
| short& f0(char); // expected-note {{should be declared prior to the call site}} |
| namespace N4 { |
| template<typename T, typename Result> |
| struct call_f0 { |
| void test_f0(T t) { |
| Result &result = f0(t); |
| } |
| }; |
| } |
| |
| template struct N4::call_f0<int, short&>; |
| template struct N4::call_f0<N1::X0, int&>; |
| template struct N3::call_f0<int, short&>; // expected-note{{instantiation}} |
| |
| // FIXME: test overloaded function call operators, calls to member |
| // functions, etc. |