Commit 7a51e0befe
Changed files (3)
test
cases
compile_errors
src/Sema.zig
@@ -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,
} };
}
src/type.zig
@@ -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 {
test/cases/compile_errors/noalias_param_coersion.zig
@@ -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