Sema: fix noalias coercion error message

Closes #11769
This commit is contained in:
Veikka Tuominen
2022-09-02 14:59:06 +03:00
parent 1c4c68e6ba
commit 7a51e0befe
3 changed files with 29 additions and 3 deletions

View File

@@ -23426,8 +23426,11 @@ const InMemoryCoercionResult = union(enum) {
var index: u6 = 0;
var actual_noalias = false;
while (true) : (index += 1) {
if (param.actual << index != param.wanted << index) {
actual_noalias = (param.actual << index) == (1 << 31);
const actual = @truncate(u1, param.actual >> index);
const wanted = @truncate(u1, param.wanted >> index);
if (actual != wanted) {
actual_noalias = actual == 1;
break;
}
}
if (!actual_noalias) {
@@ -23921,7 +23924,7 @@ fn coerceInMemoryAllowedFns(
if (dest_info.noalias_bits != src_info.noalias_bits) {
return InMemoryCoercionResult{ .fn_param_noalias = .{
.actual = dest_info.noalias_bits,
.actual = src_info.noalias_bits,
.wanted = dest_info.noalias_bits,
} };
}

View File

@@ -2042,6 +2042,9 @@ pub const Type = extern union {
try writer.writeAll("fn(");
for (fn_info.param_types) |param_ty, i| {
if (i != 0) try writer.writeAll(", ");
if (std.math.cast(u5, i)) |index| if (@truncate(u1, fn_info.noalias_bits >> index) != 0) {
try writer.writeAll("noalias ");
};
if (param_ty.tag() == .generic_poison) {
try writer.writeAll("anytype");
} else {

View File

@@ -0,0 +1,20 @@
pub export fn entry() void {
comptime var x: fn (noalias *i32, noalias *i32) void = undefined;
x = bar;
}
pub export fn entry1() void {
comptime var x: fn (*i32, *i32) void = undefined;
x = foo;
}
fn foo(noalias _: *i32, noalias _: *i32) void {}
fn bar(noalias _: *i32, _: *i32) void {}
// error
// backend=stage2
// target=native
//
// :3:9: error: expected type 'fn(noalias *i32, noalias *i32) void', found 'fn(noalias *i32, *i32) void'
// :3:9: note: regular parameter 1 cannot cast into a noalias parameter
// :7:9: error: expected type 'fn(*i32, *i32) void', found 'fn(noalias *i32, noalias *i32) void'
// :7:9: note: noalias parameter 0 cannot cast into a regular parameter