member-access-expr.cpp revision 410a3f3c194a541acb5cdf3b98e96d6078685cf2
1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s
22700dcde044893642b9b77638e052aa90be7cd51Douglas Gregortemplate<typename T>
32700dcde044893642b9b77638e052aa90be7cd51Douglas Gregorvoid call_f0(T x) {
42700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor  x.Base::f0();
52700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor}
62700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor
72700dcde044893642b9b77638e052aa90be7cd51Douglas Gregorstruct Base {
82700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor  void f0();
92700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor};
102700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor
112700dcde044893642b9b77638e052aa90be7cd51Douglas Gregorstruct X0 : Base {
122700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor  typedef Base CrazyBase;
132700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor};
142700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor
152700dcde044893642b9b77638e052aa90be7cd51Douglas Gregorvoid test_f0(X0 x0) {
162700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor  call_f0(x0);
172700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor}
182700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor
192700dcde044893642b9b77638e052aa90be7cd51Douglas Gregortemplate<typename TheBase, typename T>
202700dcde044893642b9b77638e052aa90be7cd51Douglas Gregorvoid call_f0_through_typedef(T x) {
212700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor  typedef TheBase Base2;
222700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor  x.Base2::f0();
232700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor}
242700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor
252700dcde044893642b9b77638e052aa90be7cd51Douglas Gregorvoid test_f0_through_typedef(X0 x0) {
262700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor  call_f0_through_typedef<Base>(x0);
272700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor}
282700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor
292700dcde044893642b9b77638e052aa90be7cd51Douglas Gregortemplate<typename TheBase, typename T>
302700dcde044893642b9b77638e052aa90be7cd51Douglas Gregorvoid call_f0_through_typedef2(T x) {
312700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor  typedef TheBase CrazyBase; // expected-note{{current scope}}
32c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor  x.CrazyBase::f0(); // expected-error{{ambiguous}} \
33c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                     // expected-error 2{{no member named}}
342700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor}
352700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor
362700dcde044893642b9b77638e052aa90be7cd51Douglas Gregorstruct OtherBase { };
372700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor
382700dcde044893642b9b77638e052aa90be7cd51Douglas Gregorstruct X1 : Base, OtherBase {
392700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor  typedef OtherBase CrazyBase; // expected-note{{object type}}
402700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor};
412700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor
422700dcde044893642b9b77638e052aa90be7cd51Douglas Gregorvoid test_f0_through_typedef2(X0 x0, X1 x1) {
432700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor  call_f0_through_typedef2<Base>(x0);
44c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor  call_f0_through_typedef2<OtherBase>(x1); // expected-note{{instantiation}}
45c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor  call_f0_through_typedef2<Base>(x1); // expected-note{{instantiation}}
462700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor}
472700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor
482700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor
4981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregorstruct X2 {
5081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  operator int() const;
5181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor};
5281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
5381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregortemplate<typename T, typename U>
5481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas GregorT convert(const U& value) {
5581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  return value.operator T(); // expected-error{{operator long}}
5681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor}
5781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
5881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregorvoid test_convert(X2 x2) {
5981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  convert<int>(x2);
6081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  convert<long>(x2); // expected-note{{instantiation}}
6181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor}
62a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor
63a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregortemplate<typename T>
64a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregorvoid destruct(T* ptr) {
65a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  ptr->~T();
66a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor}
67a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor
68a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregortemplate<typename T>
69a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregorvoid destruct_intptr(int *ip) {
70a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  ip->~T();
71a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor}
72a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor
73a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregorvoid test_destruct(X2 *x2p, int *ip) {
74a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  destruct(x2p);
75a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  destruct(ip);
76a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  destruct_intptr<int>(ip);
77a9e29aa4b1e5042a763240899d8b8cf1267c3ec5Douglas Gregor}
78a9e29aa4b1e5042a763240899d8b8cf1267c3ec5Douglas Gregor
79a9e29aa4b1e5042a763240899d8b8cf1267c3ec5Douglas Gregor// PR5220
80a9e29aa4b1e5042a763240899d8b8cf1267c3ec5Douglas Gregorclass X3 {
81a9e29aa4b1e5042a763240899d8b8cf1267c3ec5Douglas Gregorprotected:
82a9e29aa4b1e5042a763240899d8b8cf1267c3ec5Douglas Gregor  template <int> float* &f0();
83a9e29aa4b1e5042a763240899d8b8cf1267c3ec5Douglas Gregor  template <int> const float* &f0() const;
84a9e29aa4b1e5042a763240899d8b8cf1267c3ec5Douglas Gregor  void f1() {
85a9e29aa4b1e5042a763240899d8b8cf1267c3ec5Douglas Gregor    (void)static_cast<float*>(f0<0>());
86a9e29aa4b1e5042a763240899d8b8cf1267c3ec5Douglas Gregor  }
87a9e29aa4b1e5042a763240899d8b8cf1267c3ec5Douglas Gregor  void f1() const{
88a9e29aa4b1e5042a763240899d8b8cf1267c3ec5Douglas Gregor    (void)f0<0>();
89a9e29aa4b1e5042a763240899d8b8cf1267c3ec5Douglas Gregor  }
90a9e29aa4b1e5042a763240899d8b8cf1267c3ec5Douglas Gregor};
91b1c2ea5dddc9188e2ea30de7f6546f640b85deadDouglas Gregor
92b1c2ea5dddc9188e2ea30de7f6546f640b85deadDouglas Gregor// Fun with template instantiation and conversions
93b1c2ea5dddc9188e2ea30de7f6546f640b85deadDouglas Gregorstruct X4 {
94b1c2ea5dddc9188e2ea30de7f6546f640b85deadDouglas Gregor  int& member();
95b1c2ea5dddc9188e2ea30de7f6546f640b85deadDouglas Gregor  float& member() const;
96b1c2ea5dddc9188e2ea30de7f6546f640b85deadDouglas Gregor};
97b1c2ea5dddc9188e2ea30de7f6546f640b85deadDouglas Gregor
98b1c2ea5dddc9188e2ea30de7f6546f640b85deadDouglas Gregortemplate<typename T>
99b1c2ea5dddc9188e2ea30de7f6546f640b85deadDouglas Gregorstruct X5 {
100b1c2ea5dddc9188e2ea30de7f6546f640b85deadDouglas Gregor  void f(T* ptr) { int& ir = ptr->member(); }
101b1c2ea5dddc9188e2ea30de7f6546f640b85deadDouglas Gregor  void g(T* ptr) { float& fr = ptr->member(); }
102b1c2ea5dddc9188e2ea30de7f6546f640b85deadDouglas Gregor};
103b1c2ea5dddc9188e2ea30de7f6546f640b85deadDouglas Gregor
104b1c2ea5dddc9188e2ea30de7f6546f640b85deadDouglas Gregorvoid test_X5(X5<X4> x5, X5<const X4> x5c, X4 *xp, const X4 *cxp) {
105b1c2ea5dddc9188e2ea30de7f6546f640b85deadDouglas Gregor  x5.f(xp);
106b1c2ea5dddc9188e2ea30de7f6546f640b85deadDouglas Gregor  x5c.g(cxp);
107b1c2ea5dddc9188e2ea30de7f6546f640b85deadDouglas Gregor}
108410a3f3c194a541acb5cdf3b98e96d6078685cf2John McCall
109410a3f3c194a541acb5cdf3b98e96d6078685cf2John McCall// In theory we can do overload resolution at template-definition time on this.
110410a3f3c194a541acb5cdf3b98e96d6078685cf2John McCall// We should at least not assert.
111410a3f3c194a541acb5cdf3b98e96d6078685cf2John McCallnamespace test4 {
112410a3f3c194a541acb5cdf3b98e96d6078685cf2John McCall  struct Base {
113410a3f3c194a541acb5cdf3b98e96d6078685cf2John McCall    template <class T> void foo() {}
114410a3f3c194a541acb5cdf3b98e96d6078685cf2John McCall  };
115410a3f3c194a541acb5cdf3b98e96d6078685cf2John McCall
116410a3f3c194a541acb5cdf3b98e96d6078685cf2John McCall  template <class T> struct Foo : Base {
117410a3f3c194a541acb5cdf3b98e96d6078685cf2John McCall    void test() {
118410a3f3c194a541acb5cdf3b98e96d6078685cf2John McCall      foo<int>();
119410a3f3c194a541acb5cdf3b98e96d6078685cf2John McCall    }
120410a3f3c194a541acb5cdf3b98e96d6078685cf2John McCall  };
121410a3f3c194a541acb5cdf3b98e96d6078685cf2John McCall}
122