r361571 - Fix hang during constant evaluation of union assignment.
Eric Fiselier via cfe-commits
cfe-commits at lists.llvm.org
Thu May 23 16:34:43 PDT 2019
Author: ericwf
Date: Thu May 23 16:34:43 2019
New Revision: 361571
URL: http://llvm.org/viewvc/llvm-project?rev=361571&view=rev
Log:
Fix hang during constant evaluation of union assignment.
HandleUnionActiveMemberChange forgot to walk over a nop implicit
conversion node and got stuck in the process.
As a cleanup I changed the declaration of `E` so it can't
be accidentally accessed after the loop.
Modified:
cfe/trunk/lib/AST/ExprConstant.cpp
cfe/trunk/test/SemaCXX/constant-expression-cxx2a.cpp
Modified: cfe/trunk/lib/AST/ExprConstant.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=361571&r1=361570&r2=361571&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ExprConstant.cpp (original)
+++ cfe/trunk/lib/AST/ExprConstant.cpp Thu May 23 16:34:43 2019
@@ -4994,9 +4994,8 @@ static bool HandleUnionActiveMemberChang
llvm::SmallVector<std::pair<unsigned, const FieldDecl*>, 4> UnionPathLengths;
// C++ [class.union]p5:
// define the set S(E) of subexpressions of E as follows:
- const Expr *E = LHSExpr;
unsigned PathLength = LHS.Designator.Entries.size();
- while (E) {
+ for (const Expr *E = LHSExpr; E != nullptr;) {
// -- If E is of the form A.B, S(E) contains the elements of S(A)...
if (auto *ME = dyn_cast<MemberExpr>(E)) {
auto *FD = dyn_cast<FieldDecl>(ME->getMemberDecl());
@@ -5026,6 +5025,7 @@ static bool HandleUnionActiveMemberChang
} else if (auto *ICE = dyn_cast<ImplicitCastExpr>(E)) {
// Step over a derived-to-base conversion.
+ E = ICE->getSubExpr();
if (ICE->getCastKind() == CK_NoOp)
continue;
if (ICE->getCastKind() != CK_DerivedToBase &&
@@ -5038,7 +5038,6 @@ static bool HandleUnionActiveMemberChang
LHS.Designator.Entries[PathLength]
.getAsBaseOrMember().getPointer()));
}
- E = ICE->getSubExpr();
// -- Otherwise, S(E) is empty.
} else {
Modified: cfe/trunk/test/SemaCXX/constant-expression-cxx2a.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/constant-expression-cxx2a.cpp?rev=361571&r1=361570&r2=361571&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/constant-expression-cxx2a.cpp (original)
+++ cfe/trunk/test/SemaCXX/constant-expression-cxx2a.cpp Thu May 23 16:34:43 2019
@@ -513,4 +513,12 @@ namespace Union {
static_assert(return_init_all().a.p == 7); // expected-error {{}} expected-note {{read of member 'p' of union with no active member}}
static_assert(return_init_all().a.q == 8); // expected-error {{}} expected-note {{read of member 'q' of union with no active member}}
constexpr B init_all = return_init_all();
+
+ constexpr bool test_no_member_change = []{
+ union U { char dummy = {}; };
+ U u1;
+ U u2;
+ u1 = u2;
+ return true;
+ }();
}
More information about the cfe-commits
mailing list