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
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits