diff options
| author | LemonBoy <thatlemon@gmail.com> | 2020-12-24 11:19:46 +0100 |
|---|---|---|
| committer | Veikka Tuominen <git@vexu.eu> | 2020-12-24 15:57:12 +0200 |
| commit | e18abab55aea4a5c3b347274e41de9fdc24e950c (patch) | |
| tree | fdf2716108151ffcddde84eaf5431fb27fbfac5f | |
| parent | 83646df2cce59f254822355ec1ceeb6884e1177e (diff) | |
| download | zig-e18abab55aea4a5c3b347274e41de9fdc24e950c.tar.gz zig-e18abab55aea4a5c3b347274e41de9fdc24e950c.zip | |
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
| -rw-r--r-- | src/stage1/analyze.cpp | 3 | ||||
| -rw-r--r-- | test/stage1/behavior/union.zig | 15 |
2 files changed, 17 insertions, 1 deletions
diff --git a/src/stage1/analyze.cpp b/src/stage1/analyze.cpp index 40a294e8d8..fd82a30ce0 100644 --- a/src/stage1/analyze.cpp +++ b/src/stage1/analyze.cpp @@ -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 { diff --git a/test/stage1/behavior/union.zig b/test/stage1/behavior/union.zig index b243cee11e..d350ae369a 100644 --- a/test/stage1/behavior/union.zig +++ b/test/stage1/behavior/union.zig @@ -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(); +} |
