Index: clang/lib/Sema/SemaDecl.cpp =================================================================== --- clang/lib/Sema/SemaDecl.cpp +++ clang/lib/Sema/SemaDecl.cpp @@ -11830,7 +11830,8 @@ assert(ExprCleanupObjects.size() == ExprEvalContexts.back().NumCleanupObjects && "Leftover temporaries in function"); - assert(!Cleanup.exprNeedsCleanups() && "Unaccounted cleanups in function"); + assert(!Cleanup.cleanupsHaveSideEffects() && + "Unaccounted cleanups in function"); assert(MaybeODRUseExprs.empty() && "Leftover expressions for odr-use checking"); } Index: clang/lib/Sema/SemaExpr.cpp =================================================================== --- clang/lib/Sema/SemaExpr.cpp +++ clang/lib/Sema/SemaExpr.cpp @@ -11736,7 +11736,7 @@ if (hasAnyUnrecoverableErrorsInThisFunction()) DiscardCleanupsInEvaluationContext(); - assert(!Cleanup.exprNeedsCleanups() && + assert(!Cleanup.cleanupsHaveSideEffects() && "cleanups within StmtExpr not correctly bound!"); PopExpressionEvaluationContext(); @@ -12204,7 +12204,7 @@ // Leave the expression-evaluation context. if (hasAnyUnrecoverableErrorsInThisFunction()) DiscardCleanupsInEvaluationContext(); - assert(!Cleanup.exprNeedsCleanups() && + assert(!Cleanup.cleanupsHaveSideEffects() && "cleanups within block not correctly bound!"); PopExpressionEvaluationContext(); Index: clang/lib/Sema/SemaExprCXX.cpp =================================================================== --- clang/lib/Sema/SemaExprCXX.cpp +++ clang/lib/Sema/SemaExprCXX.cpp @@ -5746,7 +5746,7 @@ unsigned FirstCleanup = ExprEvalContexts.back().NumCleanupObjects; assert(ExprCleanupObjects.size() >= FirstCleanup); - assert(Cleanup.exprNeedsCleanups() || + assert(Cleanup.cleanupsHaveSideEffects() || ExprCleanupObjects.size() == FirstCleanup); if (!Cleanup.exprNeedsCleanups()) return SubExpr; Index: clang/test/SemaCXX/cleanup-side-effects-assert.cpp =================================================================== --- /dev/null +++ clang/test/SemaCXX/cleanup-side-effects-assert.cpp @@ -0,0 +1,14 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s +int f(int const &p) { return p; } + +struct A { + ~A(); +}; + +template +void g(T) { int a[f(3)]; } // expected-no-diagnostics + +int main() { + g(2); + return 0; +}