authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-08-22 10:54:07+03:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-08-22 11:16:36+03:00
log560baf67ce77de41da3d03183300cdf1b6d90567
tree344f2d67d7e85c64e3bf843369032db575cca996
parentb0bcd4add29b6fbbe2bbc22719703d3c81ed594b

Sema: fix implicit cast from extern fn to fn ptr

Closes #12570

2 files changed, 22 insertions(+), 1 deletions(-)

src/Sema.zig+1-1
......@@ -22564,7 +22564,7 @@ fn coerceExtra(
2256422564 // Function body to function pointer.
2256522565 if (inst_ty.zigTypeTag() == .Fn) {
2256622566 const fn_val = try sema.resolveConstValue(block, .unneeded, inst, undefined);
22567 const fn_decl = fn_val.castTag(.function).?.data.owner_decl;
22567 const fn_decl = fn_val.pointerDecl().?;
2256822568 const inst_as_ptr = try sema.analyzeDeclRef(fn_decl);
2256922569 return sema.coerce(block, dest_ty, inst_as_ptr, inst_src);
2257022570 }
test/behavior/fn.zig+21
......@@ -422,3 +422,24 @@ test "import passed byref to function in return type" {
422422 var list = S.get();
423423 try expect(list.items.len == 0);
424424}
425
426test "implicit cast function to function ptr" {
427 if (builtin.zig_backend == .stage1) return error.SkipZigTest;
428 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
429 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
430 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
431 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
432
433 const S1 = struct {
434 export fn someFunctionThatReturnsAValue() c_int {
435 return 123;
436 }
437 };
438 var fnPtr1: *const fn () callconv(.C) c_int = S1.someFunctionThatReturnsAValue;
439 try expect(fnPtr1() == 123);
440 const S2 = struct {
441 extern fn someFunctionThatReturnsAValue() c_int;
442 };
443 var fnPtr2: *const fn () callconv(.C) c_int = S2.someFunctionThatReturnsAValue;
444 try expect(fnPtr2() == 123);
445}