Forráskód Böngészése

[c++2a] Fix assertion failure if we would walk over more than one level
of derived-to-base conversion path when implicitly starting union
subobject lifetimes in constant evaluation.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@362147 91177308-0d34-0410-b5e6-96231b3b80d8

Richard Smith 6 éve
szülő
commit
d2c6411c22
2 módosított fájl, 12 hozzáadás és 1 törlés
  1. 2 1
      lib/AST/ExprConstant.cpp
  2. 10 0
      test/SemaCXX/constant-expression-cxx2a.cpp

+ 2 - 1
lib/AST/ExprConstant.cpp

@@ -5031,7 +5031,8 @@ static bool HandleUnionActiveMemberChange(EvalInfo &Info, const Expr *LHSExpr,
       if (ICE->getCastKind() != CK_DerivedToBase &&
           ICE->getCastKind() != CK_UncheckedDerivedToBase)
         break;
-      for (const CXXBaseSpecifier *Elt : ICE->path()) {
+      // Walk path backwards as we walk up from the base to the derived class.
+      for (const CXXBaseSpecifier *Elt : llvm::reverse(ICE->path())) {
         --PathLength;
         (void)Elt;
         assert(declaresSameEntity(Elt->getType()->getAsCXXRecordDecl(),

+ 10 - 0
test/SemaCXX/constant-expression-cxx2a.cpp

@@ -521,4 +521,14 @@ namespace Union {
     u1 = u2;
     return true;
   }();
+
+  struct S1 {
+    int n;
+  };
+  struct S2 : S1 {};
+  struct S3 : S2 {};
+  void f() {
+    S3 s;
+    s.n = 0;
+  }
 }