Skip to content

Commit f215721

Browse files
committed
C front-end: fallthrough and __fallthrough__ are the same attribute
We already supported the former, but were missing the latter form.
1 parent 7f998c4 commit f215721

File tree

3 files changed

+27
-22
lines changed

3 files changed

+27
-22
lines changed

regression/ansi-c/gcc_attributes13/main.c

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,20 @@ int main()
77
int x;
88
switch(x)
99
{
10-
case 1:
11-
x = 2;
10+
case 1:
11+
x = 2;
1212
#ifdef __GNUC__
13-
__attribute__((fallthrough));
13+
__attribute__((fallthrough));
1414
#endif
15-
case 2:
16-
x = 3;
15+
case 2:
16+
{
17+
x = 3;
18+
#ifdef __GNUC__
19+
__attribute__((__fallthrough__));
20+
#endif
21+
}
22+
case 3:
23+
break;
1724
}
1825

1926
return 0;

src/ansi-c/parser.y

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1642,6 +1642,11 @@ gcc_attribute:
16421642
{
16431643
init($$);
16441644
}
1645+
| TOK_GCC_ATTRIBUTE_FALLTHROUGH
1646+
{
1647+
// attribute ignored
1648+
init($$);
1649+
}
16451650
| gcc_type_attribute
16461651
;
16471652

@@ -2307,19 +2312,7 @@ declaration_statement:
23072312
;
23082313

23092314
labeled_statement:
2310-
identifier_or_typedef_name ':' gcc_attribute_specifier ';'
2311-
{
2312-
/* Only semicolons permitted after the attribute:
2313-
https://gcc.gnu.org/onlinedocs/gcc/Label-Attributes.html */
2314-
$$=$2;
2315-
statement($$, ID_label);
2316-
irep_idt identifier=PARSER.lookup_label(parser_stack($1).get(ID_C_base_name));
2317-
parser_stack($$).set(ID_label, identifier);
2318-
// attribute ignored
2319-
statement($3, ID_skip);
2320-
mto($$, $3);
2321-
}
2322-
| identifier_or_typedef_name ':' statement
2315+
identifier_or_typedef_name ':' statement
23232316
{
23242317
$$=$2;
23252318
statement($$, ID_label);
@@ -2354,10 +2347,14 @@ labeled_statement:
23542347
;
23552348

23562349
statement_attribute:
2357-
TOK_GCC_ATTRIBUTE '(' '(' TOK_GCC_ATTRIBUTE_FALLTHROUGH ')' ')' ';' labeled_statement
2350+
gcc_attribute_specifier ';'
23582351
{
2359-
// attribute ignored
2360-
$$=$8;
2352+
// Really should only be TOK_GCC_ATTRIBUTE_FALLTHROUGH or a label
2353+
// attribute. Only semicolons permitted after the attribute:
2354+
// https://gcc.gnu.org/onlinedocs/gcc/Label-Attributes.html
2355+
// We ignore all such attributes.
2356+
$$=$1;
2357+
statement($$, ID_skip);
23612358
}
23622359
;
23632360

src/ansi-c/scanner.l

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1701,7 +1701,8 @@ __decltype { if(PARSER.cpp98 &&
17011701
"destructor" |
17021702
"__destructor__" { BEGIN(GCC_ATTRIBUTE3); loc(); return TOK_GCC_ATTRIBUTE_DESTRUCTOR; }
17031703

1704-
"fallthrough" { BEGIN(GCC_ATTRIBUTE3); loc(); return TOK_GCC_ATTRIBUTE_FALLTHROUGH; }
1704+
"fallthrough" |
1705+
"__fallthrough__" { BEGIN(GCC_ATTRIBUTE3); loc(); return TOK_GCC_ATTRIBUTE_FALLTHROUGH; }
17051706

17061707
"used" |
17071708
"__used__" { BEGIN(GCC_ATTRIBUTE3); loc(); return TOK_GCC_ATTRIBUTE_USED; }

0 commit comments

Comments
 (0)