| 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,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 | // resolve all the using_namespace decls | 4390 | // resolve all the using_namespace decls |
| 4391 | for (size_t i = 0; i < decls_scope->use_decls.length; i += 1) { | 4391 | for (size_t i = 0; i < decls_scope->use_decls.length; i += 1) { |
| 4392 | TldUsingNamespace *tld_using_namespace = decls_scope->use_decls.at(i); | 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,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 | auto entry = decls_scope->decl_table.maybe_get(name); | 4403 | auto entry = decls_scope->decl_table.maybe_get(name); |
| 4400 | return (entry == nullptr) ? nullptr : entry->value; | 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,6 +79,7 @@ ZigVar *find_variable(CodeGen *g, Scope *orig_context, Buf *name, ScopeFnDef **c |
| 79 | Tld *find_decl(CodeGen *g, Scope *scope, Buf *name); | 79 | Tld *find_decl(CodeGen *g, Scope *scope, Buf *name); |
| 80 | Tld *find_container_decl(CodeGen *g, ScopeDecls *decls_scope, Buf *name); | 80 | Tld *find_container_decl(CodeGen *g, ScopeDecls *decls_scope, Buf *name); |
| 81 | void resolve_top_level_decl(CodeGen *g, Tld *tld, AstNode *source_node, bool allow_lazy); | 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 | ZigType *get_src_ptr_type(ZigType *type); | 84 | ZigType *get_src_ptr_type(ZigType *type); |
| 84 | uint32_t get_ptr_align(CodeGen *g, ZigType *type); | 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,6 +24890,8 @@ static Error ir_make_type_info_decls(IrAnalyze *ira, IrInst* source_instr, ZigVa |
| 24890 | if ((err = type_resolve(ira->codegen, type_info_fn_decl_inline_type, ResolveStatusSizeKnown))) | 24890 | if ((err = type_resolve(ira->codegen, type_info_fn_decl_inline_type, ResolveStatusSizeKnown))) |
| 24891 | return err; | 24891 | return err; |
| 24892 | 24892 | ||
| 24893 | resolve_container_usingnamespace_decls(ira->codegen, decls_scope); | ||
| 24894 | |||
| 24893 | // The unresolved declarations are collected in a separate queue to avoid | 24895 | // The unresolved declarations are collected in a separate queue to avoid |
| 24894 | // modifying decl_table while iterating over it | 24896 | // modifying decl_table while iterating over it |
| 24895 | ZigList<Tld*> resolve_decl_queue{}; | 24897 | 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 | |||
| 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 | } |