llvm-project/clang/test/Sema/c2x-fallthrough.c
Aaron Ballman b8266f512a Correct the __has_c_attribute value for fallthrough
The original proposal was seen in Apr 2019 and we accidentally used
that date (201904L) as the feature testing value. However, WG14 N2408
was adopted at the Oct 2019 meeting and so that's the correct date for
the feature testing macro. The committee draft for C2x shows 201910L
for this value, so this changes brings us in line with the standard.
2022-09-13 11:08:58 -04:00

79 lines
2.5 KiB
C

// RUN: %clang_cc1 -fsyntax-only -std=c2x -verify %s
// This is the latest version of fallthrough that we support.
_Static_assert(__has_c_attribute(fallthrough) == 201910L);
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 {{'fallthrough' attribute only applies to empty statements}}
switch (n) {
// FIXME: This should be an error.
[[fallthrough]];
return;
case 0:
[[fallthrough, fallthrough]]; // ok
case 1:
[[fallthrough(0)]]; // expected-error {{argument list}}
case 2:
break;
}
}