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