18fbe78f6SDaniel Dunbar // RUN: %clang_cc1 -fsyntax-only -verify %s 2*e7cbb3edSCharles Li // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s 3*e7cbb3edSCharles Li // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s 4c1fc3ec8SFariborz Jahanian 5c1fc3ec8SFariborz Jahanian template<class X> struct A {}; 6c1fc3ec8SFariborz Jahanian 7c1fc3ec8SFariborz Jahanian template<class X> struct B : A<X> { BB8c1fc3ec8SFariborz Jahanian B() : A<X>() {} 9c1fc3ec8SFariborz Jahanian }; 10c1fc3ec8SFariborz Jahanian B<int> x; 11c1fc3ec8SFariborz Jahanian 12c1fc3ec8SFariborz Jahanian template<class X> struct B1 : A<X> { 13c1fc3ec8SFariborz Jahanian typedef A<X> Base; B1B114c1fc3ec8SFariborz Jahanian B1() : Base() {} 15c1fc3ec8SFariborz Jahanian }; 16c1fc3ec8SFariborz Jahanian B1<int> x1; 17c1fc3ec8SFariborz Jahanian 18c1fc3ec8SFariborz Jahanian 19c1fc3ec8SFariborz Jahanian template<typename T> struct Tmpl { }; 20c1fc3ec8SFariborz Jahanian 21c1fc3ec8SFariborz Jahanian template<typename T> struct TmplB { }; 22c1fc3ec8SFariborz Jahanian 23c1fc3ec8SFariborz Jahanian struct TmplC : Tmpl<int> { TmplCTmplC24c1fc3ec8SFariborz Jahanian TmplC() : 25c1fc3ec8SFariborz Jahanian Tmpl<int>(), 26c1fc3ec8SFariborz Jahanian TmplB<int>() { } // expected-error {{type 'TmplB<int>' is not a direct or virtual base of 'TmplC'}} 27c1fc3ec8SFariborz Jahanian }; 28c1fc3ec8SFariborz Jahanian 29c1fc3ec8SFariborz Jahanian 30c1fc3ec8SFariborz Jahanian struct TmplD : Tmpl<char>, TmplB<char> { TmplDTmplD31c1fc3ec8SFariborz Jahanian TmplD(): 32c1fc3ec8SFariborz Jahanian Tmpl<int>(), // expected-error {{type 'Tmpl<int>' is not a direct or virtual base of 'TmplD'}} 33c1fc3ec8SFariborz Jahanian TmplB<char>() {} 34c1fc3ec8SFariborz Jahanian }; 35c1fc3ec8SFariborz Jahanian 361c69bf00SDouglas Gregor namespace PR7259 { 371c69bf00SDouglas Gregor class Base { 381c69bf00SDouglas Gregor public: Base()391c69bf00SDouglas Gregor Base() {} 401c69bf00SDouglas Gregor }; 411c69bf00SDouglas Gregor 421c69bf00SDouglas Gregor template <class ParentClass> 431c69bf00SDouglas Gregor class Derived : public ParentClass { 441c69bf00SDouglas Gregor public: Derived()451c69bf00SDouglas Gregor Derived() : Base() {} 461c69bf00SDouglas Gregor }; 471c69bf00SDouglas Gregor 481c69bf00SDouglas Gregor class Final : public Derived<Base> { 491c69bf00SDouglas Gregor }; 501c69bf00SDouglas Gregor 511c69bf00SDouglas Gregor int main(void)521c69bf00SDouglas Gregor main (void) 531c69bf00SDouglas Gregor { 5469f90dceSRichard Smith Final final; 551c69bf00SDouglas Gregor return 0; 561c69bf00SDouglas Gregor } 571c69bf00SDouglas Gregor } 5860f2e1efSRichard Smith 5960f2e1efSRichard Smith namespace NonDependentError { 60*e7cbb3edSCharles Li struct Base { Base(int); }; // expected-note {{candidate constructor not viable}} 61*e7cbb3edSCharles Li // expected-note@-1 {{candidate constructor (the implicit copy constructor) not viable}} 62*e7cbb3edSCharles Li #if __cplusplus >= 201103L // C++11 or later 63*e7cbb3edSCharles Li // expected-note@-3 {{candidate constructor (the implicit move constructor) not viable}} 64*e7cbb3edSCharles Li #endif 6560f2e1efSRichard Smith 6660f2e1efSRichard Smith template<typename T> 6760f2e1efSRichard Smith struct Derived1 : Base { Derived1NonDependentError::Derived16860f2e1efSRichard Smith Derived1() : Base(1, 2) {} // expected-error {{no matching constructor}} 6960f2e1efSRichard Smith }; 7060f2e1efSRichard Smith 7160f2e1efSRichard Smith template<typename T> 7260f2e1efSRichard Smith struct Derived2 : Base { Derived2NonDependentError::Derived27360f2e1efSRichard Smith Derived2() : BaseClass(1) {} // expected-error {{does not name a non-static data member or base}} 7460f2e1efSRichard Smith }; 7560f2e1efSRichard Smith 7660f2e1efSRichard Smith Derived1<void> d1; 7760f2e1efSRichard Smith Derived2<void> d2; 7860f2e1efSRichard Smith } 79