]> granicus.if.org Git - clang/commitdiff
Fix handling of constructor inherited through multiple levels of virtual base class.
authorRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 28 Oct 2016 20:20:58 +0000 (20:20 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 28 Oct 2016 20:20:58 +0000 (20:20 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@285446 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/DeclCXX.h
test/CXX/special/class.init/class.inhctor.init/p1.cpp

index f2b798b5a35ac8a4d8dc69ed5d7171e84a1fcac9..357e075786e46711ac1b55da1f9061573e8efe4b 100644 (file)
@@ -2957,11 +2957,10 @@ class ConstructorUsingShadowDecl final : public UsingShadowDecl {
             dyn_cast<ConstructorUsingShadowDecl>(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;
index e07d879df8f1c30a349fa899a08c91782e531f0e..1f4362740b00e037a1cbefd3fb3cacb1204e842b 100644 (file)
@@ -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 {