| author | |
| committer | |
| log | 6029114f84ea7ddbf0e40db6ee9b7c1ab4e86b95 |
| tree | 39f44264975d9fb2ed761e5ab1d17a7c53afdaef |
| parent | 73be59433f36f5a8f5c7fa7bbffcb8eb17b1735d |
Closes #71764 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 | 4445 | } |
| 4446 | 4446 | } |
| 4447 | 4447 | |
| 4448 | Tld *find_container_decl(CodeGen *g, ScopeDecls *decls_scope, Buf *name) { | |
| 4448 | void resolve_container_usingnamespace_decls(CodeGen *g, ScopeDecls *decls_scope) { | |
| 4449 | 4449 | // resolve all the using_namespace decls |
| 4450 | 4450 | for (size_t i = 0; i < decls_scope->use_decls.length; i += 1) { |
| 4451 | 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 | 4455 | } |
| 4456 | 4456 | } |
| 4457 | 4457 | |
| 4458 | } | |
| 4459 | ||
| 4460 | Tld *find_container_decl(CodeGen *g, ScopeDecls *decls_scope, Buf *name) { | |
| 4461 | resolve_container_usingnamespace_decls(g, decls_scope); | |
| 4458 | 4462 | auto entry = decls_scope->decl_table.maybe_get(name); |
| 4459 | 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 | 79 | Tld *find_decl(CodeGen *g, Scope *scope, Buf *name); |
| 80 | 80 | Tld *find_container_decl(CodeGen *g, ScopeDecls *decls_scope, Buf *name); |
| 81 | 81 | void resolve_top_level_decl(CodeGen *g, Tld *tld, AstNode *source_node, bool allow_lazy); |
| 82 | void resolve_container_usingnamespace_decls(CodeGen *g, ScopeDecls *decls_scope); | |
| 82 | 83 | |
| 83 | 84 | ZigType *get_src_ptr_type(ZigType *type); |
| 84 | 85 | uint32_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 | 24909 | if ((err = type_resolve(ira->codegen, type_info_fn_decl_inline_type, ResolveStatusSizeKnown))) |
| 24910 | 24910 | return err; |
| 24911 | 24911 | |
| 24912 | resolve_container_usingnamespace_decls(ira->codegen, decls_scope); | |
| 24913 | ||
| 24912 | 24914 | // The unresolved declarations are collected in a separate queue to avoid |
| 24913 | 24915 | // modifying decl_table while iterating over it |
| 24914 | 24916 | ZigList<Tld*> resolve_decl_queue{}; |
test/stage1/behavior/type_info.zig+14| ... | ... | @@ -460,3 +460,17 @@ test "StructField.is_comptime" { |
| 460 | 460 | expect(!info.fields[0].is_comptime); |
| 461 | 461 | expect(info.fields[1].is_comptime); |
| 462 | 462 | } |
| 463 | ||
| 464 | test "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 | } |