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 #7532
  • Loading branch information
LemonBoy authored and Vexu committed Dec 24, 2020
1 parent 83646df commit e18abab
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 e18abab

Please sign in to comment.