| // RUN: %clang_cc1 -fsyntax-only -fdouble-square-bracket-attributes -verify %s |
| |
| void f(int n) { |
| switch (n) { |
| case 0: |
| n += 1; |
| [[fallthrough]]; // ok |
| case 1: |
| if (n) { |
| [[fallthrough]]; // ok |
| } else { |
| return; |
| } |
| case 2: |
| for (int n = 0; n != 10; ++n) |
| [[fallthrough]]; // expected-error {{does not directly precede switch label}} |
| case 3: |
| while (1) |
| [[fallthrough]]; // expected-error {{does not directly precede switch label}} |
| case 4: |
| while (0) |
| [[fallthrough]]; // expected-error {{does not directly precede switch label}} |
| case 5: |
| do [[fallthrough]]; while (1); // expected-error {{does not directly precede switch label}} |
| case 6: |
| do [[fallthrough]]; while (0); // expected-error {{does not directly precede switch label}} |
| case 7: |
| switch (n) { |
| case 0: |
| // FIXME: This should be an error, even though the next thing we do is to |
| // fall through in an outer switch statement. |
| [[fallthrough]]; |
| } |
| case 8: |
| [[fallthrough]]; // expected-error {{does not directly precede switch label}} |
| goto label; |
| label: |
| case 9: |
| n += 1; |
| case 10: // no warning, -Wimplicit-fallthrough is not enabled in this test, and does not need to |
| // be enabled for these diagnostics to be produced. |
| break; |
| } |
| } |
| |
| [[fallthrough]] typedef int n1; // expected-error {{'fallthrough' attribute cannot be applied to a declaration}} |
| typedef int [[fallthrough]] n2; // expected-error {{'fallthrough' attribute cannot be applied to types}} |
| typedef int n3 [[fallthrough]]; // expected-error {{'fallthrough' attribute cannot be applied to a declaration}} |
| |
| enum [[fallthrough]] E { // expected-error {{'fallthrough' attribute cannot be applied to a declaration}} |
| One |
| }; |
| struct [[fallthrough]] S { // expected-error {{'fallthrough' attribute cannot be applied to a declaration}} |
| int i; |
| }; |
| |
| [[fallthrough]] // expected-error {{'fallthrough' attribute cannot be applied to a declaration}} |
| void g(void) { |
| [[fallthrough]] int n; // expected-error {{'fallthrough' attribute cannot be applied to a declaration}} |
| [[fallthrough]] ++n; // expected-error-re {{{{^}}fallthrough attribute is only allowed on empty statements}} |
| |
| switch (n) { |
| // FIXME: This should be an error. |
| [[fallthrough]]; |
| return; |
| |
| case 0: |
| [[fallthrough, fallthrough]]; // expected-error {{multiple times}} |
| case 1: |
| [[fallthrough(0)]]; // expected-error {{argument list}} |
| case 2: |
| break; |
| } |
| } |
| |