[ir][msl] Fix const of non-entrypoint pointers
Add the `const` modifier to the non-entrypoint pointer parameters
Bug: tint:1967
Change-Id: I0e3ce118544ae257704fb696056a43f3ab927a62
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/162822
Reviewed-by: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Auto-Submit: dan sinclair <dsinclair@chromium.org>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
diff --git a/src/tint/lang/msl/writer/printer/printer.cc b/src/tint/lang/msl/writer/printer/printer.cc
index b7a6935..d8532de 100644
--- a/src/tint/lang/msl/writer/printer/printer.cc
+++ b/src/tint/lang/msl/writer/printer/printer.cc
@@ -251,6 +251,13 @@
// TODO(dsinclair): Handle parameter attributes
EmitType(out, param->Type());
out << " ";
+
+ // Non-entrypoint pointers are set to `const` for the value
+ if (func->Stage() == core::ir::Function::PipelineStage::kUndefined &&
+ param->Type()->Is<core::type::Pointer>()) {
+ out << "const ";
+ }
+
EmitFunctionParam(out, param);
}
diff --git a/test/tint/bug/chromium/1433499.wgsl.expected.ir.msl b/test/tint/bug/chromium/1433499.wgsl.expected.ir.msl
index 2c9000e..95b1b95 100644
--- a/test/tint/bug/chromium/1433499.wgsl.expected.ir.msl
+++ b/test/tint/bug/chromium/1433499.wgsl.expected.ir.msl
@@ -1,6 +1,6 @@
#include <metal_stdlib>
using namespace metal;
-void f(thread float* p) {
+void f(thread float* const p) {
thread float* const x = p;
}
diff --git a/test/tint/types/functions/parameters.wgsl.expected.ir.msl b/test/tint/types/functions/parameters.wgsl.expected.ir.msl
index 875b265..02d24a8 100644
--- a/test/tint/types/functions/parameters.wgsl.expected.ir.msl
+++ b/test/tint/types/functions/parameters.wgsl.expected.ir.msl
@@ -1,8 +1,3 @@
-SKIP: FAILED
-
-### Lost the `const` on the three `param_ptr` variables
-
-
#include <metal_stdlib>
using namespace metal;
template<typename T, size_t N>
@@ -21,7 +16,7 @@
float a;
};
-void foo(bool param_bool, int param_i32, uint param_u32, float param_f32, int2 param_v2i32, uint3 param_v3u32, float4 param_v4f32, float2x3 param_m2x3, tint_array<float, 4> param_arr, S param_struct, thread float* param_ptr_f32, thread float4* param_ptr_vec, thread tint_array<float, 4>* param_ptr_arr) {
+void foo(bool param_bool, int param_i32, uint param_u32, float param_f32, int2 param_v2i32, uint3 param_v3u32, float4 param_v4f32, float2x3 param_m2x3, tint_array<float, 4> param_arr, S param_struct, thread float* const param_ptr_f32, thread float4* const param_ptr_vec, thread tint_array<float, 4>* const param_ptr_arr) {
}
kernel void tint_symbol() {
}