diff options
-rw-r--r-- | lib/Sema/AnalysisBasedWarnings.cpp | 15 | ||||
-rw-r--r-- | test/SemaCXX/return-noreturn-XFAIL.cpp | 18 | ||||
-rw-r--r-- | test/SemaCXX/return-noreturn.cpp | 24 |
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}} |