authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-09-20 23:16:44-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-09-20 23:16:44-04:00
log38059e6f97ae62aab9d3ca2f386eca1a1186a930
tree37855788e29793ba2b8032fe338c9506c4506d2d
parentc3814eee261a2e0a290f78271391df35c3d14b22

parse-c: fix anonymous enums


2 files changed, 21 insertions(+), 3 deletions(-)

src/parsec.cpp+11-3
...@@ -137,6 +137,9 @@ static AstNode *trans_create_node_fn_call_1(Context *c, AstNode *fn_ref_expr, As...@@ -137,6 +137,9 @@ static AstNode *trans_create_node_fn_call_1(Context *c, AstNode *fn_ref_expr, As
137137
138static AstNode *trans_create_node_field_access(Context *c, AstNode *container, Buf *field_name) {138static AstNode *trans_create_node_field_access(Context *c, AstNode *container, Buf *field_name) {
139 AstNode *node = trans_create_node(c, NodeTypeFieldAccessExpr);139 AstNode *node = trans_create_node(c, NodeTypeFieldAccessExpr);
140 if (container->type == NodeTypeSymbol) {
141 assert(container->data.symbol_expr.symbol != nullptr);
142 }
140 node->data.field_access_expr.struct_expr = container;143 node->data.field_access_expr.struct_expr = container;
141 node->data.field_access_expr.field_name = field_name;144 node->data.field_access_expr.field_name = field_name;
142 return node;145 return node;
...@@ -2527,9 +2530,14 @@ static AstNode *resolve_enum_decl(Context *c, const EnumDecl *enum_decl) {...@@ -2527,9 +2530,14 @@ static AstNode *resolve_enum_decl(Context *c, const EnumDecl *enum_decl) {
25272530
2528 // in C each enum value is in the global namespace. so we put them there too.2531 // in C each enum value is in the global namespace. so we put them there too.
2529 // at this point we can rely on the enum emitting successfully2532 // at this point we can rely on the enum emitting successfully
2530 AstNode *field_access_node = trans_create_node_field_access(c,2533 if (is_anonymous) {
2531 trans_create_node_symbol(c, full_type_name), field_name);2534 AstNode *lit_node = trans_create_node_unsigned(c, i);
2532 add_global_var(c, enum_val_name, field_access_node);2535 add_global_var(c, enum_val_name, lit_node);
2536 } else {
2537 AstNode *field_access_node = trans_create_node_field_access(c,
2538 trans_create_node_symbol(c, full_type_name), field_name);
2539 add_global_var(c, enum_val_name, field_access_node);
2540 }
2533 }2541 }
25342542
2535 if (is_anonymous) {2543 if (is_anonymous) {
test/parsec.zig+10
...@@ -353,4 +353,14 @@ pub fn addCases(cases: &tests.ParseCContext) {...@@ -353,4 +353,14 @@ pub fn addCases(cases: &tests.ParseCContext) {
353 \\ return i;353 \\ return i;
354 \\}354 \\}
355 );355 );
356
357 cases.add("anonymous enum",
358 \\enum {
359 \\ One,
360 \\ Two,
361 \\};
362 ,
363 \\pub const One = 0;
364 \\pub const Two = 1;
365 );
356}366}