[PATCH] D136457: [clang][Interp] Fix discarding non-primitive function call return values
Timm Bäder via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Nov 30 00:19:03 PST 2022
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rGafa60d08a2d4: [clang][Interp] Fix discarding non-primitive function call return values (authored by tbaeder).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D136457/new/
https://reviews.llvm.org/D136457
Files:
clang/lib/AST/Interp/ByteCodeExprGen.cpp
clang/test/AST/Interp/records.cpp
Index: clang/test/AST/Interp/records.cpp
===================================================================
--- clang/test/AST/Interp/records.cpp
+++ clang/test/AST/Interp/records.cpp
@@ -228,6 +228,10 @@
this->a; // expected-warning {{expression result unused}} \
// ref-warning {{expression result unused}}
get5();
+#if __cplusplus >= 201703L
+ // FIXME: Enable once we support MaterializeConstantExpr properly.
+ getInts();
+#endif
}
constexpr int m() const {
Index: clang/lib/AST/Interp/ByteCodeExprGen.cpp
===================================================================
--- clang/lib/AST/Interp/ByteCodeExprGen.cpp
+++ clang/lib/AST/Interp/ByteCodeExprGen.cpp
@@ -1150,6 +1150,19 @@
if (Func->isFullyCompiled() && !Func->isConstexpr())
return false;
+ QualType ReturnType = E->getCallReturnType(Ctx.getASTContext());
+ Optional<PrimType> T = classify(ReturnType);
+
+ if (Func->hasRVO() && DiscardResult) {
+ // If we need to discard the return value but the function returns its
+ // value via an RVO pointer, we need to create one such pointer just
+ // for this call.
+ if (Optional<unsigned> LocalIndex = allocateLocal(E)) {
+ if (!this->emitGetPtrLocal(*LocalIndex, E))
+ return false;
+ }
+ }
+
// Put arguments on the stack.
for (const auto *Arg : E->arguments()) {
if (!this->visit(Arg))
@@ -1162,13 +1175,8 @@
if (!this->emitCall(Func, E))
return false;
- QualType ReturnType = E->getCallReturnType(Ctx.getASTContext());
- if (DiscardResult && !ReturnType->isVoidType()) {
- Optional<PrimType> T = classify(ReturnType);
- if (T)
- return this->emitPop(*T, E);
- // TODO: This is a RVO function and we need to ignore the return value.
- }
+ if (DiscardResult && !ReturnType->isVoidType() && T)
+ return this->emitPop(*T, E);
return true;
} else {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D136457.478832.patch
Type: text/x-patch
Size: 1950 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20221130/1601c704/attachment.bin>
More information about the cfe-commits
mailing list