diff options
author | David Monniaux <david.monniaux@univ-grenoble-alpes.fr> | 2020-11-18 21:07:29 +0100 |
---|---|---|
committer | David Monniaux <david.monniaux@univ-grenoble-alpes.fr> | 2020-11-18 21:07:29 +0100 |
commit | 8384d27c122ec4ca4b7ad0f524df52b61a49c66a (patch) | |
tree | d86ff8780c4435d3b4fe92b5251e0f9b447b86c7 /cparser/Parser.vy | |
parent | 362bdda28ca3c4dcc992575cbbe9400b64425990 (diff) | |
parent | e6e036b3f285d2f3ba2a5036a413eb9c7d7534cd (diff) | |
download | compcert-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.vy | 19 |
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) |