authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-03-21 13:25:57+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-03-21 15:12:32-04:00
log0577069af5f5deb859762725736537d60c324453
treef57aaa7713101bd2cabc82f505bdd156a988ac04
parentb48d8cce52369e7625f9dab8a37efe9c3a33186b

stage2 llvm: fix lowerDeclRefValue for function aliases


6 files changed, 34 insertions(+), 10 deletions(-)

lib/std/fmt.zig-1
......@@ -762,7 +762,6 @@ fn formatFloatValue(
762762 if (fmt.len == 0 or comptime std.mem.eql(u8, fmt, "e")) {
763763 formatFloatScientific(value, options, buf_stream.writer()) catch |err| switch (err) {
764764 error.NoSpaceLeft => unreachable,
765 else => |e| return e,
766765 };
767766 } else if (comptime std.mem.eql(u8, fmt, "d")) {
768767 formatFloatDecimal(value, options, buf_stream.writer()) catch |err| switch (err) {
lib/std/os/linux.zig+2-7
......@@ -1080,13 +1080,8 @@ pub fn sigaction(sig: u6, noalias act: ?*const Sigaction, noalias oact: ?*Sigact
10801080 const mask_size = @sizeOf(@TypeOf(ksa.mask));
10811081
10821082 if (act) |new| {
1083 const restore_rt_ptr = if (builtin.zig_backend == .stage1) restore_rt else &syscall_bits.restore_rt;
1084 // TODO https://github.com/ziglang/zig/issues/11227
1085 const restore_ptr = if (builtin.zig_backend == .stage1) restore else switch (native_arch) {
1086 .arm, .thumb, .mips, .mipsel, .i386 => &syscall_bits.restore,
1087 .x86_64, .aarch64, .riscv64, .sparcv9, .powerpc, .powerpc64, .powerpc64le => &syscall_bits.restore_rt,
1088 else => unreachable,
1089 };
1083 const restore_rt_ptr = if (builtin.zig_backend == .stage1) restore_rt else &restore_rt;
1084 const restore_ptr = if (builtin.zig_backend == .stage1) restore else &restore;
10901085 const restorer_fn = if ((new.flags & SA.SIGINFO) != 0) restore_rt_ptr else restore_ptr;
10911086 ksa = k_sigaction{
10921087 .handler = new.handler.handler,
src/codegen/llvm.zig+11
......@@ -3073,6 +3073,17 @@ pub const DeclGen = struct {
30733073 return self.context.constStruct(&fields, fields.len, .False);
30743074 }
30753075
3076 // In the case of something like:
3077 // fn foo() void {}
3078 // const bar = foo;
3079 // ... &bar;
3080 // `bar` is just an alias and we actually want to lower a reference to `foo`.
3081 if (decl.val.castTag(.function)) |func| {
3082 if (func.data.owner_decl != decl) {
3083 return self.lowerDeclRefValue(tv, func.data.owner_decl);
3084 }
3085 }
3086
30763087 const is_fn_body = decl.ty.zigTypeTag() == .Fn;
30773088 if (!is_fn_body and !decl.ty.hasRuntimeBitsIgnoreComptime()) {
30783089 return self.lowerPtrToVoid(tv.ty);
test/behavior.zig+1
......@@ -161,6 +161,7 @@ test {
161161 builtin.zig_backend != .stage2_wasm and
162162 builtin.zig_backend != .stage2_c)
163163 {
164 _ = @import("behavior/bugs/11227.zig");
164165 _ = @import("behavior/export.zig");
165166 _ = @import("behavior/export_self_referential_type_info.zig");
166167 }
test/behavior/bugs/11227.zig created+13
......@@ -0,0 +1,13 @@
1const std = @import("std");
2const builtin = @import("builtin");
3
4fn foo() u32 {
5 return 11227;
6}
7const bar = foo;
8test "pointer to alias behaves same as pointer to function" {
9 if (builtin.zig_backend == .stage1) return error.SkipZigTest; // stage1 has different function pointers
10
11 var a = &bar;
12 try std.testing.expect(foo() == a());
13}
test/behavior/bugs/1277.zig+7-2
......@@ -2,15 +2,20 @@ const std = @import("std");
22const builtin = @import("builtin");
33
44const S = struct {
5 f: ?fn () i32,
5 f: ?*const fn () i32,
66};
77
8const s = S{ .f = f };
8const s = S{ .f = &f };
99
1010fn f() i32 {
1111 return 1234;
1212}
1313
1414test "don't emit an LLVM global for a const function when it's in an optional in a struct" {
15 if (builtin.zig_backend == .stage1) return error.SkipZigTest; // stage1 has different function pointers
16 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
17 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
18 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
19
1520 try std.testing.expect(s.f.?() == 1234);
1621}