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