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