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 {
12961296
12971297 .Fn => {
12981298 const info = ty.fnInfo();
1299 if (lookup.isMutable()) {
1300 const param_kind: Kind = switch (kind) {
1301 .forward, .forward_parameter => .forward_parameter,
1302 .complete, .parameter, .global => .parameter,
1303 .payload => unreachable,
1304 };
1305 _ = try lookup.typeToIndex(info.return_type, param_kind);
1306 for (info.param_types) |param_type| {
1307 if (!param_type.hasRuntimeBitsIgnoreComptime()) continue;
1308 _ = try lookup.typeToIndex(param_type, param_kind);
1299 if (!info.is_generic) {
1300 if (lookup.isMutable()) {
1301 const param_kind: Kind = switch (kind) {
1302 .forward, .forward_parameter => .forward_parameter,
1303 .complete, .parameter, .global => .parameter,
1304 .payload => unreachable,
1305 };
1306 _ = try lookup.typeToIndex(info.return_type, param_kind);
1307 for (info.param_types) |param_type| {
1308 if (!param_type.hasRuntimeBitsIgnoreComptime()) continue;
1309 _ = try lookup.typeToIndex(param_type, param_kind);
1310 }
13091311 }
1310 }
1311 self.init(if (info.is_var_args) .varargs_function else .function);
1312 self.init(if (info.is_var_args) .varargs_function else .function);
1313 } else self.init(.void);
13121314 },
13131315 }
13141316 }
......@@ -1619,6 +1621,7 @@ pub const CType = extern union {
16191621 .varargs_function,
16201622 => {
16211623 const info = ty.fnInfo();
1624 assert(!info.is_generic);
16221625 const param_kind: Kind = switch (kind) {
16231626 .forward, .forward_parameter => .forward_parameter,
16241627 .complete, .parameter, .global => .parameter,
......@@ -1764,6 +1767,7 @@ pub const CType = extern union {
17641767 if (ty.zigTypeTag() != .Fn) return false;
17651768
17661769 const info = ty.fnInfo();
1770 assert(!info.is_generic);
17671771 const data = cty.cast(Payload.Function).?.data;
17681772 const param_kind: Kind = switch (self.kind) {
17691773 .forward, .forward_parameter => .forward_parameter,
......@@ -1878,6 +1882,7 @@ pub const CType = extern union {
18781882 .varargs_function,
18791883 => {
18801884 const info = ty.fnInfo();
1885 assert(!info.is_generic);
18811886 const param_kind: Kind = switch (self.kind) {
18821887 .forward, .forward_parameter => .forward_parameter,
18831888 .complete, .parameter, .global => .parameter,
test/behavior/pointers.zig-1
......@@ -507,7 +507,6 @@ test "ptrCast comptime known slice to C pointer" {
507507}
508508
509509test "ptrToInt on a generic function" {
510 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
511510 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
512511 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
513512 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO