aboutsummaryrefslogtreecommitdiffstats
path: root/cparser/Parser.vy
diff options
context:
space:
mode:
authorDavid Monniaux <david.monniaux@univ-grenoble-alpes.fr>2020-11-18 21:07:29 +0100
committerDavid Monniaux <david.monniaux@univ-grenoble-alpes.fr>2020-11-18 21:07:29 +0100
commit8384d27c122ec4ca4b7ad0f524df52b61a49c66a (patch)
treed86ff8780c4435d3b4fe92b5251e0f9b447b86c7 /cparser/Parser.vy
parent362bdda28ca3c4dcc992575cbbe9400b64425990 (diff)
parente6e036b3f285d2f3ba2a5036a413eb9c7d7534cd (diff)
downloadcompcert-kvx-8384d27c122ec4ca4b7ad0f524df52b61a49c66a.tar.gz
compcert-kvx-8384d27c122ec4ca4b7ad0f524df52b61a49c66a.zip
Merge branch 'master' (Absint 3.8) into kvx-work-merge3.8
Diffstat (limited to 'cparser/Parser.vy')
-rw-r--r--cparser/Parser.vy19
1 files changed, 18 insertions, 1 deletions
diff --git a/cparser/Parser.vy b/cparser/Parser.vy
index 4f3b9789..ebed6e34 100644
--- a/cparser/Parser.vy
+++ b/cparser/Parser.vy
@@ -37,7 +37,7 @@ Require Cabs.
STRUCT UNION ENUM UNDERSCORE_BOOL PACKED ALIGNAS ATTRIBUTE ASM
%token<Cabs.loc> CASE DEFAULT IF_ ELSE SWITCH WHILE DO FOR GOTO CONTINUE BREAK
- RETURN BUILTIN_VA_ARG BUILTIN_OFFSETOF
+ RETURN BUILTIN_VA_ARG BUILTIN_OFFSETOF STATIC_ASSERT
%token EOF
@@ -55,6 +55,8 @@ Require Cabs.
%type<list Cabs.spec_elem> declaration_specifiers_typespec_opt
%type<list Cabs.init_name (* Reverse order *)> init_declarator_list
%type<Cabs.init_name> init_declarator
+%type<(Cabs.expression * Cabs.loc) * (Cabs.constant * Cabs.loc) * Cabs.loc>
+ static_assert_declaration
%type<Cabs.storage * Cabs.loc> storage_class_specifier
%type<Cabs.typeSpecifier * Cabs.loc> type_specifier struct_or_union_specifier enum_specifier
%type<Cabs.structOrUnion * Cabs.loc> struct_or_union
@@ -343,6 +345,9 @@ declaration:
{ Cabs.DECDEF (fst decspec, rev' decls) (snd decspec) }
| decspec = declaration_specifiers SEMICOLON
{ Cabs.DECDEF (fst decspec, []) (snd decspec) }
+| asrt = static_assert_declaration
+ { let '((e, loc_e), (s, loc_s), loc) := asrt in
+ Cabs.STATIC_ASSERT e loc_e s loc_s loc }
declaration_specifiers_typespec_opt:
| storage = storage_class_specifier rest = declaration_specifiers_typespec_opt
@@ -461,6 +466,10 @@ struct_declaration:
(* Extension to C99 grammar needed to parse some GNU header files. *)
| decspec = specifier_qualifier_list SEMICOLON
{ Cabs.Field_group (fst decspec) [(None,None)] (snd decspec) }
+(* C11 static assertions *)
+| asrt = static_assert_declaration
+ { let '((e, loc_e), (s, loc_s), loc) := asrt in
+ Cabs.Field_group_static_assert e loc_e s loc_s loc }
specifier_qualifier_list:
| typ = type_specifier rest = specifier_qualifier_list
@@ -751,6 +760,14 @@ designator:
| DOT id = OTHER_NAME
{ Cabs.INFIELD_INIT (fst id) }
+(* C11 6.7.10 *)
+
+static_assert_declaration:
+| loc = STATIC_ASSERT LPAREN expr = constant_expression
+ COMMA str = STRING_LITERAL RPAREN SEMICOLON
+ { let '((wide, chars), locs) := str in
+ (expr, (Cabs.CONST_STRING wide chars, locs), loc) }
+
(* 6.8 *)
statement_dangerous:
| stmt = labeled_statement(statement_dangerous)