Index: clang/lib/AST/Interp/ByteCodeExprGen.cpp =================================================================== --- clang/lib/AST/Interp/ByteCodeExprGen.cpp +++ clang/lib/AST/Interp/ByteCodeExprGen.cpp @@ -894,6 +894,11 @@ 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) { std::optional GlobalIndex = P.createGlobal(E); if (!GlobalIndex) Index: clang/test/AST/Interp/literals.cpp =================================================================== --- clang/test/AST/Interp/literals.cpp +++ clang/test/AST/Interp/literals.cpp @@ -920,6 +920,10 @@ (short)5; (bool)1; + /// Ignored MaterializeTemporaryExpr. + struct B{ const int &a; }; + (B{12}, 0); + return 0; } static_assert(ignoredExprs() == 0, "");