116d482ebe8abb5a8eaf5d3407e90c96e6afa397bEric Christopher// RUN: %clang_cc1 -emit-llvm -o - %s
216d482ebe8abb5a8eaf5d3407e90c96e6afa397bEric Christopher
316d482ebe8abb5a8eaf5d3407e90c96e6afa397bEric Christopherstruct A {
416d482ebe8abb5a8eaf5d3407e90c96e6afa397bEric Christopher   virtual ~A();
516d482ebe8abb5a8eaf5d3407e90c96e6afa397bEric Christopher};
616d482ebe8abb5a8eaf5d3407e90c96e6afa397bEric Christopher
716d482ebe8abb5a8eaf5d3407e90c96e6afa397bEric Christophertemplate <typename Ty>
816d482ebe8abb5a8eaf5d3407e90c96e6afa397bEric Christopherstruct B : public A {
916d482ebe8abb5a8eaf5d3407e90c96e6afa397bEric Christopher   ~B () { delete [] val; }
1016d482ebe8abb5a8eaf5d3407e90c96e6afa397bEric Christopherprivate:
1116d482ebe8abb5a8eaf5d3407e90c96e6afa397bEric Christopher     Ty* val;
1216d482ebe8abb5a8eaf5d3407e90c96e6afa397bEric Christopher};
1316d482ebe8abb5a8eaf5d3407e90c96e6afa397bEric Christopher
1416d482ebe8abb5a8eaf5d3407e90c96e6afa397bEric Christophertemplate <typename Ty>
1516d482ebe8abb5a8eaf5d3407e90c96e6afa397bEric Christopherstruct C : public A {
1616d482ebe8abb5a8eaf5d3407e90c96e6afa397bEric Christopher   C ();
1716d482ebe8abb5a8eaf5d3407e90c96e6afa397bEric Christopher   ~C ();
1816d482ebe8abb5a8eaf5d3407e90c96e6afa397bEric Christopher};
1916d482ebe8abb5a8eaf5d3407e90c96e6afa397bEric Christopher
2016d482ebe8abb5a8eaf5d3407e90c96e6afa397bEric Christophertemplate <typename Ty>
2116d482ebe8abb5a8eaf5d3407e90c96e6afa397bEric Christopherstruct D : public A {
2216d482ebe8abb5a8eaf5d3407e90c96e6afa397bEric Christopher     D () {}
2316d482ebe8abb5a8eaf5d3407e90c96e6afa397bEric Christopher   private:
2416d482ebe8abb5a8eaf5d3407e90c96e6afa397bEric Christopher     B<C<Ty> > blocks;
2516d482ebe8abb5a8eaf5d3407e90c96e6afa397bEric Christopher};
2616d482ebe8abb5a8eaf5d3407e90c96e6afa397bEric Christopher
2716d482ebe8abb5a8eaf5d3407e90c96e6afa397bEric Christophertemplate class D<double>;
28