Sema: increment extra index even if return type is generic

This commit is contained in:
David Rubin 2025-03-05 18:20:15 -08:00 committed by Alex Rønne Petersen
parent 9720bade7a
commit 1b62a22268
2 changed files with 29 additions and 3 deletions

View File

@ -26017,13 +26017,12 @@ fn zirFuncFancy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A
break :cc .auto;
};
const ret_ty: Type = if (extra.data.bits.ret_ty_is_generic)
.generic_poison
else if (extra.data.bits.has_ret_ty_body) blk: {
const ret_ty: Type = if (extra.data.bits.has_ret_ty_body) blk: {
const body_len = sema.code.extra[extra_index];
extra_index += 1;
const body = sema.code.bodySlice(extra_index, body_len);
extra_index += body.len;
if (extra.data.bits.ret_ty_is_generic) break :blk .generic_poison;
const val = try sema.resolveGenericBody(block, ret_src, body, inst, Type.type, .{ .simple = .function_ret_ty });
const ty = val.toType();
@ -26031,6 +26030,8 @@ fn zirFuncFancy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A
} else if (extra.data.bits.has_ret_ty_ref) blk: {
const ret_ty_ref: Zir.Inst.Ref = @enumFromInt(sema.code.extra[extra_index]);
extra_index += 1;
if (extra.data.bits.ret_ty_is_generic) break :blk .generic_poison;
const ret_ty_air_ref = try sema.resolveInst(ret_ty_ref);
const ret_ty_val = try sema.resolveConstDefinedValue(block, ret_src, ret_ty_air_ref, .{ .simple = .function_ret_ty });
break :blk ret_ty_val.toType();

View File

@ -646,3 +646,28 @@ test "generic struct captures slice of another struct" {
const T = S.Bar(&S.foo_array);
comptime std.debug.assert(T.foo_ptr == &S.foo_array);
}
test "noalias paramters with generic return type" {
const S = struct {
pub fn a(noalias _: *u8, im_noalias: usize) im_noalias {}
pub fn b(noalias _: *u8, im_noalias: usize, x: *isize) x {
_ = im_noalias;
}
pub fn c(noalias _: *u8, im_noalias: usize, x: isize) struct { x } {
_ = im_noalias;
}
pub fn d(noalias _: *u8, im_noalias: usize, _: anytype) struct { im_noalias } {}
pub fn e(noalias _: *u8, _: usize, im_noalias: [5]u9) switch (@TypeOf(im_noalias)) {
else => void,
} {}
pub fn f(noalias _: *u8, _: anytype, im_noalias: u8) switch (@TypeOf(im_noalias)) {
else => enum { x, y, z },
} {}
};
_ = S.a;
_ = S.b;
_ = S.c;
_ = S.d;
_ = S.e;
_ = S.f;
}