1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s 24a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor 34a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregornamespace N1 { 44a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor struct X0 { }; 54a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor 64a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor int& f0(X0); 74a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor} 84a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor 94a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregornamespace N2 { 104a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor char& f0(char); 114a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor 124a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor template<typename T, typename Result> 134a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor struct call_f0 { 144a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor void test_f0(T t) { 154a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor Result result = f0(t); 164a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor } 174a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor }; 184a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor} 194a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor 204a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregortemplate struct N2::call_f0<int, char&>; 214a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregortemplate struct N2::call_f0<N1::X0, int&>; 224a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor 234a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregornamespace N3 { 244a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor template<typename T, typename Result> 254a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor struct call_f0 { 264a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor void test_f0(T t) { 27f50e88a793dd5bc7073c717fec78912e3234e95aRichard Smith Result &result = f0(t); // expected-error {{undeclared identifier}} \ 282a00b8347bdf0064cc106295a070c00669ded9a9Jay Foad expected-error {{neither visible in the template definition nor found by argument-dependent lookup}} 294a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor } 304a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor }; 314a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor} 324a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor 334a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregortemplate struct N3::call_f0<int, char&>; // expected-note{{instantiation}} 344a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregortemplate struct N3::call_f0<N1::X0, int&>; 354a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor 36f50e88a793dd5bc7073c717fec78912e3234e95aRichard Smithshort& f0(char); // expected-note {{should be declared prior to the call site}} 374a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregornamespace N4 { 384a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor template<typename T, typename Result> 394a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor struct call_f0 { 404a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor void test_f0(T t) { 414a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor Result &result = f0(t); 424a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor } 434a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor }; 444a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor} 454a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor 464a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregortemplate struct N4::call_f0<int, short&>; 474a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregortemplate struct N4::call_f0<N1::X0, int&>; 484a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregortemplate struct N3::call_f0<int, short&>; // expected-note{{instantiation}} 494a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor 504a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor// FIXME: test overloaded function call operators, calls to member 514a2487aeacf9f35ce553318c2eb39c20ec23845eDouglas Gregor// functions, etc. 52