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