Commit 72980388ca

LemonBoy <thatlemon@gmail.com>
2020-11-20 16:38:00
stage1: Resolve usingnamespace decls when calling @typeInfo
Closes #7176
1 parent c6c25a1
Changed 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
+}