@@ -257,7 +257,7 @@ let transformOffsetOf (speclist, dtype) member =
257257%token <Cabs. cabsloc > GENERIC NORETURN /* C11 */
258258%token <Cabs. cabsloc > ENUM STRUCT TYPEDEF UNION
259259%token <Cabs. cabsloc > SIGNED UNSIGNED LONG SHORT
260- %token <Cabs. cabsloc > VOLATILE EXTERN STATIC CONST RESTRICT AUTO REGISTER
260+ %token <Cabs. cabsloc > VOLATILE EXTERN STATIC CONST ATOMIC RESTRICT AUTO REGISTER
261261%token <Cabs. cabsloc > THREAD
262262
263263%token <Cabs. cabsloc > SIZEOF ALIGNOF
@@ -290,7 +290,7 @@ let transformOffsetOf (speclist, dtype) member =
290290%token <Cabs. cabsloc > IF
291291%token ELSE
292292
293- %token <Cabs. cabsloc > ATTRIBUTE INLINE ASM TYPEOF REAL IMAG FUNCTION__ PRETTY_FUNCTION__ CLASSIFYTYPE
293+ %token <Cabs. cabsloc > ATTRIBUTE INLINE STATIC_ASSERT ASM TYPEOF REAL IMAG FUNCTION__ PRETTY_FUNCTION__ CLASSIFYTYPE
294294%token LABEL__
295295%token <Cabs. cabsloc > BUILTIN_VA_ARG ATTRIBUTE_USED
296296%token BUILTIN_VA_LIST
@@ -323,7 +323,7 @@ let transformOffsetOf (speclist, dtype) member =
323323%left INF SUP INF_EQ SUP_EQ
324324%left INF_INF SUP_SUP
325325%left PLUS MINUS
326- %left STAR SLASH PERCENT CONST RESTRICT VOLATILE COMPLEX
326+ %left STAR SLASH PERCENT CONST RESTRICT ATOMIC VOLATILE COMPLEX
327327%right EXCLAM TILDE PLUS_PLUS MINUS_MINUS CAST RPAREN ADDROF SIZEOF ALIGNOF IMAG REAL CLASSIFYTYPE
328328%left LBRACKET
329329%left DOT ARROW LPAREN LBRACE
@@ -930,6 +930,21 @@ declaration: /* ISO 6.7.*/
930930 { doDeclaration (joinLoc (snd $1) $3) (fst $1) $2 }
931931| decl_spec_list SEMICOLON
932932 { doDeclaration (joinLoc (snd $1) $2) (fst $1) [] }
933+ | static_assert_declaration { let (e, m, loc) = $1 in STATIC_ASSERT (e, m, loc) }
934+ ;
935+
936+ static_assert_declaration :
937+
938+ | STATIC_ASSERT LPAREN expression RPAREN /* C23 */
939+ {
940+ (fst $3, "", $1)
941+ }
942+ | STATIC_ASSERT LPAREN expression COMMA string_constant RPAREN
943+ {
944+ (fst $3, fst $5, $1)
945+ }
946+ ;
947+
933948;
934949init_declarator_list : /* ISO 6.7 */
935950 init_declarator { [$1] }
@@ -951,9 +966,11 @@ decl_spec_list: /* ISO 6.7 */
951966| REGISTER decl_spec_list_opt { SpecStorage REGISTER :: $2, $1}
952967 /* ISO 6.7 .2 */
953968| type_spec decl_spec_list_opt_no_named { SpecType (fst $1) :: $2, snd $1 }
969+ | ATOMIC LPAREN decl_spec_list RPAREN decl_spec_list_opt_no_named { (fst $3) @ SpecCV(CV_ATOMIC) :: $5, $1 }
954970 /* ISO 6.7 .4 */
955971| INLINE decl_spec_list_opt { SpecInline :: $2, $1 }
956972| NORETURN decl_spec_list_opt { SpecNoreturn :: $2, $1 }
973+
957974| cvspec decl_spec_list_opt { (fst $1) :: $2, snd $1 }
958975| attribute_nocv decl_spec_list_opt { SpecAttr (fst $1) :: $2, snd $1 }
959976/* specifier pattern variable (must be last in spec list ) */
@@ -1049,6 +1066,15 @@ struct_decl_list: /* (* ISO 6.7.2. Except that we allow empty structs. We
10491066
10501067| error SEMICOLON struct_decl_list
10511068 { $3 }
1069+ /*(* C11 allows static_assert-declaration *) */
1070+ | static_assert_declaration {
1071+ []
1072+ }
1073+
1074+ | static_assert_declaration SEMICOLON struct_decl_list {
1075+ $3
1076+ }
1077+
10521078;
10531079field_decl_list : /* (* ISO 6.7.2 *) */
10541080 field_decl { [$1] }
@@ -1294,6 +1320,7 @@ cvspec:
12941320| VOLATILE { SpecCV(CV_VOLATILE), $1 }
12951321| RESTRICT { SpecCV(CV_RESTRICT), $1 }
12961322| COMPLEX { SpecCV(CV_COMPLEX), $1 }
1323+ | ATOMIC { SpecCV(CV_ATOMIC), $1 }
12971324;
12981325
12991326/*** GCC attributes ***/
0 commit comments