aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-03-11 11:24:01 +0200
committerVeikka Tuominen <git@vexu.eu>2022-03-11 11:25:45 +0200
commit98a5998d831fd0fa7b897aafacf4c2af18e64ed1 (patch)
tree04846185bf4314afe9c942a7e72e13ae76ae51cd /src
parent078037ab9b410fa13a86eabdfc30918fc83cdcf3 (diff)
downloadzig-98a5998d831fd0fa7b897aafacf4c2af18e64ed1.tar.gz
zig-98a5998d831fd0fa7b897aafacf4c2af18e64ed1.zip
Sema: improve detection of generic parameters
Diffstat (limited to 'src')
-rw-r--r--src/Sema.zig13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index 2a3236e8ad..619d9a0664 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -5923,6 +5923,10 @@ fn funcCommon(
break :ret_ty ret_ty;
} else |err| break :err err;
} else |err| break :err err;
+ // Check for generic params.
+ for (block.params.items) |param| {
+ if (param.ty.tag() == .generic_poison) is_generic = true;
+ }
};
switch (err) {
error.GenericPoison => {
@@ -6111,6 +6115,13 @@ fn zirParam(
if (sema.resolveBody(block, body, inst)) |param_ty_inst| {
if (sema.analyzeAsType(block, src, param_ty_inst)) |param_ty| {
+ if (param_ty.zigTypeTag() == .Fn and param_ty.fnInfo().is_generic) {
+ // zirFunc will not emit error.GenericPoison to build a
+ // partial type for generic functions but we still need to
+ // detect if a function parameter is a generic function
+ // to force the parent function to also be generic.
+ break :err error.GenericPoison;
+ }
break :param_ty param_ty;
} else |err| break :err err;
} else |err| break :err err;
@@ -10965,6 +10976,7 @@ fn zirTypeofBuiltin(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErr
const operand = try sema.resolveBody(&child_block, body, inst);
const operand_ty = sema.typeOf(operand);
+ if (operand_ty.tag() == .generic_poison) return error.GenericPoison;
return sema.addType(operand_ty);
}
@@ -11044,6 +11056,7 @@ fn zirTypeofPeer(
for (args) |arg_ref, i| {
inst_list[i] = sema.resolveInst(arg_ref);
+ if (sema.typeOf(inst_list[i]).tag() == .generic_poison) return error.GenericPoison;
}
const result_type = try sema.resolvePeerTypes(block, src, inst_list, .{ .typeof_builtin_call_node_offset = extra.data.src_node });