From: Richard Smith Date: Fri, 28 Oct 2016 20:20:58 +0000 (+0000) Subject: Fix handling of constructor inherited through multiple levels of virtual base class. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c57ace48d79470adc64e1dfd0c50a86148da3a6a;p=clang Fix handling of constructor inherited through multiple levels of virtual base class. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@285446 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/DeclCXX.h b/include/clang/AST/DeclCXX.h index f2b798b5a3..357e075786 100644 --- a/include/clang/AST/DeclCXX.h +++ b/include/clang/AST/DeclCXX.h @@ -2957,11 +2957,10 @@ class ConstructorUsingShadowDecl final : public UsingShadowDecl { dyn_cast(Target)), ConstructedBaseClassShadowDecl(NominatedBaseClassShadowDecl), IsVirtual(TargetInVirtualBase) { - // If we found a constructor for a non-virtual base class, but it chains to - // a constructor for a virtual base, we should directly call the virtual - // base constructor instead. + // If we found a constructor that chains to a constructor for a virtual + // base, we should directly call that virtual base constructor instead. // FIXME: This logic belongs in Sema. - if (!TargetInVirtualBase && NominatedBaseClassShadowDecl && + if (NominatedBaseClassShadowDecl && NominatedBaseClassShadowDecl->constructsVirtualBase()) { ConstructedBaseClassShadowDecl = NominatedBaseClassShadowDecl->ConstructedBaseClassShadowDecl; diff --git a/test/CXX/special/class.init/class.inhctor.init/p1.cpp b/test/CXX/special/class.init/class.inhctor.init/p1.cpp index e07d879df8..1f4362740b 100644 --- a/test/CXX/special/class.init/class.inhctor.init/p1.cpp +++ b/test/CXX/special/class.init/class.inhctor.init/p1.cpp @@ -87,6 +87,13 @@ namespace vbase { D d2(0, 0); // expected-error {{deleted}} } +namespace vbase_of_vbase { + struct V { V(int); }; + struct W : virtual V { using V::V; }; + struct X : virtual W, virtual V { using W::W; }; + X x(0); +} + namespace constexpr_init_order { struct Param; struct A {