member-access-expr.cpp revision c68afe2cbe7f875a9243c411077602fb5f5dc74b
1// RUN: clang-cc -fsyntax-only -verify %s 2template<typename T> 3void call_f0(T x) { 4 x.Base::f0(); 5} 6 7struct Base { 8 void f0(); 9}; 10 11struct X0 : Base { 12 typedef Base CrazyBase; 13}; 14 15void test_f0(X0 x0) { 16 call_f0(x0); 17} 18 19template<typename TheBase, typename T> 20void call_f0_through_typedef(T x) { 21 typedef TheBase Base2; 22 x.Base2::f0(); 23} 24 25void test_f0_through_typedef(X0 x0) { 26 call_f0_through_typedef<Base>(x0); 27} 28 29template<typename TheBase, typename T> 30void call_f0_through_typedef2(T x) { 31 typedef TheBase CrazyBase; // expected-note{{current scope}} 32 x.CrazyBase::f0(); // expected-error{{ambiguous}} \ 33 // expected-error 2{{no member named}} 34} 35 36struct OtherBase { }; 37 38struct X1 : Base, OtherBase { 39 typedef OtherBase CrazyBase; // expected-note{{object type}} 40}; 41 42void test_f0_through_typedef2(X0 x0, X1 x1) { 43 call_f0_through_typedef2<Base>(x0); 44 call_f0_through_typedef2<OtherBase>(x1); // expected-note{{instantiation}} 45 call_f0_through_typedef2<Base>(x1); // expected-note{{instantiation}} 46} 47 48 49