Home | History | Annotate | Download | only in class.abstract
      1 // RUN: %clang_cc1 -fsyntax-only -verify %s
      2 
      3 namespace PR6631 {
      4   struct A {
      5     virtual void f() = 0;
      6   };
      7 
      8   struct B : virtual A { };
      9 
     10   struct C : virtual A {
     11     virtual void f();
     12   };
     13 
     14   struct D : public B, public C {
     15     virtual void f();
     16   };
     17 
     18   void f() {
     19     (void)new D; // okay
     20   }
     21 }
     22 
     23 // Check cases where we have a virtual function that is pure in one
     24 // subobject but not pure in another subobject.
     25 namespace PartlyPure {
     26   struct A {
     27     virtual void f() = 0; // expected-note{{unimplemented pure virtual method}}
     28   };
     29 
     30   struct B : A {
     31     virtual void f();
     32   };
     33 
     34   struct C : virtual A { };
     35 
     36   struct D : B, C { };
     37 
     38   void f() {
     39     (void) new D; // expected-error{{abstract class}}
     40   }
     41 }
     42 
     43 namespace NonPureAlongOnePath {
     44   struct A {
     45     virtual void f() = 0;
     46   };
     47 
     48   struct B : virtual A {
     49     virtual void f();
     50   };
     51 
     52   struct C : virtual A { };
     53 
     54   struct D : B, C { };
     55 
     56   void f() {
     57     (void) new D; // okay
     58   }
     59 }
     60 
     61 namespace NonPureAlongOnePath2 {
     62   struct Aprime {
     63     virtual void f() = 0;
     64   };
     65 
     66   struct A : Aprime {
     67   };
     68 
     69   struct B : virtual A {
     70     virtual void f();
     71   };
     72 
     73   struct C : virtual A { };
     74 
     75   struct D : B, C { };
     76 
     77   void f() {
     78     (void) new D; // okay
     79   }
     80 }
     81