authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-02-22 23:32:54-05:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-02-23 00:29:23-05:00
log597e8011f7b2ea76755165fa5a09b2f725180268
treeef7a6ba6500ad2e5e34b48b650729d62e99618ef
parentbdb1e014a085fdd872886dddc66cfe1081887e5c

CType: fix lowering of generic function pointer


2 files changed, 17 insertions(+), 13 deletions(-)

src/codegen/c/type.zig+17-12
...@@ -1296,19 +1296,21 @@ pub const CType = extern union {...@@ -1296,19 +1296,21 @@ pub const CType = extern union {
12961296
1297 .Fn => {1297 .Fn => {
1298 const info = ty.fnInfo();1298 const info = ty.fnInfo();
1299 if (lookup.isMutable()) {1299 if (!info.is_generic) {
1300 const param_kind: Kind = switch (kind) {1300 if (lookup.isMutable()) {
1301 .forward, .forward_parameter => .forward_parameter,1301 const param_kind: Kind = switch (kind) {
1302 .complete, .parameter, .global => .parameter,1302 .forward, .forward_parameter => .forward_parameter,
1303 .payload => unreachable,1303 .complete, .parameter, .global => .parameter,
1304 };1304 .payload => unreachable,
1305 _ = try lookup.typeToIndex(info.return_type, param_kind);1305 };
1306 for (info.param_types) |param_type| {1306 _ = try lookup.typeToIndex(info.return_type, param_kind);
1307 if (!param_type.hasRuntimeBitsIgnoreComptime()) continue;1307 for (info.param_types) |param_type| {
1308 _ = try lookup.typeToIndex(param_type, param_kind);1308 if (!param_type.hasRuntimeBitsIgnoreComptime()) continue;
1309 _ = try lookup.typeToIndex(param_type, param_kind);
1310 }
1309 }1311 }
1310 }1312 self.init(if (info.is_var_args) .varargs_function else .function);
1311 self.init(if (info.is_var_args) .varargs_function else .function);1313 } else self.init(.void);
1312 },1314 },
1313 }1315 }
1314 }1316 }
...@@ -1619,6 +1621,7 @@ pub const CType = extern union {...@@ -1619,6 +1621,7 @@ pub const CType = extern union {
1619 .varargs_function,1621 .varargs_function,
1620 => {1622 => {
1621 const info = ty.fnInfo();1623 const info = ty.fnInfo();
1624 assert(!info.is_generic);
1622 const param_kind: Kind = switch (kind) {1625 const param_kind: Kind = switch (kind) {
1623 .forward, .forward_parameter => .forward_parameter,1626 .forward, .forward_parameter => .forward_parameter,
1624 .complete, .parameter, .global => .parameter,1627 .complete, .parameter, .global => .parameter,
...@@ -1764,6 +1767,7 @@ pub const CType = extern union {...@@ -1764,6 +1767,7 @@ pub const CType = extern union {
1764 if (ty.zigTypeTag() != .Fn) return false;1767 if (ty.zigTypeTag() != .Fn) return false;
17651768
1766 const info = ty.fnInfo();1769 const info = ty.fnInfo();
1770 assert(!info.is_generic);
1767 const data = cty.cast(Payload.Function).?.data;1771 const data = cty.cast(Payload.Function).?.data;
1768 const param_kind: Kind = switch (self.kind) {1772 const param_kind: Kind = switch (self.kind) {
1769 .forward, .forward_parameter => .forward_parameter,1773 .forward, .forward_parameter => .forward_parameter,
...@@ -1878,6 +1882,7 @@ pub const CType = extern union {...@@ -1878,6 +1882,7 @@ pub const CType = extern union {
1878 .varargs_function,1882 .varargs_function,
1879 => {1883 => {
1880 const info = ty.fnInfo();1884 const info = ty.fnInfo();
1885 assert(!info.is_generic);
1881 const param_kind: Kind = switch (self.kind) {1886 const param_kind: Kind = switch (self.kind) {
1882 .forward, .forward_parameter => .forward_parameter,1887 .forward, .forward_parameter => .forward_parameter,
1883 .complete, .parameter, .global => .parameter,1888 .complete, .parameter, .global => .parameter,
test/behavior/pointers.zig-1
...@@ -507,7 +507,6 @@ test "ptrCast comptime known slice to C pointer" {...@@ -507,7 +507,6 @@ test "ptrCast comptime known slice to C pointer" {
507}507}
508508
509test "ptrToInt on a generic function" {509test "ptrToInt on a generic function" {
510 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
511 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO510 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
512 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO511 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
513 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO512 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO