Commit 72980388ca
2020-11-20 16:38:00
1 parent
c6c25a1Changed files (4)
src
test
stage1
behavior
src/stage1/analyze.cpp
@@ -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;
}
src/stage1/analyze.hpp
@@ -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);
src/stage1/ir.cpp
@@ -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{};
test/stage1/behavior/type_info.zig
@@ -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
+}