// RUN: %clang_cc1 -fsyntax-only -verify %s namespace PR6631 { struct A { virtual void f() = 0; }; struct B : virtual A { }; struct C : virtual A { virtual void f(); }; struct D : public B, public C { virtual void f(); }; void f() { (void)new D; // okay } } // Check cases where we have a virtual function that is pure in one // subobject but not pure in another subobject. namespace PartlyPure { struct A { virtual void f() = 0; // expected-note{{unimplemented pure virtual method}} }; struct B : A { virtual void f(); }; struct C : virtual A { }; struct D : B, C { }; void f() { (void) new D; // expected-error{{abstract class}} } } namespace NonPureAlongOnePath { struct A { virtual void f() = 0; }; struct B : virtual A { virtual void f(); }; struct C : virtual A { }; struct D : B, C { }; void f() { (void) new D; // okay } } namespace NonPureAlongOnePath2 { struct Aprime { virtual void f() = 0; }; struct A : Aprime { }; struct B : virtual A { virtual void f(); }; struct C : virtual A { }; struct D : B, C { }; void f() { (void) new D; // okay } }