[PATCH] Fix "warning: fallthrough annotation does not directly precede switch label" in lambdas.
Aaron Ballman
aaron at aaronballman.com
Mon Jun 23 10:04:11 PDT 2014
> Index: lib/Sema/AnalysisBasedWarnings.cpp
> ===================================================================
> --- lib/Sema/AnalysisBasedWarnings.cpp
> +++ lib/Sema/AnalysisBasedWarnings.cpp
> @@ -1025,6 +1025,9 @@
> // methods separately.
> bool TraverseDecl(Decl *D) { return true; }
>
> + // We analyze lambda bodies separately. Skip them here.
> + bool TraverseLambdaBody(LambdaExpr *LE) { return true; }
> +
> private:
>
> static const AttributedStmt *asFallThroughAttr(const Stmt *S) {
> @@ -1084,6 +1087,9 @@
> if (PerFunction && FM.getFallthroughStmts().empty())
> return;
>
> + llvm::errs() << "DiagnoseSwitchLabelsFallthrough: \n";
> + AC.getBody()->dumpColor();
This looks like debugging code that should likely go away.
> +
> CFG *Cfg = AC.getCFG();
>
> if (!Cfg)
> Index: test/SemaCXX/switch-implicit-fallthrough.cpp
> ===================================================================
> --- test/SemaCXX/switch-implicit-fallthrough.cpp
> +++ test/SemaCXX/switch-implicit-fallthrough.cpp
> @@ -229,25 +229,6 @@
> return n;
> }
>
> -int fallthrough_targets(int n) {
> - [[clang::fallthrough]]; // expected-error{{fallthrough annotation is outside switch statement}}
> -
> - [[clang::fallthrough]] // expected-error{{fallthrough attribute is only allowed on empty statements}}
> - switch (n) {
> - case 121:
> - n += 400;
> - [[clang::fallthrough]]; // no warning here, correct target
> - case 123:
> - [[clang::fallthrough]] // expected-error{{fallthrough attribute is only allowed on empty statements}}
> - n += 800;
> - break;
> - [[clang::fallthrough]] // expected-error{{fallthrough attribute is only allowed on empty statements}} expected-note{{did you forget ';'?}}
> - case 125:
> - n += 1600;
> - }
> - return n;
> -}
Why did this test move within the file?
> -
> // Fallthrough annotations in local classes used to generate "fallthrough
> // annotation does not directly precede switch label" warning.
> void fallthrough_in_local_class() {
> @@ -259,12 +240,34 @@
> [[clang::fallthrough]]; // no diagnostics
> case 1:
> x++;
> + default: // \
> + expected-warning{{unannotated fall-through between switch labels}} \
> + expected-note{{insert 'break;' to avoid fall-through}}
> break;
> }
> }
> };
> }
>
> +// Fallthrough annotations in lambdas used to generate "fallthrough
> +// annotation does not directly precede switch label" warning.
> +void fallthrough_in_lambda() {
> + (void)[] {
> + int x = 0;
> + switch (x) {
> + case 0:
> + x++;
> + [[clang::fallthrough]]; // no diagnostics
> + case 1:
> + x++;
> + default: // \
> + expected-warning{{unannotated fall-through between switch labels}} \
> + expected-note{{insert 'break;' to avoid fall-through}}
> + break;
> + }
> + };
> +}
> +
> namespace PR18983 {
> void fatal() __attribute__((noreturn));
> int num();
> @@ -278,3 +281,22 @@
> }
> }
> }
> +
> +int fallthrough_targets(int n) {
> + [[clang::fallthrough]]; // expected-error{{fallthrough annotation is outside switch statement}}
> +
> + [[clang::fallthrough]] // expected-error{{fallthrough attribute is only allowed on empty statements}}
> + switch (n) {
> + case 121:
> + n += 400;
> + [[clang::fallthrough]]; // no warning here, correct target
> + case 123:
> + [[clang::fallthrough]] // expected-error{{fallthrough attribute is only allowed on empty statements}}
> + n += 800;
> + break;
> + [[clang::fallthrough]] // expected-error{{fallthrough attribute is only allowed on empty statements}} expected-note{{did you forget ';'?}}
> + case 125:
> + n += 1600;
> + }
> + return n;
> +}
>
~Aaron
On Mon, Jun 23, 2014 at 11:23 AM, Alexander Kornienko <alexfh at google.com> wrote:
> Hi rsmith,
>
> http://reviews.llvm.org/D4258
>
> Files:
> lib/Sema/AnalysisBasedWarnings.cpp
> test/SemaCXX/switch-implicit-fallthrough.cpp
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
More information about the cfe-commits
mailing list