@@ -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,
|
||||
} };
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
20
test/cases/compile_errors/noalias_param_coersion.zig
Normal file
20
test/cases/compile_errors/noalias_param_coersion.zig
Normal 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
|
||||
Reference in New Issue
Block a user