diff options
| -rw-r--r-- | src/Sema.zig | 4 | ||||
| -rw-r--r-- | test/cases/compile_errors/noalias_on_non_pointer_param.zig | 6 |
2 files changed, 9 insertions, 1 deletions
diff --git a/src/Sema.zig b/src/Sema.zig index ede4eaf0e7..e8ed010a7c 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -8820,7 +8820,9 @@ fn analyzeParameter( }; return sema.failWithOwnedErrorMsg(msg); } - if (!this_generic and is_noalias and !param.ty.isPtrAtRuntime()) { + if (!sema.is_generic_instantiation and !this_generic and is_noalias and + !(param.ty.zigTypeTag() == .Pointer or param.ty.isPtrLikeOptional())) + { return sema.fail(block, param_src, "non-pointer parameter declared noalias", .{}); } } diff --git a/test/cases/compile_errors/noalias_on_non_pointer_param.zig b/test/cases/compile_errors/noalias_on_non_pointer_param.zig index f637013c93..806808820f 100644 --- a/test/cases/compile_errors/noalias_on_non_pointer_param.zig +++ b/test/cases/compile_errors/noalias_on_non_pointer_param.zig @@ -1,6 +1,12 @@ fn f(noalias x: i32) void { _ = x; } export fn entry() void { f(1234); } +fn generic(comptime T: type, noalias _: [*]T, noalias _: [*]const T, _: usize) void {} +comptime { _ = generic; } + +fn slice(noalias _: []u8) void {} +comptime { _ = slice; } + // error // backend=stage2 // target=native |
