zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 6029114f84ea7ddbf0e40db6ee9b7c1ab4e86b95 (tree)
parent 73be59433f36f5a8f5c7fa7bbffcb8eb17b1735d
Author: LemonBoy <thatlemon@gmail.com>
Date:   Fri, 20 Nov 2020 16:38:00 +0100

stage1: Resolve usingnamespace decls when calling @typeInfo

Closes #7176

Diffstat:
Msrc/stage1/analyze.cpp | 6+++++-
Msrc/stage1/analyze.hpp | 1+
Msrc/stage1/ir.cpp | 2++
Mtest/stage1/behavior/type_info.zig | 14++++++++++++++
4 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/src/stage1/analyze.cpp b/src/stage1/analyze.cpp @@ -4445,7 +4445,7 @@ void resolve_top_level_decl(CodeGen *g, Tld *tld, AstNode *source_node, bool all } } -Tld *find_container_decl(CodeGen *g, ScopeDecls *decls_scope, Buf *name) { +void resolve_container_usingnamespace_decls(CodeGen *g, ScopeDecls *decls_scope) { // resolve all the using_namespace decls for (size_t i = 0; i < decls_scope->use_decls.length; i += 1) { TldUsingNamespace *tld_using_namespace = decls_scope->use_decls.at(i); @@ -4455,6 +4455,10 @@ Tld *find_container_decl(CodeGen *g, ScopeDecls *decls_scope, Buf *name) { } } +} + +Tld *find_container_decl(CodeGen *g, ScopeDecls *decls_scope, Buf *name) { + resolve_container_usingnamespace_decls(g, decls_scope); auto entry = decls_scope->decl_table.maybe_get(name); return (entry == nullptr) ? nullptr : entry->value; } diff --git a/src/stage1/analyze.hpp b/src/stage1/analyze.hpp @@ -79,6 +79,7 @@ ZigVar *find_variable(CodeGen *g, Scope *orig_context, Buf *name, ScopeFnDef **c Tld *find_decl(CodeGen *g, Scope *scope, Buf *name); Tld *find_container_decl(CodeGen *g, ScopeDecls *decls_scope, Buf *name); void resolve_top_level_decl(CodeGen *g, Tld *tld, AstNode *source_node, bool allow_lazy); +void resolve_container_usingnamespace_decls(CodeGen *g, ScopeDecls *decls_scope); ZigType *get_src_ptr_type(ZigType *type); uint32_t get_ptr_align(CodeGen *g, ZigType *type); diff --git a/src/stage1/ir.cpp b/src/stage1/ir.cpp @@ -24909,6 +24909,8 @@ static Error ir_make_type_info_decls(IrAnalyze *ira, IrInst* source_instr, ZigVa if ((err = type_resolve(ira->codegen, type_info_fn_decl_inline_type, ResolveStatusSizeKnown))) return err; + resolve_container_usingnamespace_decls(ira->codegen, decls_scope); + // The unresolved declarations are collected in a separate queue to avoid // modifying decl_table while iterating over it ZigList<Tld*> resolve_decl_queue{}; diff --git a/test/stage1/behavior/type_info.zig b/test/stage1/behavior/type_info.zig @@ -460,3 +460,17 @@ test "StructField.is_comptime" { expect(!info.fields[0].is_comptime); expect(info.fields[1].is_comptime); } + +test "typeInfo resolves usingnamespace declarations" { + const A = struct { + pub const f1 = 42; + }; + + const B = struct { + const f0 = 42; + usingnamespace A; + }; + + expect(@typeInfo(B).Struct.decls.len == 2); + //a +}