$$->u.unary_expression.type = UNARY_STRING;
$$->u.unary_expression.u.string = yylval.gs->s;
}
-
| DECIMAL_CONSTANT
{
$$ = make_node(scanner, NODE_UNARY_EXPRESSION);
_cds_list_splice_tail(&($1)->u.type_specifier_list.head, &list->u.type_specifier_list.head);
_cds_list_splice_tail(&($3)->tmp_head, &($$)->u._typedef.type_declarators);
}
- | TYPEALIAS declaration_specifiers abstract_declarator_list COLON alias_declaration_specifiers alias_abstract_declarator_list SEMICOLON
+ | TYPEALIAS declaration_specifiers abstract_declarator_list TYPEASSIGN alias_declaration_specifiers alias_abstract_declarator_list SEMICOLON
{
struct ctf_node *list;
$$ = make_node(scanner, NODE_TYPE_SPECIFIER);
$$->u.type_specifier.type = TYPESPEC_VARIANT;
$$->u.type_specifier.node = $2;
- $$ = $2;
}
| STRUCT struct_type_specifier
{
$$ = make_node(scanner, NODE_TYPE_SPECIFIER);
$$->u.type_specifier.type = TYPESPEC_STRUCT;
$$->u.type_specifier.node = $2;
- $$ = $2;
}
;
{
$$ = make_node(scanner, NODE_STRUCT);
$$->u._struct.has_body = 1;
- if (set_parent_node($2, $$))
+ if ($2 && set_parent_node($2, $$))
reparent_error(scanner, "struct reparent error");
}
| IDENTIFIER struct_declaration_begin struct_or_variant_declaration_list struct_declaration_end
$$ = make_node(scanner, NODE_STRUCT);
$$->u._struct.has_body = 1;
$$->u._struct.name = $1->s;
- if (set_parent_node($3, $$))
+ if ($3 && set_parent_node($3, $$))
reparent_error(scanner, "struct reparent error");
}
| ID_TYPE struct_declaration_begin struct_or_variant_declaration_list struct_declaration_end
$$ = make_node(scanner, NODE_STRUCT);
$$->u._struct.has_body = 1;
$$->u._struct.name = $1->s;
- if (set_parent_node($3, $$))
+ if ($3 && set_parent_node($3, $$))
reparent_error(scanner, "struct reparent error");
}
| IDENTIFIER
{
$$ = make_node(scanner, NODE_VARIANT);
$$->u.variant.has_body = 1;
- if (set_parent_node($2, $$))
+ if ($2 && set_parent_node($2, $$))
reparent_error(scanner, "variant reparent error");
}
| LT IDENTIFIER GT variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
$$ = make_node(scanner, NODE_VARIANT);
$$->u.variant.has_body = 1;
$$->u.variant.choice = $2->s;
- if (set_parent_node($5, $$))
+ if ($5 && set_parent_node($5, $$))
reparent_error(scanner, "variant reparent error");
}
| LT ID_TYPE GT variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
$$ = make_node(scanner, NODE_VARIANT);
$$->u.variant.has_body = 1;
$$->u.variant.choice = $2->s;
- if (set_parent_node($5, $$))
+ if ($5 && set_parent_node($5, $$))
reparent_error(scanner, "variant reparent error");
}
| IDENTIFIER variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
$$ = make_node(scanner, NODE_VARIANT);
$$->u.variant.has_body = 1;
$$->u.variant.name = $1->s;
- if (set_parent_node($3, $$))
+ if ($3 && set_parent_node($3, $$))
reparent_error(scanner, "variant reparent error");
}
| IDENTIFIER LT IDENTIFIER GT variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
$$->u.variant.has_body = 1;
$$->u.variant.name = $1->s;
$$->u.variant.choice = $3->s;
- if (set_parent_node($6, $$))
+ if ($6 && set_parent_node($6, $$))
reparent_error(scanner, "variant reparent error");
}
| IDENTIFIER LT IDENTIFIER GT
$$->u.variant.has_body = 1;
$$->u.variant.name = $1->s;
$$->u.variant.choice = $3->s;
- if (set_parent_node($6, $$))
+ if ($6 && set_parent_node($6, $$))
reparent_error(scanner, "variant reparent error");
}
| IDENTIFIER LT ID_TYPE GT
$$ = make_node(scanner, NODE_VARIANT);
$$->u.variant.has_body = 1;
$$->u.variant.name = $1->s;
- if (set_parent_node($3, $$))
+ if ($3 && set_parent_node($3, $$))
reparent_error(scanner, "variant reparent error");
}
| ID_TYPE LT IDENTIFIER GT variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
$$->u.variant.has_body = 1;
$$->u.variant.name = $1->s;
$$->u.variant.choice = $3->s;
- if (set_parent_node($6, $$))
+ if ($6 && set_parent_node($6, $$))
reparent_error(scanner, "variant reparent error");
}
| ID_TYPE LT IDENTIFIER GT
$$->u.variant.has_body = 1;
$$->u.variant.name = $1->s;
$$->u.variant.choice = $3->s;
- if (set_parent_node($6, $$))
+ if ($6 && set_parent_node($6, $$))
reparent_error(scanner, "variant reparent error");
}
| ID_TYPE LT ID_TYPE GT
($$)->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 COLON alias_declaration_specifiers alias_abstract_declarator_list SEMICOLON
+ | TYPEALIAS declaration_specifiers abstract_declarator_list TYPEASSIGN alias_declaration_specifiers alias_abstract_declarator_list SEMICOLON
{
struct ctf_node *list;
reparent_error(scanner, "ctf_assignment_expression left expects string");
_cds_list_splice_tail(&($3)->tmp_head, &($$)->u.ctf_expression.right);
}
- | unary_expression TYPEASSIGN type_specifier /* Only allow struct */
+ | unary_expression TYPEASSIGN declaration_specifiers /* Only allow struct */
{
- struct ctf_node *list;
/*
* Because we have left and right, cannot use
* set_parent_node.
_cds_list_splice_tail(&($1)->tmp_head, &($$)->u.ctf_expression.left);
if ($1->u.unary_expression.type != UNARY_STRING)
reparent_error(scanner, "ctf_assignment_expression left expects string");
- list = make_node(scanner, NODE_TYPE_SPECIFIER_LIST);
- cds_list_add_tail(&($3)->siblings, &list->u.type_specifier_list.head);
- cds_list_add_tail(&list->siblings, &($$)->u.ctf_expression.right);
+ cds_list_add_tail(&($3)->siblings, &($$)->u.ctf_expression.right);
}
| declaration_specifiers TYPEDEF declaration_specifiers type_declarator_list
{
($$)->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 COLON alias_declaration_specifiers alias_abstract_declarator_list
+ | TYPEALIAS declaration_specifiers abstract_declarator_list TYPEASSIGN alias_declaration_specifiers alias_abstract_declarator_list
{
struct ctf_node *list;