Skip to content

Commit

Permalink
[clang][Interp] Fix discarding non-primitive function call return values
Browse files Browse the repository at this point in the history
Differential Revision: https://reviews.llvm.org/D136457
  • Loading branch information
tbaederr committed Nov 30, 2022
1 parent 2b6910e commit afa60d0
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 7 deletions.
22 changes: 15 additions & 7 deletions clang/lib/AST/Interp/ByteCodeExprGen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1150,6 +1150,19 @@ bool ByteCodeExprGen<Emitter>::VisitCallExpr(const CallExpr *E) {
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))
Expand All @@ -1162,13 +1175,8 @@ bool ByteCodeExprGen<Emitter>::VisitCallExpr(const CallExpr *E) {
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 {
Expand Down
4 changes: 4 additions & 0 deletions clang/test/AST/Interp/records.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,10 @@ struct S {
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 {
Expand Down

0 comments on commit afa60d0

Please sign in to comment.