authorgravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2020-11-20 16:38:00+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-11-20 17:01:23-08:00
log6029114f84ea7ddbf0e40db6ee9b7c1ab4e86b95
tree39f44264975d9fb2ed761e5ab1d17a7c53afdaef
parent73be59433f36f5a8f5c7fa7bbffcb8eb17b1735d

stage1: Resolve usingnamespace decls when calling @typeInfo

Closes #7176

4 files changed, 22 insertions(+), 1 deletions(-)

src/stage1/analyze.cpp+5-1
...@@ -4445,7 +4445,7 @@ void resolve_top_level_decl(CodeGen *g, Tld *tld, AstNode *source_node, bool all...@@ -4445,7 +4445,7 @@ void resolve_top_level_decl(CodeGen *g, Tld *tld, AstNode *source_node, bool all
4445 }4445 }
4446}4446}
44474447
4448Tld *find_container_decl(CodeGen *g, ScopeDecls *decls_scope, Buf *name) {4448void resolve_container_usingnamespace_decls(CodeGen *g, ScopeDecls *decls_scope) {
4449 // resolve all the using_namespace decls4449 // resolve all the using_namespace decls
4450 for (size_t i = 0; i < decls_scope->use_decls.length; i += 1) {4450 for (size_t i = 0; i < decls_scope->use_decls.length; i += 1) {
4451 TldUsingNamespace *tld_using_namespace = decls_scope->use_decls.at(i);4451 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) {...@@ -4455,6 +4455,10 @@ Tld *find_container_decl(CodeGen *g, ScopeDecls *decls_scope, Buf *name) {
4455 }4455 }
4456 }4456 }
44574457
4458}
4459
4460Tld *find_container_decl(CodeGen *g, ScopeDecls *decls_scope, Buf *name) {
4461 resolve_container_usingnamespace_decls(g, decls_scope);
4458 auto entry = decls_scope->decl_table.maybe_get(name);4462 auto entry = decls_scope->decl_table.maybe_get(name);
4459 return (entry == nullptr) ? nullptr : entry->value;4463 return (entry == nullptr) ? nullptr : entry->value;
4460}4464}
src/stage1/analyze.hpp+1
...@@ -79,6 +79,7 @@ ZigVar *find_variable(CodeGen *g, Scope *orig_context, Buf *name, ScopeFnDef **c...@@ -79,6 +79,7 @@ ZigVar *find_variable(CodeGen *g, Scope *orig_context, Buf *name, ScopeFnDef **c
79Tld *find_decl(CodeGen *g, Scope *scope, Buf *name);79Tld *find_decl(CodeGen *g, Scope *scope, Buf *name);
80Tld *find_container_decl(CodeGen *g, ScopeDecls *decls_scope, Buf *name);80Tld *find_container_decl(CodeGen *g, ScopeDecls *decls_scope, Buf *name);
81void resolve_top_level_decl(CodeGen *g, Tld *tld, AstNode *source_node, bool allow_lazy);81void resolve_top_level_decl(CodeGen *g, Tld *tld, AstNode *source_node, bool allow_lazy);
82void resolve_container_usingnamespace_decls(CodeGen *g, ScopeDecls *decls_scope);
8283
83ZigType *get_src_ptr_type(ZigType *type);84ZigType *get_src_ptr_type(ZigType *type);
84uint32_t get_ptr_align(CodeGen *g, ZigType *type);85uint32_t get_ptr_align(CodeGen *g, ZigType *type);
src/stage1/ir.cpp+2
...@@ -24909,6 +24909,8 @@ static Error ir_make_type_info_decls(IrAnalyze *ira, IrInst* source_instr, ZigVa...@@ -24909,6 +24909,8 @@ static Error ir_make_type_info_decls(IrAnalyze *ira, IrInst* source_instr, ZigVa
24909 if ((err = type_resolve(ira->codegen, type_info_fn_decl_inline_type, ResolveStatusSizeKnown)))24909 if ((err = type_resolve(ira->codegen, type_info_fn_decl_inline_type, ResolveStatusSizeKnown)))
24910 return err;24910 return err;
2491124911
24912 resolve_container_usingnamespace_decls(ira->codegen, decls_scope);
24913
24912 // The unresolved declarations are collected in a separate queue to avoid24914 // The unresolved declarations are collected in a separate queue to avoid
24913 // modifying decl_table while iterating over it24915 // modifying decl_table while iterating over it
24914 ZigList<Tld*> resolve_decl_queue{};24916 ZigList<Tld*> resolve_decl_queue{};
test/stage1/behavior/type_info.zig+14
...@@ -460,3 +460,17 @@ test "StructField.is_comptime" {...@@ -460,3 +460,17 @@ test "StructField.is_comptime" {
460 expect(!info.fields[0].is_comptime);460 expect(!info.fields[0].is_comptime);
461 expect(info.fields[1].is_comptime);461 expect(info.fields[1].is_comptime);
462}462}
463
464test "typeInfo resolves usingnamespace declarations" {
465 const A = struct {
466 pub const f1 = 42;
467 };
468
469 const B = struct {
470 const f0 = 42;
471 usingnamespace A;
472 };
473
474 expect(@typeInfo(B).Struct.decls.len == 2);
475 //a
476}