aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2011-01-08 06:54:40 +0000
committerChandler Carruth <chandlerc@gmail.com>2011-01-08 06:54:40 +0000
commiteeef924c4fcb79a3bcc8782afce343e641bbcb83 (patch)
tree94d4305e20f84a4daca05751041eeac3f1a72f80
parent65197b4b0c55bb74af0450230d61ee9461223721 (diff)
Remove a kludge from analysis based warnings that used to detect
temporaries with no-return destructors. The CFG now properly supports temporaries and implicit destructors which both makes this kludge no longer work, and conveniently removes the need for it. Turn on CFG handling of implicit destructors and initializers. Several ad-hoc benchmarks don't indicate any measurable performance impact from growing the CFG, and it fixes real correctness problems with warnings. As a result of turning on these CFG elements, we started to tickle an inf-loop in the unreachable code logic used for warnings. The fix is trivial. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123056 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Analysis/ReachableCode.cpp5
-rw-r--r--lib/Sema/AnalysisBasedWarnings.cpp16
-rw-r--r--test/SemaCXX/return-noreturn.cpp7
3 files changed, 6 insertions, 22 deletions
diff --git a/lib/Analysis/ReachableCode.cpp b/lib/Analysis/ReachableCode.cpp
index b9585800c9..802b990143 100644
--- a/lib/Analysis/ReachableCode.cpp
+++ b/lib/Analysis/ReachableCode.cpp
@@ -30,12 +30,11 @@ static SourceLocation GetUnreachableLoc(const CFGBlock &b, SourceRange &R1,
unsigned sn = 0;
R1 = R2 = SourceRange();
-top:
if (sn < b.size()) {
CFGStmt CS = b[sn].getAs<CFGStmt>();
if (!CS)
- goto top;
-
+ return SourceLocation();
+
S = CS.getStmt();
} else if (b.getTerminator())
S = b.getTerminator();
diff --git a/lib/Sema/AnalysisBasedWarnings.cpp b/lib/Sema/AnalysisBasedWarnings.cpp
index f4fde40bfb..20a503d6a5 100644
--- a/lib/Sema/AnalysisBasedWarnings.cpp
+++ b/lib/Sema/AnalysisBasedWarnings.cpp
@@ -177,19 +177,6 @@ static ControlFlowKind CheckFallThrough(AnalysisContext &AC) {
}
}
}
- // FIXME: Remove this hack once temporaries and their destructors are
- // modeled correctly by the CFG.
- if (ExprWithCleanups *E = dyn_cast<ExprWithCleanups>(S)) {
- for (unsigned I = 0, N = E->getNumTemporaries(); I != N; ++I) {
- const FunctionDecl *FD = E->getTemporary(I)->getDestructor();
- if (FD->hasAttr<NoReturnAttr>() ||
- FD->getType()->getAs<FunctionType>()->getNoReturnAttr()) {
- NoReturnEdge = true;
- HasFakeEdge = true;
- break;
- }
- }
- }
// FIXME: Add noreturn message sends.
if (NoReturnEdge == false)
HasPlainEdge = true;
@@ -405,7 +392,8 @@ AnalysisBasedWarnings::IssueWarnings(sema::AnalysisBasedWarnings::Policy P,
// Don't generate EH edges for CallExprs as we'd like to avoid the n^2
// explosion for destrutors that can result and the compile time hit.
- AnalysisContext AC(D, 0, false);
+ AnalysisContext AC(D, 0, /*useUnoptimizedCFG=*/false, /*addehedges=*/false,
+ /*addImplicitDtors=*/true, /*addInitializers=*/true);
// Warning: check missing 'return'
if (P.enableCheckFallThrough) {
diff --git a/test/SemaCXX/return-noreturn.cpp b/test/SemaCXX/return-noreturn.cpp
index dfd5487321..f7072b2177 100644
--- a/test/SemaCXX/return-noreturn.cpp
+++ b/test/SemaCXX/return-noreturn.cpp
@@ -7,14 +7,11 @@ namespace PR6884 {
~abort_struct() __attribute__((noreturn));
};
- // FIXME: Should either of these actually warn, since the destructor is
- // marked noreturn?
-
int f() {
abort_struct();
- } // expected-warning{{control reaches end of non-void function}}
+ }
int f2() {
abort_struct s;
- } // expected-warning{{control reaches end of non-void function}}
+ }
}