1// RUN: %clang_cc1 -std=c++11 -fsyntax-only -fdiagnostics-show-option -verify %s
2
3template<typename T>
4struct set{};
5struct 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};
14void 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
28namespace 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
46namespace 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