aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-11-04 18:13:49 +0200
committerVeikka Tuominen <git@vexu.eu>2022-11-04 23:13:49 +0200
commit42db468dcb3de15426f9f8ec8da78e36155e3510 (patch)
treeeb0ed437afeb6c02b8a5add1943a8ec1ec02e011 /src
parent35afa3fd8bdc140baf9d135711833e836de04d86 (diff)
downloadzig-42db468dcb3de15426f9f8ec8da78e36155e3510.tar.gz
zig-42db468dcb3de15426f9f8ec8da78e36155e3510.zip
Sema: make method call work with optionals and error unions
Closes #13414
Diffstat (limited to 'src')
-rw-r--r--src/Sema.zig23
1 files changed, 22 insertions, 1 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index 08aecb6097..849b0053ac 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -22833,6 +22833,7 @@ fn fieldCallBind(
{
const first_param_type = decl_type.fnParamType(0);
const first_param_tag = first_param_type.tag();
+ var opt_buf: Type.Payload.ElemType = undefined;
// zig fmt: off
if (first_param_tag == .var_args_param or
first_param_tag == .generic_poison or (
@@ -22851,7 +22852,27 @@ fn fieldCallBind(
});
return sema.addConstant(ty, value);
} else if (first_param_type.eql(concrete_ty, sema.mod)) {
- var deref = try sema.analyzeLoad(block, src, object_ptr, src);
+ const deref = try sema.analyzeLoad(block, src, object_ptr, src);
+ const ty = Type.Tag.bound_fn.init();
+ const value = try Value.Tag.bound_fn.create(arena, .{
+ .func_inst = decl_val,
+ .arg0_inst = deref,
+ });
+ return sema.addConstant(ty, value);
+ } else if (first_param_tag != .generic_poison and first_param_type.zigTypeTag() == .Optional and
+ first_param_type.optionalChild(&opt_buf).eql(concrete_ty, sema.mod))
+ {
+ const deref = try sema.analyzeLoad(block, src, object_ptr, src);
+ const ty = Type.Tag.bound_fn.init();
+ const value = try Value.Tag.bound_fn.create(arena, .{
+ .func_inst = decl_val,
+ .arg0_inst = deref,
+ });
+ return sema.addConstant(ty, value);
+ } else if (first_param_tag != .generic_poison and first_param_type.zigTypeTag() == .ErrorUnion and
+ first_param_type.errorUnionPayload().eql(concrete_ty, sema.mod))
+ {
+ const deref = try sema.analyzeLoad(block, src, object_ptr, src);
const ty = Type.Tag.bound_fn.init();
const value = try Value.Tag.bound_fn.create(arena, .{
.func_inst = decl_val,