@@ -1085,7 +1085,9 @@ def make_return_type(rtpe: &typechecking::Type) -> typechecking::TypeId {
10851085 return type_registry_return_types(rtpe.id).id
10861086 }
10871087
1088- assert typechecking::is_tuple(rtpe)
1088+ if not typechecking::is_tuple(rtpe) {
1089+ return 0
1090+ }
10891091 let length = vector::length(rtpe.return_t)
10901092 let fields = vector::make(typechecking::StructMember)
10911093
@@ -4130,6 +4132,10 @@ type Member = struct {
41304132
41314133// This list needs to be reversed to find the actual indices
41324134def resolve_member(vec: &Vector(Member), tpe: &typechecking::Type, name: Str) -> bool {
4135+ if not tpe { return false }
4136+ if tpe.kind == typechecking::TypeKind::REFERENCE {
4137+ tpe = tpe.tpe.resolve()
4138+ }
41334139 let fields = tpe.fields
41344140 if not fields { return false }
41354141 for var i in 0..fields.length() {
@@ -6336,8 +6342,12 @@ def walk_Assert(node: &parser::Node, state: &State) {
63366342 import_structures(scope::get(state.scope, parser::make_identifier("fprintf")).get_type(), state.module)
63376343
63386344 let std_module = toolchain::find_module("std")
6345+ if not std_module { return }
63396346 let stderr_fun = scope::get(std_module.scope, parser::make_identifier("stderr"))
63406347 let print_stacktrace_fun = scope::get(std_module.scope, parser::make_identifier("print_stacktrace"))
6348+ predeclare_function(stderr_fun.fdef, state.module)
6349+ predeclare_function(print_stacktrace_fun.fdef, state.module)
6350+
63416351 //let fun = predeclare_function(stderr_fun, std_module)
63426352 //state.module.result.functions[stderr_fun.type_name] = fun
63436353
@@ -6396,7 +6406,9 @@ def walk_Assert(node: &parser::Node, state: &State) {
63966406 fmt = "%s:%d:%s: Unreachable!\n"
63976407 }
63986408
6399- let stderr = make_local_value(builtins::File_, null, state)
6409+ let file = stderr_fun.fdef.to_type().resolve().return_t(0)
6410+ import_structures(file, state.module)
6411+ let stderr = make_local_value(file, null, state)
64006412 let mcall = make_insn_dbg(InsnKind::CALL, loc)
64016413 mcall.value.call = [
64026414 name = [
@@ -6421,7 +6433,7 @@ def walk_Assert(node: &parser::Node, state: &State) {
64216433 args(4) = charp(function_name, state)
64226434
64236435 let proto = allocate_ref(typechecking::NamedParameter, 3)
6424- proto(0) = [ tpe = builtins::File_ ] !typechecking::NamedParameter
6436+ proto(0) = [ tpe = file ] !typechecking::NamedParameter
64256437 proto(1) = [ tpe = typechecking::pointer(builtins::char_) ] !typechecking::NamedParameter
64266438 proto(2) = [ varargs = true ] !typechecking::NamedParameter
64276439
@@ -7159,6 +7171,7 @@ export def predeclare_function(function: &Function, scpe: &scope::Scope, overwri
71597171 function.args = vector::make(typechecking::NamedParameter)
71607172 for var i in 0..vector::length(fdef.parameter_t) {
71617173 let np = fdef.parameter_t(i)
7174+ if np.kw == parser::VarDecl::TYPE { continue }
71627175 let restpe = np.tpe.resolve(scpe)
71637176 if restpe {
71647177 let resnp = [
@@ -9273,12 +9286,12 @@ def generate_reflection_data_2(tpe: &typechecking::Type, data: &ByteStream, stri
92739286 case typechecking::TypeKind::INTERFACE
92749287 for var member in tpe.members {
92759288 for var np in member.parameter_t {
9276- assert np.tpe.tpe
9277- data.write(np.tpe.tpe !uint64)
9289+ assert np.tpe
9290+ data.write(np.tpe !uint64)
92789291 }
92799292 for var t in member.return_t {
9280- assert t.tpe.tpe
9281- data.write(t.tpe.tpe !uint64)
9293+ assert t
9294+ data.write(t !uint64)
92829295 }
92839296 }
92849297 case typechecking::TypeKind::POINTER, typechecking::TypeKind::REFERENCE,
@@ -9521,7 +9534,7 @@ def generate_vtable_function(function: &Function, fdef: typechecking::FunctionDe
95219534 }
95229535 }
95239536
9524- if kind != 0 and implementor.kind != typechecking::TypeKind::STRUCT { continue }
9537+ if kind != 0 and implementor.kind != typechecking::TypeKind::REFERENCE { continue }
95259538
95269539 if not consteval::is_static {
95279540 import_structure(implementor, state.module)
0 commit comments