1 | // RUN: %clang_cc1 -std=c++11 -fsyntax-only -fdiagnostics-show-option -verify %s |
2 | |
3 | template<typename T> |
4 | struct set{}; |
5 | struct Value { |
6 | template<typename T> |
7 | void set(T value) {} |
8 | |
9 | void resolves_to_same() { |
10 | Value v; |
11 | v.set<double>(3.2); |
12 | } |
13 | }; |
14 | void resolves_to_different() { |
15 | { |
16 | Value v; |
17 | // The fact that the next line is a warning rather than an error is an |
18 | // extension. |
19 | v.set<double>(3.2); |
20 | } |
21 | { |
22 | int set; // Non-template. |
23 | Value v; |
24 | v.set<double>(3.2); |
25 | } |
26 | } |
27 | |
28 | namespace rdar9915664 { |
29 | struct A { |
30 | template<typename T> void a(); |
31 | }; |
32 | |
33 | struct B : A { }; |
34 | |
35 | struct C : A { }; |
36 | |
37 | struct D : B, C { |
38 | A &getA() { return static_cast<B&>(*this); } |
39 | |
40 | void test_a() { |
41 | getA().a<int>(); |
42 | } |
43 | }; |
44 | } |
45 | |
46 | namespace PR11856 { |
47 | template<typename T> T end(T); |
48 | |
49 | template <typename T> |
50 | void Foo() { |
51 | T it1; |
52 | if (it1->end < it1->end) { |
53 | } |
54 | } |
55 | |
56 | template<typename T> T *end(T*); |
57 | |
58 | class X { }; |
59 | template <typename T> |
60 | void Foo2() { |
61 | T it1; |
62 | if (it1->end < it1->end) { |
63 | } |
64 | |
65 | X *x; |
66 | if (x->end < 7) { // expected-error{{no member named 'end' in 'PR11856::X'}} |
67 | } |
68 | } |
69 | } |
70 | |