| author | |
| committer | |
| log | 560baf67ce77de41da3d03183300cdf1b6d90567 |
| tree | 344f2d67d7e85c64e3bf843369032db575cca996 |
| parent | b0bcd4add29b6fbbe2bbc22719703d3c81ed594b |
Closes #125702 files changed, 22 insertions(+), 1 deletions(-)
src/Sema.zig+1-1| ... | @@ -22564,7 +22564,7 @@ fn coerceExtra( | ... | @@ -22564,7 +22564,7 @@ fn coerceExtra( |
| 22564 | // Function body to function pointer. | 22564 | // Function body to function pointer. |
| 22565 | if (inst_ty.zigTypeTag() == .Fn) { | 22565 | if (inst_ty.zigTypeTag() == .Fn) { |
| 22566 | const fn_val = try sema.resolveConstValue(block, .unneeded, inst, undefined); | 22566 | 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().?; |
| 22568 | const inst_as_ptr = try sema.analyzeDeclRef(fn_decl); | 22568 | const inst_as_ptr = try sema.analyzeDeclRef(fn_decl); |
| 22569 | return sema.coerce(block, dest_ty, inst_as_ptr, inst_src); | 22569 | return sema.coerce(block, dest_ty, inst_as_ptr, inst_src); |
| 22570 | } | 22570 | } |
test/behavior/fn.zig+21| ... | @@ -422,3 +422,24 @@ test "import passed byref to function in return type" { | ... | @@ -422,3 +422,24 @@ test "import passed byref to function in return type" { |
| 422 | var list = S.get(); | 422 | var list = S.get(); |
| 423 | try expect(list.items.len == 0); | 423 | try expect(list.items.len == 0); |
| 424 | } | 424 | } |
| 425 | |||
| 426 | test "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 | } |