aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Sema/AnalysisBasedWarnings.cpp15
-rw-r--r--test/SemaCXX/return-noreturn-XFAIL.cpp18
-rw-r--r--test/SemaCXX/return-noreturn.cpp24
3 files changed, 30 insertions, 27 deletions
diff --git a/lib/Sema/AnalysisBasedWarnings.cpp b/lib/Sema/AnalysisBasedWarnings.cpp
index 4866c8fb3d..2f02e158cb 100644
--- a/lib/Sema/AnalysisBasedWarnings.cpp
+++ b/lib/Sema/AnalysisBasedWarnings.cpp
@@ -132,21 +132,12 @@ static ControlFlowKind CheckFallThrough(AnalysisContext &AC) {
continue;
}
CFGElement CE = B[B.size()-1];
- if (CFGInitializer CI = CE.getAs<CFGInitializer>()) {
- // A base or member initializer.
- HasPlainEdge = true;
- continue;
- }
- if (CFGMemberDtor MD = CE.getAs<CFGMemberDtor>()) {
- // A member destructor.
- HasPlainEdge = true;
- continue;
- }
- if (CFGBaseDtor BD = CE.getAs<CFGBaseDtor>()) {
- // A base destructor.
+
+ if (!isa<CFGStmt>(CE)) {
HasPlainEdge = true;
continue;
}
+
CFGStmt CS = CE.getAs<CFGStmt>();
if (!CS.isValid())
continue;
diff --git a/test/SemaCXX/return-noreturn-XFAIL.cpp b/test/SemaCXX/return-noreturn-XFAIL.cpp
new file mode 100644
index 0000000000..ee76dcb270
--- /dev/null
+++ b/test/SemaCXX/return-noreturn-XFAIL.cpp
@@ -0,0 +1,18 @@
+// RUN: %clang_cc1 %s -fsyntax-only -verify -Wreturn-type -Wno-unreachable-code
+// XFAIL: *
+
+// A destructor may be marked noreturn and should still influence the CFG.
+namespace PR6884 {
+ struct abort_struct {
+ abort_struct() {} // Make this non-POD so the destructor is invoked.
+ ~abort_struct() __attribute__((noreturn));
+ };
+
+ int f() {
+ abort_struct();
+ }
+
+ int f2() {
+ abort_struct s;
+ }
+}
diff --git a/test/SemaCXX/return-noreturn.cpp b/test/SemaCXX/return-noreturn.cpp
index f7072b2177..5045d1b4c3 100644
--- a/test/SemaCXX/return-noreturn.cpp
+++ b/test/SemaCXX/return-noreturn.cpp
@@ -1,17 +1,11 @@
-// RUN: %clang_cc1 %s -fsyntax-only -verify -Wmissing-noreturn -Wno-unreachable-code
+// RUN: %clang_cc1 %s -fsyntax-only -verify -Wreturn-type -Wno-unreachable-code
-// A destructor may be marked noreturn and should still influence the CFG.
-namespace PR6884 {
- struct abort_struct {
- abort_struct() {} // Make this non-POD so the destructor is invoked.
- ~abort_struct() __attribute__((noreturn));
- };
+// <rdar://problem/8875247> - Properly handle CFGs with destructors.
+struct rdar8875247 {
+ ~rdar8875247 ();
+};
+void rdar8875247_aux();
- int f() {
- abort_struct();
- }
-
- int f2() {
- abort_struct s;
- }
-}
+int rdar8875247_test() {
+ rdar8875247 f;
+} // expected-warning{{control reaches end of non-void function}}