stage1: Create a new declaration scope for union enum types

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
This commit is contained in:
LemonBoy 2020-12-24 11:19:46 +01:00 committed by Veikka Tuominen
parent 83646df2cc
commit e18abab55a
2 changed files with 17 additions and 1 deletions

View File

@ -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 {

View File

@ -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();
}