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-Tag: llvmorg-4.0.0-rc1~5993 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a99fa39c417a94d30e2c27d172cc007d09ae28cf;p=platform%2Fupstream%2Fllvm.git Fix handling of constructor inherited through multiple levels of virtual base class. llvm-svn: 285446 --- diff --git a/clang/include/clang/AST/DeclCXX.h b/clang/include/clang/AST/DeclCXX.h index f2b798b..357e075 100644 --- a/clang/include/clang/AST/DeclCXX.h +++ b/clang/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/clang/test/CXX/special/class.init/class.inhctor.init/p1.cpp b/clang/test/CXX/special/class.init/class.inhctor.init/p1.cpp index e07d879..1f43627 100644 --- a/clang/test/CXX/special/class.init/class.inhctor.init/p1.cpp +++ b/clang/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 {