git: 42e66f29f5b2 - stable/12 - Apply clang fix for assertion failure building webkit2-gtk
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 31 May 2022 15:55:48 UTC
The branch stable/12 has been updated by dim: URL: https://cgit.FreeBSD.org/src/commit/?id=42e66f29f5b24297366c60ea5d0c6e3537dd2f21 commit 42e66f29f5b24297366c60ea5d0c6e3537dd2f21 Author: Dimitry Andric <dim@FreeBSD.org> AuthorDate: 2022-05-27 17:43:39 +0000 Commit: Dimitry Andric <dim@FreeBSD.org> CommitDate: 2022-05-31 13:16:40 +0000 Apply clang fix for assertion failure building webkit2-gtk Merge commit 30baa5d2a450 from llvm git (by Richard Smith): PR45879: Fix assert when constant evaluating union assignment. Consider the form of the first operand of a class assignment not the second operand when implicitly starting the lifetimes of union members. Also add a missing check that the assignment call actually came from a syntactic assignment, not from a direct call to `operator=`. PR: 264280 Reported by: bapt MFC after: 3 days (cherry picked from commit eca6e0f7e460bf9a4a6e1bd5198d75168280c88e) --- contrib/llvm-project/clang/lib/AST/ExprConstant.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/contrib/llvm-project/clang/lib/AST/ExprConstant.cpp b/contrib/llvm-project/clang/lib/AST/ExprConstant.cpp index ba2865d66e0a..8cdef3c3fa04 100644 --- a/contrib/llvm-project/clang/lib/AST/ExprConstant.cpp +++ b/contrib/llvm-project/clang/lib/AST/ExprConstant.cpp @@ -6097,9 +6097,6 @@ static bool HandleFunctionCall(SourceLocation CallLoc, if (!handleTrivialCopy(Info, MD->getParamDecl(0), Args[0], RHSValue, MD->getParent()->isUnion())) return false; - if (Info.getLangOpts().CPlusPlus20 && MD->isTrivial() && - !HandleUnionActiveMemberChange(Info, Args[0], *This)) - return false; if (!handleAssignment(Info, Args[0], *This, MD->getThisType(), RHSValue)) return false; @@ -7611,6 +7608,15 @@ public: if (!EvaluateObjectArgument(Info, Args[0], ThisVal)) return false; This = &ThisVal; + + // If this is syntactically a simple assignment using a trivial + // assignment operator, start the lifetimes of union members as needed, + // per C++20 [class.union]5. + if (Info.getLangOpts().CPlusPlus20 && OCE && + OCE->getOperator() == OO_Equal && MD->isTrivial() && + !HandleUnionActiveMemberChange(Info, Args[0], ThisVal)) + return false; + Args = Args.slice(1); } else if (MD && MD->isLambdaStaticInvoker()) { // Map the static invoker for the lambda back to the call operator.