+ declaration_specifiers struct_or_variant_declarator_list SEMICOLON
+ {
+ struct ctf_node *list;
+
+ list = make_node(scanner, NODE_TYPE_SPECIFIER_LIST);
+ _cds_list_splice_tail(&($1)->u.type_specifier_list.head, &list->u.type_specifier_list.head);
+ $$ = make_node(scanner, NODE_STRUCT_OR_VARIANT_DECLARATION);
+ ($$)->u.struct_or_variant_declaration.type_specifier_list = list;
+ _cds_list_splice_tail(&($2)->tmp_head, &($$)->u.struct_or_variant_declaration.type_declarators);
+ }
+ | declaration_specifiers TYPEDEF declaration_specifiers type_declarator_list SEMICOLON
+ {
+ struct ctf_node *list;
+
+ $$ = make_node(scanner, NODE_TYPEDEF);
+ list = make_node(scanner, NODE_TYPE_SPECIFIER_LIST);
+ $$->u._typedef.type_specifier_list = list;
+ _cds_list_splice_tail(&($1)->u.type_specifier_list.head, &list->u.type_specifier_list.head);
+ _cds_list_splice_tail(&($3)->u.type_specifier_list.head, &list->u.type_specifier_list.head);
+ _cds_list_splice_tail(&($4)->tmp_head, &($$)->u._typedef.type_declarators);
+ }
+ | TYPEDEF declaration_specifiers type_declarator_list SEMICOLON
+ {
+ struct ctf_node *list;
+
+ $$ = make_node(scanner, NODE_TYPEDEF);
+ list = make_node(scanner, NODE_TYPE_SPECIFIER_LIST);
+ $$->u._typedef.type_specifier_list = list;
+ _cds_list_splice_tail(&($2)->u.type_specifier_list.head, &list->u.type_specifier_list.head);
+ _cds_list_splice_tail(&($3)->tmp_head, &($$)->u._typedef.type_declarators);
+ }
+ | declaration_specifiers TYPEDEF type_declarator_list SEMICOLON
+ {
+ struct ctf_node *list;
+
+ list = make_node(scanner, NODE_TYPE_SPECIFIER_LIST);
+ _cds_list_splice_tail(&($1)->u.type_specifier_list.head, &list->u.type_specifier_list.head);
+ $$ = make_node(scanner, NODE_TYPEDEF);
+ ($$)->u.struct_or_variant_declaration.type_specifier_list = list;
+ _cds_list_splice_tail(&($3)->tmp_head, &($$)->u._typedef.type_declarators);
+ }
+ | TYPEALIAS declaration_specifiers abstract_declarator_list TYPEASSIGN alias_declaration_specifiers alias_abstract_declarator_list SEMICOLON
+ {
+ struct ctf_node *list;
+
+ $$ = make_node(scanner, NODE_TYPEALIAS);
+ $$->u.typealias.target = make_node(scanner, NODE_TYPEALIAS_TARGET);
+ $$->u.typealias.alias = make_node(scanner, NODE_TYPEALIAS_ALIAS);
+
+ list = make_node(scanner, NODE_TYPE_SPECIFIER_LIST);
+ $$->u.typealias.target->u.typealias_target.type_specifier_list = list;
+ _cds_list_splice_tail(&($2)->u.type_specifier_list.head, &list->u.type_specifier_list.head);
+ _cds_list_splice_tail(&($3)->tmp_head, &($$)->u.typealias.target->u.typealias_target.type_declarators);
+
+ list = make_node(scanner, NODE_TYPE_SPECIFIER_LIST);
+ $$->u.typealias.alias->u.typealias_alias.type_specifier_list = list;
+ _cds_list_splice_tail(&($5)->u.type_specifier_list.head, &list->u.type_specifier_list.head);
+ _cds_list_splice_tail(&($6)->tmp_head, &($$)->u.typealias.alias->u.typealias_alias.type_declarators);
+ }