xref: /llvm-project/clang/test/SemaTemplate/class-template-ctor-initializer.cpp (revision e7cbb3ed4fc793fe599d35d780c4d8fda9048aa0)
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