mirror of
https://git.FreeBSD.org/src.git
synced 2024-11-29 08:08:37 +00:00
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
This commit is contained in:
parent
d59bc188d6
commit
eca6e0f7e4
@ -6127,9 +6127,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;
|
||||
@ -7641,6 +7638,15 @@ class ExprEvaluatorBase
|
||||
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.
|
||||
|
Loading…
Reference in New Issue
Block a user