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