diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp index de02418076503..fcdfe19bd8443 100644 --- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp +++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp @@ -865,6 +865,11 @@ bool ByteCodeExprGen::VisitMaterializeTemporaryExpr( const Expr *SubExpr = E->getSubExpr(); std::optional SubExprT = classify(SubExpr); + // If we don't end up using the materialized temporary anyway, don't + // bother creating it. + if (DiscardResult) + return this->discard(SubExpr); + if (E->getStorageDuration() == SD_Static) { if (std::optional GlobalIndex = P.createGlobal(E)) { const LifetimeExtendedTemporaryDecl *TempDecl = diff --git a/clang/test/AST/Interp/literals.cpp b/clang/test/AST/Interp/literals.cpp index ad0adc23b42e4..505ab8fc764f1 100644 --- a/clang/test/AST/Interp/literals.cpp +++ b/clang/test/AST/Interp/literals.cpp @@ -890,7 +890,9 @@ constexpr int ignoredExprs() { 1 ? 0 : 1; // expected-warning {{unused}} \ // ref-warning {{unused}} - + /// Ignored MaterializeTemporaryExpr. + struct B{ const int &a; }; + (void)B{12}; return 0; }