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
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;
--- /dev/null
+// 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;
+ }
+}
-// 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}}