1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s
2961743326fd18776f897bf4461345dba680ef637Fariborz Jahanian
3961743326fd18776f897bf4461345dba680ef637Fariborz Jahaniantemplate<class X> struct A {};
4961743326fd18776f897bf4461345dba680ef637Fariborz Jahanian
5961743326fd18776f897bf4461345dba680ef637Fariborz Jahaniantemplate<class X> struct B : A<X> {
6961743326fd18776f897bf4461345dba680ef637Fariborz Jahanian  B() : A<X>() {}
7961743326fd18776f897bf4461345dba680ef637Fariborz Jahanian};
8961743326fd18776f897bf4461345dba680ef637Fariborz JahanianB<int> x;
9961743326fd18776f897bf4461345dba680ef637Fariborz Jahanian
10961743326fd18776f897bf4461345dba680ef637Fariborz Jahaniantemplate<class X> struct B1 : A<X> {
11961743326fd18776f897bf4461345dba680ef637Fariborz Jahanian  typedef A<X> Base;
12961743326fd18776f897bf4461345dba680ef637Fariborz Jahanian  B1() : Base() {}
13961743326fd18776f897bf4461345dba680ef637Fariborz Jahanian};
14961743326fd18776f897bf4461345dba680ef637Fariborz JahanianB1<int> x1;
15961743326fd18776f897bf4461345dba680ef637Fariborz Jahanian
16961743326fd18776f897bf4461345dba680ef637Fariborz Jahanian
17961743326fd18776f897bf4461345dba680ef637Fariborz Jahaniantemplate<typename T> struct Tmpl { };
18961743326fd18776f897bf4461345dba680ef637Fariborz Jahanian
19961743326fd18776f897bf4461345dba680ef637Fariborz Jahaniantemplate<typename T> struct TmplB { };
20961743326fd18776f897bf4461345dba680ef637Fariborz Jahanian
21961743326fd18776f897bf4461345dba680ef637Fariborz Jahanianstruct TmplC : Tmpl<int> {
22961743326fd18776f897bf4461345dba680ef637Fariborz Jahanian   TmplC() :
23961743326fd18776f897bf4461345dba680ef637Fariborz Jahanian             Tmpl<int>(),
24961743326fd18776f897bf4461345dba680ef637Fariborz Jahanian             TmplB<int>() { } // expected-error {{type 'TmplB<int>' is not a direct or virtual base of 'TmplC'}}
25961743326fd18776f897bf4461345dba680ef637Fariborz Jahanian};
26961743326fd18776f897bf4461345dba680ef637Fariborz Jahanian
27961743326fd18776f897bf4461345dba680ef637Fariborz Jahanian
28961743326fd18776f897bf4461345dba680ef637Fariborz Jahanianstruct TmplD : Tmpl<char>, TmplB<char> {
29961743326fd18776f897bf4461345dba680ef637Fariborz Jahanian    TmplD():
30961743326fd18776f897bf4461345dba680ef637Fariborz Jahanian            Tmpl<int>(), // expected-error {{type 'Tmpl<int>' is not a direct or virtual base of 'TmplD'}}
31961743326fd18776f897bf4461345dba680ef637Fariborz Jahanian            TmplB<char>() {}
32961743326fd18776f897bf4461345dba680ef637Fariborz Jahanian};
33961743326fd18776f897bf4461345dba680ef637Fariborz Jahanian
343956b1ab303139d9e952c2c30ed16643fad0c325Douglas Gregornamespace PR7259 {
353956b1ab303139d9e952c2c30ed16643fad0c325Douglas Gregor  class Base {
363956b1ab303139d9e952c2c30ed16643fad0c325Douglas Gregor  public:
373956b1ab303139d9e952c2c30ed16643fad0c325Douglas Gregor    Base() {}
383956b1ab303139d9e952c2c30ed16643fad0c325Douglas Gregor  };
393956b1ab303139d9e952c2c30ed16643fad0c325Douglas Gregor
403956b1ab303139d9e952c2c30ed16643fad0c325Douglas Gregor  template <class ParentClass>
413956b1ab303139d9e952c2c30ed16643fad0c325Douglas Gregor  class Derived : public ParentClass {
423956b1ab303139d9e952c2c30ed16643fad0c325Douglas Gregor  public:
433956b1ab303139d9e952c2c30ed16643fad0c325Douglas Gregor    Derived() : Base() {}
443956b1ab303139d9e952c2c30ed16643fad0c325Douglas Gregor  };
453956b1ab303139d9e952c2c30ed16643fad0c325Douglas Gregor
463956b1ab303139d9e952c2c30ed16643fad0c325Douglas Gregor  class Final : public Derived<Base> {
473956b1ab303139d9e952c2c30ed16643fad0c325Douglas Gregor  };
483956b1ab303139d9e952c2c30ed16643fad0c325Douglas Gregor
493956b1ab303139d9e952c2c30ed16643fad0c325Douglas Gregor  int
503956b1ab303139d9e952c2c30ed16643fad0c325Douglas Gregor  main (void)
513956b1ab303139d9e952c2c30ed16643fad0c325Douglas Gregor  {
52cb7709c06027448c754dd03e2e521d82d04818bfRichard Smith    Final final;
533956b1ab303139d9e952c2c30ed16643fad0c325Douglas Gregor    return 0;
543956b1ab303139d9e952c2c30ed16643fad0c325Douglas Gregor  }
553956b1ab303139d9e952c2c30ed16643fad0c325Douglas Gregor}
5654b3ba8cf2eb4886a88cdb8adedb15f43333ff1dRichard Smith
5754b3ba8cf2eb4886a88cdb8adedb15f43333ff1dRichard Smithnamespace NonDependentError {
5854b3ba8cf2eb4886a88cdb8adedb15f43333ff1dRichard Smith  struct Base { Base(int); }; // expected-note 2{{candidate}}
5954b3ba8cf2eb4886a88cdb8adedb15f43333ff1dRichard Smith
6054b3ba8cf2eb4886a88cdb8adedb15f43333ff1dRichard Smith  template<typename T>
6154b3ba8cf2eb4886a88cdb8adedb15f43333ff1dRichard Smith  struct Derived1 : Base {
6254b3ba8cf2eb4886a88cdb8adedb15f43333ff1dRichard Smith    Derived1() : Base(1, 2) {} // expected-error {{no matching constructor}}
6354b3ba8cf2eb4886a88cdb8adedb15f43333ff1dRichard Smith  };
6454b3ba8cf2eb4886a88cdb8adedb15f43333ff1dRichard Smith
6554b3ba8cf2eb4886a88cdb8adedb15f43333ff1dRichard Smith  template<typename T>
6654b3ba8cf2eb4886a88cdb8adedb15f43333ff1dRichard Smith  struct Derived2 : Base {
6754b3ba8cf2eb4886a88cdb8adedb15f43333ff1dRichard Smith    Derived2() : BaseClass(1) {} // expected-error {{does not name a non-static data member or base}}
6854b3ba8cf2eb4886a88cdb8adedb15f43333ff1dRichard Smith  };
6954b3ba8cf2eb4886a88cdb8adedb15f43333ff1dRichard Smith
7054b3ba8cf2eb4886a88cdb8adedb15f43333ff1dRichard Smith  Derived1<void> d1;
7154b3ba8cf2eb4886a88cdb8adedb15f43333ff1dRichard Smith  Derived2<void> d2;
7254b3ba8cf2eb4886a88cdb8adedb15f43333ff1dRichard Smith}
73