| author | |
| committer | |
| log | 72980388ca8aeeadb7dde51ed10aa978620e049c |
| tree | 033e92f56594ed41eb2b13ad6e743ac2c2175560 |
| parent | c6c25a1c09531d78957befe9d194436ec1c110ef |
Closes #71764 files changed, 22 insertions(+), 1 deletions(-)
src/stage1/analyze.cpp+5-1| ... | ... | @@ -4386,7 +4386,7 @@ void resolve_top_level_decl(CodeGen *g, Tld *tld, AstNode *source_node, bool all |
| 4386 | 4386 | } |
| 4387 | 4387 | } |
| 4388 | 4388 | |
| 4389 | Tld *find_container_decl(CodeGen *g, ScopeDecls *decls_scope, Buf *name) { | |
| 4389 | void resolve_container_usingnamespace_decls(CodeGen *g, ScopeDecls *decls_scope) { | |
| 4390 | 4390 | // resolve all the using_namespace decls |
| 4391 | 4391 | for (size_t i = 0; i < decls_scope->use_decls.length; i += 1) { |
| 4392 | 4392 | TldUsingNamespace *tld_using_namespace = decls_scope->use_decls.at(i); |
| ... | ... | @@ -4396,6 +4396,10 @@ Tld *find_container_decl(CodeGen *g, ScopeDecls *decls_scope, Buf *name) { |
| 4396 | 4396 | } |
| 4397 | 4397 | } |
| 4398 | 4398 | |
| 4399 | } | |
| 4400 | ||
| 4401 | Tld *find_container_decl(CodeGen *g, ScopeDecls *decls_scope, Buf *name) { | |
| 4402 | resolve_container_usingnamespace_decls(g, decls_scope); | |
| 4399 | 4403 | auto entry = decls_scope->decl_table.maybe_get(name); |
| 4400 | 4404 | return (entry == nullptr) ? nullptr : entry->value; |
| 4401 | 4405 | } |
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| ... | ... | @@ -24890,6 +24890,8 @@ static Error ir_make_type_info_decls(IrAnalyze *ira, IrInst* source_instr, ZigVa |
| 24890 | 24890 | if ((err = type_resolve(ira->codegen, type_info_fn_decl_inline_type, ResolveStatusSizeKnown))) |
| 24891 | 24891 | return err; |
| 24892 | 24892 | |
| 24893 | resolve_container_usingnamespace_decls(ira->codegen, decls_scope); | |
| 24894 | ||
| 24893 | 24895 | // The unresolved declarations are collected in a separate queue to avoid |
| 24894 | 24896 | // modifying decl_table while iterating over it |
| 24895 | 24897 | 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 | } |