member-access-expr.cpp revision a71d819bb8f50c28938db0f2867d3fb6e2ce5910
12700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor// RUN: clang-cc -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);
77a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor}