1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s
24967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
34967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
44967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
52700dcde044893642b9b77638e052aa90be7cd51Douglas Gregortemplate<typename T>
62700dcde044893642b9b77638e052aa90be7cd51Douglas Gregorvoid call_f0(T x) {
72700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor  x.Base::f0();
82700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor}
92700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor
102700dcde044893642b9b77638e052aa90be7cd51Douglas Gregorstruct Base {
112700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor  void f0();
122700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor};
132700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor
142700dcde044893642b9b77638e052aa90be7cd51Douglas Gregorstruct X0 : Base {
152700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor  typedef Base CrazyBase;
162700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor};
172700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor
182700dcde044893642b9b77638e052aa90be7cd51Douglas Gregorvoid test_f0(X0 x0) {
192700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor  call_f0(x0);
202700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor}
212700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor
222700dcde044893642b9b77638e052aa90be7cd51Douglas Gregortemplate<typename TheBase, typename T>
232700dcde044893642b9b77638e052aa90be7cd51Douglas Gregorvoid call_f0_through_typedef(T x) {
242700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor  typedef TheBase Base2;
252700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor  x.Base2::f0();
262700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor}
272700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor
282700dcde044893642b9b77638e052aa90be7cd51Douglas Gregorvoid test_f0_through_typedef(X0 x0) {
292700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor  call_f0_through_typedef<Base>(x0);
302700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor}
312700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor
322700dcde044893642b9b77638e052aa90be7cd51Douglas Gregortemplate<typename TheBase, typename T>
332700dcde044893642b9b77638e052aa90be7cd51Douglas Gregorvoid call_f0_through_typedef2(T x) {
344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef TheBase CrazyBase;
354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // expected-note@-2 {{lookup from the current scope refers here}}
374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  x.CrazyBase::f0(); // expected-error 2{{no member named}}
404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // expected-error@-2 {{lookup of 'CrazyBase' in member access expression is ambiguous}}
424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
442700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor}
452700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor
462700dcde044893642b9b77638e052aa90be7cd51Douglas Gregorstruct OtherBase { };
472700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor
482700dcde044893642b9b77638e052aa90be7cd51Douglas Gregorstruct X1 : Base, OtherBase {
494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef OtherBase CrazyBase;
504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // expected-note@-2 {{lookup in the object type 'X1' refers here}}
524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
532700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor};
542700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor
552700dcde044893642b9b77638e052aa90be7cd51Douglas Gregorvoid test_f0_through_typedef2(X0 x0, X1 x1) {
562700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor  call_f0_through_typedef2<Base>(x0);
57c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor  call_f0_through_typedef2<OtherBase>(x1); // expected-note{{instantiation}}
58c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor  call_f0_through_typedef2<Base>(x1); // expected-note{{instantiation}}
592700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor}
602700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor
612700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor
6281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregorstruct X2 {
6381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  operator int() const;
6481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor};
6581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
6681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregortemplate<typename T, typename U>
6781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas GregorT convert(const U& value) {
6881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  return value.operator T(); // expected-error{{operator long}}
6981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor}
7081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
7181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregorvoid test_convert(X2 x2) {
7281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  convert<int>(x2);
7381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  convert<long>(x2); // expected-note{{instantiation}}
7481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor}
75a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor
76a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregortemplate<typename T>
77a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregorvoid destruct(T* ptr) {
78a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  ptr->~T();
79a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  ptr->T::~T();
80a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor}
81a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor
82a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregortemplate<typename T>
83a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregorvoid destruct_intptr(int *ip) {
84a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  ip->~T();
85a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  ip->T::~T();
86a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor}
87a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor
88a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregorvoid test_destruct(X2 *x2p, int *ip) {
89a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  destruct(x2p);
90a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  destruct(ip);
91a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  destruct_intptr<int>(ip);
92a9e29aa4b1e5042a763240899d8b8cf1267c3ec5Douglas Gregor}
93a9e29aa4b1e5042a763240899d8b8cf1267c3ec5Douglas Gregor
94a9e29aa4b1e5042a763240899d8b8cf1267c3ec5Douglas Gregor// PR5220
95a9e29aa4b1e5042a763240899d8b8cf1267c3ec5Douglas Gregorclass X3 {
96a9e29aa4b1e5042a763240899d8b8cf1267c3ec5Douglas Gregorprotected:
97a9e29aa4b1e5042a763240899d8b8cf1267c3ec5Douglas Gregor  template <int> float* &f0();
98a9e29aa4b1e5042a763240899d8b8cf1267c3ec5Douglas Gregor  template <int> const float* &f0() const;
99a9e29aa4b1e5042a763240899d8b8cf1267c3ec5Douglas Gregor  void f1() {
100a9e29aa4b1e5042a763240899d8b8cf1267c3ec5Douglas Gregor    (void)static_cast<float*>(f0<0>());
101a9e29aa4b1e5042a763240899d8b8cf1267c3ec5Douglas Gregor  }
102a9e29aa4b1e5042a763240899d8b8cf1267c3ec5Douglas Gregor  void f1() const{
103a9e29aa4b1e5042a763240899d8b8cf1267c3ec5Douglas Gregor    (void)f0<0>();
104a9e29aa4b1e5042a763240899d8b8cf1267c3ec5Douglas Gregor  }
105a9e29aa4b1e5042a763240899d8b8cf1267c3ec5Douglas Gregor};
106b1c2ea5dddc9188e2ea30de7f6546f640b85deadDouglas Gregor
107b1c2ea5dddc9188e2ea30de7f6546f640b85deadDouglas Gregor// Fun with template instantiation and conversions
108b1c2ea5dddc9188e2ea30de7f6546f640b85deadDouglas Gregorstruct X4 {
109b1c2ea5dddc9188e2ea30de7f6546f640b85deadDouglas Gregor  int& member();
110b1c2ea5dddc9188e2ea30de7f6546f640b85deadDouglas Gregor  float& member() const;
111b1c2ea5dddc9188e2ea30de7f6546f640b85deadDouglas Gregor};
112b1c2ea5dddc9188e2ea30de7f6546f640b85deadDouglas Gregor
113b1c2ea5dddc9188e2ea30de7f6546f640b85deadDouglas Gregortemplate<typename T>
114b1c2ea5dddc9188e2ea30de7f6546f640b85deadDouglas Gregorstruct X5 {
115b1c2ea5dddc9188e2ea30de7f6546f640b85deadDouglas Gregor  void f(T* ptr) { int& ir = ptr->member(); }
116b1c2ea5dddc9188e2ea30de7f6546f640b85deadDouglas Gregor  void g(T* ptr) { float& fr = ptr->member(); }
117b1c2ea5dddc9188e2ea30de7f6546f640b85deadDouglas Gregor};
118b1c2ea5dddc9188e2ea30de7f6546f640b85deadDouglas Gregor
119b1c2ea5dddc9188e2ea30de7f6546f640b85deadDouglas Gregorvoid test_X5(X5<X4> x5, X5<const X4> x5c, X4 *xp, const X4 *cxp) {
120b1c2ea5dddc9188e2ea30de7f6546f640b85deadDouglas Gregor  x5.f(xp);
121b1c2ea5dddc9188e2ea30de7f6546f640b85deadDouglas Gregor  x5c.g(cxp);
122b1c2ea5dddc9188e2ea30de7f6546f640b85deadDouglas Gregor}
123410a3f3c194a541acb5cdf3b98e96d6078685cf2John McCall
124410a3f3c194a541acb5cdf3b98e96d6078685cf2John McCall// In theory we can do overload resolution at template-definition time on this.
125410a3f3c194a541acb5cdf3b98e96d6078685cf2John McCall// We should at least not assert.
126410a3f3c194a541acb5cdf3b98e96d6078685cf2John McCallnamespace test4 {
127410a3f3c194a541acb5cdf3b98e96d6078685cf2John McCall  struct Base {
128410a3f3c194a541acb5cdf3b98e96d6078685cf2John McCall    template <class T> void foo() {}
129410a3f3c194a541acb5cdf3b98e96d6078685cf2John McCall  };
130410a3f3c194a541acb5cdf3b98e96d6078685cf2John McCall
131410a3f3c194a541acb5cdf3b98e96d6078685cf2John McCall  template <class T> struct Foo : Base {
132410a3f3c194a541acb5cdf3b98e96d6078685cf2John McCall    void test() {
133410a3f3c194a541acb5cdf3b98e96d6078685cf2John McCall      foo<int>();
134410a3f3c194a541acb5cdf3b98e96d6078685cf2John McCall    }
135410a3f3c194a541acb5cdf3b98e96d6078685cf2John McCall  };
136410a3f3c194a541acb5cdf3b98e96d6078685cf2John McCall}
137e2248be8746e0ebb01e9a3b823bc0e129283bef4Douglas Gregor
138e2248be8746e0ebb01e9a3b823bc0e129283bef4Douglas Gregornamespace test5 {
139e2248be8746e0ebb01e9a3b823bc0e129283bef4Douglas Gregor  template<typename T>
140e2248be8746e0ebb01e9a3b823bc0e129283bef4Douglas Gregor  struct X {
141e2248be8746e0ebb01e9a3b823bc0e129283bef4Douglas Gregor    using T::value;
142e2248be8746e0ebb01e9a3b823bc0e129283bef4Douglas Gregor
143e2248be8746e0ebb01e9a3b823bc0e129283bef4Douglas Gregor    T &getValue() {
144e2248be8746e0ebb01e9a3b823bc0e129283bef4Douglas Gregor      return &value;
145e2248be8746e0ebb01e9a3b823bc0e129283bef4Douglas Gregor    }
146e2248be8746e0ebb01e9a3b823bc0e129283bef4Douglas Gregor  };
147e2248be8746e0ebb01e9a3b823bc0e129283bef4Douglas Gregor}
14801b2e4e3e2fbd60e62539f7e8e8b99575fa8a5b0John McCall
14901b2e4e3e2fbd60e62539f7e8e8b99575fa8a5b0John McCall// PR8739
15001b2e4e3e2fbd60e62539f7e8e8b99575fa8a5b0John McCallnamespace test6 {
15101b2e4e3e2fbd60e62539f7e8e8b99575fa8a5b0John McCall  struct A {};
15201b2e4e3e2fbd60e62539f7e8e8b99575fa8a5b0John McCall  struct B {};
15301b2e4e3e2fbd60e62539f7e8e8b99575fa8a5b0John McCall  template <class T> class Base;
15401b2e4e3e2fbd60e62539f7e8e8b99575fa8a5b0John McCall  template <class T> class Derived : public Base<T> {
15501b2e4e3e2fbd60e62539f7e8e8b99575fa8a5b0John McCall    A *field;
15601b2e4e3e2fbd60e62539f7e8e8b99575fa8a5b0John McCall    void get(B **ptr) {
15701b2e4e3e2fbd60e62539f7e8e8b99575fa8a5b0John McCall      // It's okay if at some point we figure out how to diagnose this
15801b2e4e3e2fbd60e62539f7e8e8b99575fa8a5b0John McCall      // at instantiation time.
15901b2e4e3e2fbd60e62539f7e8e8b99575fa8a5b0John McCall      *ptr = field;
16001b2e4e3e2fbd60e62539f7e8e8b99575fa8a5b0John McCall    }
16101b2e4e3e2fbd60e62539f7e8e8b99575fa8a5b0John McCall  };
16201b2e4e3e2fbd60e62539f7e8e8b99575fa8a5b0John McCall}
163