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 { |
14 | 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 { |
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 | |
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 { |
40 | 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 | |