timshen created this revision. timshen added a reviewer: rsmith. timshen added a subscriber: cfe-commits.
Before r272296, the assertion was !ExprNeedsCleanups, which means that there is no cleanups (with dtor calls). It should still check so after r272296. This fixes pr30306. https://reviews.llvm.org/D24333 Files: clang/lib/Sema/SemaDecl.cpp clang/lib/Sema/SemaExpr.cpp clang/lib/Sema/SemaExprCXX.cpp clang/test/SemaCXX/cleanup-side-effects-assert.cpp 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 <typename T> +void g(T) { int a[f(3)]; } // expected-no-diagnostics + +int main() { + g<int>(2); + return 0; +} 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/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/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/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 <typename T> +void g(T) { int a[f(3)]; } // expected-no-diagnostics + +int main() { + g<int>(2); + return 0; +} 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/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/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"); }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits