xref: /aosp_15_r20/external/clang/test/SemaTemplate/class-template-ctor-initializer.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s
2*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
3*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
4*67e74705SXin Li 
5*67e74705SXin Li template<class X> struct A {};
6*67e74705SXin Li 
7*67e74705SXin Li template<class X> struct B : A<X> {
BB8*67e74705SXin Li   B() : A<X>() {}
9*67e74705SXin Li };
10*67e74705SXin Li B<int> x;
11*67e74705SXin Li 
12*67e74705SXin Li template<class X> struct B1 : A<X> {
13*67e74705SXin Li   typedef A<X> Base;
B1B114*67e74705SXin Li   B1() : Base() {}
15*67e74705SXin Li };
16*67e74705SXin Li B1<int> x1;
17*67e74705SXin Li 
18*67e74705SXin Li 
19*67e74705SXin Li template<typename T> struct Tmpl { };
20*67e74705SXin Li 
21*67e74705SXin Li template<typename T> struct TmplB { };
22*67e74705SXin Li 
23*67e74705SXin Li struct TmplC : Tmpl<int> {
TmplCTmplC24*67e74705SXin Li    TmplC() :
25*67e74705SXin Li              Tmpl<int>(),
26*67e74705SXin Li              TmplB<int>() { } // expected-error {{type 'TmplB<int>' is not a direct or virtual base of 'TmplC'}}
27*67e74705SXin Li };
28*67e74705SXin Li 
29*67e74705SXin Li 
30*67e74705SXin Li struct TmplD : Tmpl<char>, TmplB<char> {
TmplDTmplD31*67e74705SXin Li     TmplD():
32*67e74705SXin Li             Tmpl<int>(), // expected-error {{type 'Tmpl<int>' is not a direct or virtual base of 'TmplD'}}
33*67e74705SXin Li             TmplB<char>() {}
34*67e74705SXin Li };
35*67e74705SXin Li 
36*67e74705SXin Li namespace PR7259 {
37*67e74705SXin Li   class Base {
38*67e74705SXin Li   public:
Base()39*67e74705SXin Li     Base() {}
40*67e74705SXin Li   };
41*67e74705SXin Li 
42*67e74705SXin Li   template <class ParentClass>
43*67e74705SXin Li   class Derived : public ParentClass {
44*67e74705SXin Li   public:
Derived()45*67e74705SXin Li     Derived() : Base() {}
46*67e74705SXin Li   };
47*67e74705SXin Li 
48*67e74705SXin Li   class Final : public Derived<Base> {
49*67e74705SXin Li   };
50*67e74705SXin Li 
51*67e74705SXin Li   int
main(void)52*67e74705SXin Li   main (void)
53*67e74705SXin Li   {
54*67e74705SXin Li     Final final;
55*67e74705SXin Li     return 0;
56*67e74705SXin Li   }
57*67e74705SXin Li }
58*67e74705SXin Li 
59*67e74705SXin Li namespace NonDependentError {
60*67e74705SXin Li   struct Base { Base(int); }; // expected-note {{candidate constructor not viable}}
61*67e74705SXin Li // expected-note@-1 {{candidate constructor (the implicit copy constructor) not viable}}
62*67e74705SXin Li #if __cplusplus >= 201103L // C++11 or later
63*67e74705SXin Li // expected-note@-3 {{candidate constructor (the implicit move constructor) not viable}}
64*67e74705SXin Li #endif
65*67e74705SXin Li 
66*67e74705SXin Li   template<typename T>
67*67e74705SXin Li   struct Derived1 : Base {
Derived1NonDependentError::Derived168*67e74705SXin Li     Derived1() : Base(1, 2) {} // expected-error {{no matching constructor}}
69*67e74705SXin Li   };
70*67e74705SXin Li 
71*67e74705SXin Li   template<typename T>
72*67e74705SXin Li   struct Derived2 : Base {
Derived2NonDependentError::Derived273*67e74705SXin Li     Derived2() : BaseClass(1) {} // expected-error {{does not name a non-static data member or base}}
74*67e74705SXin Li   };
75*67e74705SXin Li 
76*67e74705SXin Li   Derived1<void> d1;
77*67e74705SXin Li   Derived2<void> d2;
78*67e74705SXin Li }
79