1// RUN: %clang_cc1 -fsyntax-only -verify %s
2
3// FIXME: Access control checks
4
5namespace PR5820 {
6  // also <rdar://problem/7535045>
7  struct Base {
8    void Foo();
9    int Member;
10  };
11
12  struct D1 : public Base {};
13  struct D2 : public Base {};
14
15  struct Derived : public D1, public D2 {
16    void Inner();
17  };
18
19  void Test() {
20    Derived d;
21    d.D1::Foo();
22    d.D1::Member = 17;
23  }
24
25  void Derived::Inner() {
26    D1::Foo();
27    D1::Member = 42;
28    this->D1::Foo();
29    this->D1::Member = 42;
30  }
31}
32
33template<typename T>
34struct BaseT {
35  void Foo(); // expected-note{{found by ambiguous name lookup}}
36  int Member;
37};
38
39template<typename T> struct Derived1T : BaseT<T> { };
40template<typename T> struct Derived2T : BaseT<T> { };
41
42template<typename T>
43struct DerivedT : public Derived1T<T>, public Derived2T<T> {
44  void Inner();
45};
46
47template<typename T>
48void DerivedT<T>::Inner() {
49  Derived1T<T>::Foo();
50  Derived2T<T>::Member = 42;
51  this->Derived1T<T>::Foo();
52  this->Derived2T<T>::Member = 42;
53  this->Foo(); // expected-error{{non-static member 'Foo' found in multiple base-class subobjects of type 'BaseT<int>'}}
54}
55
56template<typename T>
57void Test(DerivedT<T> d) {
58  d.template Derived1T<T>::Foo();
59  d.template Derived2T<T>::Member = 17;
60  d.Inner(); // expected-note{{in instantiation}}
61}
62
63template void Test(DerivedT<int>);
64