]> granicus.if.org Git - clang/commitdiff
Fix regression in -Wreturn-type caused by not
authorTed Kremenek <kremenek@apple.com>
Tue, 25 Jan 2011 22:50:47 +0000 (22:50 +0000)
committerTed Kremenek <kremenek@apple.com>
Tue, 25 Jan 2011 22:50:47 +0000 (22:50 +0000)
handling all CFGElement kinds.  While writing
the test case, it turned out that return-noreturn.cpp
wasn't actually testing anything since it has the wrong -W
flag.  That uncovered another regression with
the handling of destructors marked noreturn.  WIP.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@124238 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/AnalysisBasedWarnings.cpp
test/SemaCXX/return-noreturn-XFAIL.cpp [new file with mode: 0644]
test/SemaCXX/return-noreturn.cpp

index 4866c8fb3d01cb8bc6f14af9ea8f4fa40b012153..2f02e158cbd7c1d2ded50dbc9e46b12d8d7e5bd1 100644 (file)
@@ -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 (file)
index 0000000..ee76dcb
--- /dev/null
@@ -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;
+  }
+}
index f7072b21771ea989fa81250455c2e25e40f52a53..5045d1b4c3d3cca0d64de84c81fd3c98b2d5af5c 100644 (file)
@@ -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}}