52 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -verify %s2 3namespace N1 {4 struct X0 { };5 6 int& f0(X0);7}8 9namespace 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 20template struct N2::call_f0<int, char&>;21template struct N2::call_f0<N1::X0, int&>;22 23namespace 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 33template struct N3::call_f0<int, char&>; // expected-note{{instantiation}}34template struct N3::call_f0<N1::X0, int&>;35 36short& f0(char); // expected-note {{should be declared prior to the call site}}37namespace 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 46template struct N4::call_f0<int, short&>;47template struct N4::call_f0<N1::X0, int&>;48template struct N3::call_f0<int, short&>; // expected-note{{instantiation}}49 50// FIXME: test overloaded function call operators, calls to member51// functions, etc.52