stage1: Resolve usingnamespace decls when calling @typeInfo

Closes #7176
This commit is contained in:
LemonBoy 2020-11-20 16:38:00 +01:00 committed by Andrew Kelley
parent c6c25a1c09
commit 72980388ca
4 changed files with 22 additions and 1 deletions

View File

@ -4386,7 +4386,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);
@ -4396,6 +4396,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;
}

View File

@ -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);

View File

@ -24890,6 +24890,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{};

View File

@ -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
}