diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2016-09-28 19:09:10 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2016-09-28 19:09:10 +0000 |
commit | 762672a73a1ece353c7058621ab6593757bc03d0 (patch) | |
tree | cec5c5121aed025fe3e24f5b9f1e042600f26537 /clang/lib/CodeGen/CGExpr.cpp | |
parent | 10d0abb5155320ff9a69cc5a9a0d9de4ef42854f (diff) | |
download | bcm5719-llvm-762672a73a1ece353c7058621ab6593757bc03d0.tar.gz bcm5719-llvm-762672a73a1ece353c7058621ab6593757bc03d0.zip |
Re-commit r282556, reverted in r282564, with a fix to CallArgList::addFrom to
function correctly when targeting MS ABIs (this appears to have never mattered
prior to this change).
Update test case to always cover both 32-bit and 64-bit Windows ABIs, since
they behave somewhat differently from each other here.
Update test case to also cover operators , && and ||, which it appears are also
affected by P0145R3 (they're not explicitly called out by the design document,
but this is the emergent behavior of the existing wording).
Original commit message:
P0145R3 (C++17 evaluation order tweaks): evaluate the right-hand side of
assignment and compound-assignment operators before the left-hand side. (Even
if it's an overloaded operator.)
This completes the implementation of P0145R3 + P0400R0 for all targets except
Windows, where the evaluation order guarantees for <<, >>, and ->* are
unimplementable as the ABI requires the function arguments are evaluated from
right to left (because parameter destructors are run from left to right in the
callee).
llvm-svn: 282619
Diffstat (limited to 'clang/lib/CodeGen/CGExpr.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGExpr.cpp | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index bca711fbc8c..63aa3467850 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -4121,8 +4121,17 @@ RValue CodeGenFunction::EmitCall(QualType CalleeType, llvm::Value *Callee, if (Chain) Args.add(RValue::get(Builder.CreateBitCast(Chain, CGM.VoidPtrTy)), CGM.getContext().VoidPtrTy); + + // C++17 requires that we evaluate arguments to a call using assignment syntax + // right-to-left. It also requires that we evaluate arguments to operators + // <<, >>, and ->* left-to-right, but that is not possible under the MS ABI, + // so there is no corresponding "force left-to-right" case. + bool ForceRightToLeft = false; + if (auto *OCE = dyn_cast<CXXOperatorCallExpr>(E)) + ForceRightToLeft = OCE->isAssignmentOp(); + EmitCallArgs(Args, dyn_cast<FunctionProtoType>(FnType), E->arguments(), - E->getDirectCallee(), /*ParamsToSkip*/ 0); + E->getDirectCallee(), /*ParamsToSkip*/ 0, ForceRightToLeft); const CGFunctionInfo &FnInfo = CGM.getTypes().arrangeFreeFunctionCall( Args, FnType, /*isChainCall=*/Chain); |