diff --git a/src/parsec.cpp b/src/parsec.cpp index d2f5731e2..2895ccdb1 100644 --- a/src/parsec.cpp +++ b/src/parsec.cpp @@ -137,6 +137,9 @@ static AstNode *trans_create_node_fn_call_1(Context *c, AstNode *fn_ref_expr, As static AstNode *trans_create_node_field_access(Context *c, AstNode *container, Buf *field_name) { AstNode *node = trans_create_node(c, NodeTypeFieldAccessExpr); + if (container->type == NodeTypeSymbol) { + assert(container->data.symbol_expr.symbol != nullptr); + } node->data.field_access_expr.struct_expr = container; node->data.field_access_expr.field_name = field_name; return node; @@ -2527,9 +2530,14 @@ static AstNode *resolve_enum_decl(Context *c, const EnumDecl *enum_decl) { // in C each enum value is in the global namespace. so we put them there too. // at this point we can rely on the enum emitting successfully - AstNode *field_access_node = trans_create_node_field_access(c, - trans_create_node_symbol(c, full_type_name), field_name); - add_global_var(c, enum_val_name, field_access_node); + if (is_anonymous) { + AstNode *lit_node = trans_create_node_unsigned(c, i); + add_global_var(c, enum_val_name, lit_node); + } else { + AstNode *field_access_node = trans_create_node_field_access(c, + trans_create_node_symbol(c, full_type_name), field_name); + add_global_var(c, enum_val_name, field_access_node); + } } if (is_anonymous) { diff --git a/test/parsec.zig b/test/parsec.zig index f408066d2..0952d2deb 100644 --- a/test/parsec.zig +++ b/test/parsec.zig @@ -353,4 +353,14 @@ pub fn addCases(cases: &tests.ParseCContext) { \\ return i; \\} ); + + cases.add("anonymous enum", + \\enum { + \\ One, + \\ Two, + \\}; + , + \\pub const One = 0; + \\pub const Two = 1; + ); }