diff options
author | Alexander Kornienko <alexfh@google.com> | 2013-01-30 03:49:44 +0000 |
---|---|---|
committer | Alexander Kornienko <alexfh@google.com> | 2013-01-30 03:49:44 +0000 |
commit | afed1ddb406afe00cb05360c5b8a01e42db3250d (patch) | |
tree | bad5ca554804cecba8c95fde77daf4a9e42efcac /clang/test/SemaCXX/switch-implicit-fallthrough.cpp | |
parent | 24f44ac53a2f1c578c50113d402a2cffacfe21d4 (diff) | |
download | bcm5719-llvm-afed1ddb406afe00cb05360c5b8a01e42db3250d.tar.gz bcm5719-llvm-afed1ddb406afe00cb05360c5b8a01e42db3250d.zip |
Don't warn on fall-through from unreachable code.
Summary:
A motivating example:
class ClassWithDtor {
public:
~ClassWithDtor() {}
};
void fallthrough3(int n) {
switch (n) {
case 2:
do {
ClassWithDtor temp;
return;
} while (0); // This generates a chain of unreachable CFG blocks.
case 3:
break;
}
}
Reviewers: rsmith, doug.gregor, alexfh
Reviewed By: alexfh
CC: cfe-commits
Differential Revision: http://llvm-reviews.chandlerc.com/D330
llvm-svn: 173889
Diffstat (limited to 'clang/test/SemaCXX/switch-implicit-fallthrough.cpp')
-rw-r--r-- | clang/test/SemaCXX/switch-implicit-fallthrough.cpp | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/clang/test/SemaCXX/switch-implicit-fallthrough.cpp b/clang/test/SemaCXX/switch-implicit-fallthrough.cpp index 93e724e86c6..912b21ebfdb 100644 --- a/clang/test/SemaCXX/switch-implicit-fallthrough.cpp +++ b/clang/test/SemaCXX/switch-implicit-fallthrough.cpp @@ -10,7 +10,7 @@ int fallthrough(int n) { } else if (n - 3) { n = 102; } - case -1: // expected-warning{{unannotated fall-through between switch labels}} expected-note{{insert '[[clang::fallthrough]];' to silence this warning}} expected-note{{insert 'break;' to avoid fall-through}} + case -1: // no warning here, ignore fall-through from unreachable code ; case 0: {// expected-warning{{unannotated fall-through between switch labels}} expected-note{{insert '[[clang::fallthrough]];' to silence this warning}} expected-note{{insert 'break;' to avoid fall-through}} } @@ -39,14 +39,13 @@ int fallthrough(int n) { break; } switch (n / 15) { -label_case_70: - case 70: +label_default: + default: n += 333; + if (n % 10) + goto label_default; break; - case 71: - n += 334; - goto label_case_70; - case 72: + case 70: n += 335; break; } @@ -130,6 +129,22 @@ void fallthrough2(int n) { } } +void fallthrough3(int n) { + switch (n) { + case 1: + do { + return; + } while (0); + case 2: + do { + ClassWithDtor temp; + return; + } while (0); + case 3: + break; + } +} + #define MY_SWITCH(X, Y, Z, U, V) switch (X) { case Y: Z; case U: V; } #define MY_SWITCH2(X, Y, Z) switch (X) { Y; Z; } #define MY_CASE(X, Y) case X: Y |