Skip to content

Commit

Permalink
stage1: Create a new declaration scope for union enum types
Browse files Browse the repository at this point in the history
Making the enum type share the scope with the parent union means every
declaration "bleeds" into the enum scope.
Let's mint a fresh empty scope for the enum type.

Thanks to @Vexu for the test case.

Closes ziglang#7532
  • Loading branch information
LemonBoy authored and aarvay committed Jan 4, 2021
1 parent dd08635 commit 3ccf93b
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 1 deletion.
3 changes: 2 additions & 1 deletion src/stage1/analyze.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3281,7 +3281,8 @@ static Error resolve_union_zero_bits(CodeGen *g, ZigType *union_type) {
tag_type->data.enumeration.src_field_count = field_count;
tag_type->data.enumeration.fields = heap::c_allocator.allocate<TypeEnumField>(field_count);
tag_type->data.enumeration.fields_by_name.init(field_count);
tag_type->data.enumeration.decls_scope = union_type->data.unionation.decls_scope;
tag_type->data.enumeration.decls_scope = create_decls_scope(
g, nullptr, nullptr, tag_type, get_scope_import(scope), &tag_type->name);
} else if (enum_type_node != nullptr) {
tag_type = analyze_type_expr(g, scope, enum_type_node);
} else {
Expand Down
15 changes: 15 additions & 0 deletions test/stage1/behavior/union.zig
Original file line number Diff line number Diff line change
Expand Up @@ -761,3 +761,18 @@ test "@unionInit on union w/ tag but no fields" {
S.doTheTest();
comptime S.doTheTest();
}

test "union enum type gets a separate scope" {
const S = struct {
const U = union(enum) {
a: u8,
const foo = 1;
};

fn doTheTest() void {
expect(!@hasDecl(@TagType(U), "foo"));
}
};

S.doTheTest();
}

0 comments on commit 3ccf93b

Please sign in to comment.