[tint] Handle binding_array in promote_side_effects_to_decl

Bug: 393558555
Change-Id: I24f612690f056e003369af8a3e7357528396d59f
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/229176
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/tint/lang/wgsl/ast/transform/promote_side_effects_to_decl.cc b/src/tint/lang/wgsl/ast/transform/promote_side_effects_to_decl.cc
index 105650d..0bc61d2 100644
--- a/src/tint/lang/wgsl/ast/transform/promote_side_effects_to_decl.cc
+++ b/src/tint/lang/wgsl/ast/transform/promote_side_effects_to_decl.cc
@@ -293,9 +293,7 @@
                         }
                         // Don't hoist textures / samplers as they can't be placed into a let, nor
                         // can they have side effects.
-                        if (var_user->Variable()
-                                ->Type()
-                                ->IsAnyOf<core::type::Texture, core::type::Sampler>()) {
+                        if (var_user->Variable()->Type()->IsHandle()) {
                             return false;
                         }
                         return true;
diff --git a/src/tint/lang/wgsl/ast/transform/promote_side_effects_to_decl_test.cc b/src/tint/lang/wgsl/ast/transform/promote_side_effects_to_decl_test.cc
index 901c85c..e89dad0 100644
--- a/src/tint/lang/wgsl/ast/transform/promote_side_effects_to_decl_test.cc
+++ b/src/tint/lang/wgsl/ast/transform/promote_side_effects_to_decl_test.cc
@@ -3787,6 +3787,7 @@
     auto* src = R"(
 @group(1) @binding(1) var tex: texture_2d_array<u32>;
 @group(1) @binding(2) var samp: sampler;
+@group(1) @binding(2) var arr: binding_array<texture_2d<f32>, 3>;
 
 fn get_uv() -> vec2<f32> {
   return vec2<f32>(1.0, 2.0);
@@ -3794,6 +3795,7 @@
 
 fn f() {
   let r = textureGather(1, tex, samp, get_uv(), 1);
+  let p = textureGather(1, arr[0], samp, get_uv());
 }
 )";
 
@@ -3802,6 +3804,8 @@
 
 @group(1) @binding(2) var samp : sampler;
 
+@group(1) @binding(2) var arr : binding_array<texture_2d<f32>, 3>;
+
 fn get_uv() -> vec2<f32> {
   return vec2<f32>(1.0, 2.0);
 }
@@ -3809,6 +3813,8 @@
 fn f() {
   let tint_symbol : vec2<f32> = get_uv();
   let r = textureGather(1, tex, samp, tint_symbol, 1);
+  let tint_symbol_1 : vec2<f32> = get_uv();
+  let p = textureGather(1, arr[0], samp, tint_symbol_1);
 }
 )";
 
@@ -4129,10 +4135,11 @@
     EXPECT_EQ(expect, str(got));
 }
 
-TEST_F(PromoteSideEffectsToDeclTest, TextureSamplerParameter) {
+TEST_F(PromoteSideEffectsToDeclTest, HandleParameter) {
     auto* src = R"(
 @group(0) @binding(0) var T : texture_2d<f32>;
 @group(0) @binding(1) var S : sampler;
+@group(0) @binding(2) var A : binding_array<texture_2d<f32>, 3>;
 
 var<private> P : vec2<f32>;
 fn side_effects() -> vec2<f32> {
@@ -4140,12 +4147,13 @@
   return P;
 }
 
-fn f(t : texture_2d<f32>, s : sampler) -> vec4<f32> {
-  return textureSample(t, s, side_effects());
+fn f(t : texture_2d<f32>, s : sampler, a: binding_array<texture_2d<f32>, 3>) {
+  let p = textureSample(t, s, side_effects());
+  let r = textureSample(a[0], s, side_effects());
 }
 
-fn m() -> vec4<f32>{
-  return f(T, S);
+fn m() {
+  f(T, S, A);
 }
 )";
 
@@ -4154,6 +4162,8 @@
 
 @group(0) @binding(1) var S : sampler;
 
+@group(0) @binding(2) var A : binding_array<texture_2d<f32>, 3>;
+
 var<private> P : vec2<f32>;
 
 fn side_effects() -> vec2<f32> {
@@ -4161,13 +4171,15 @@
   return P;
 }
 
-fn f(t : texture_2d<f32>, s : sampler) -> vec4<f32> {
+fn f(t : texture_2d<f32>, s : sampler, a : binding_array<texture_2d<f32>, 3>) {
   let tint_symbol : vec2<f32> = side_effects();
-  return textureSample(t, s, tint_symbol);
+  let p = textureSample(t, s, tint_symbol);
+  let tint_symbol_1 : vec2<f32> = side_effects();
+  let r = textureSample(a[0], s, tint_symbol_1);
 }
 
-fn m() -> vec4<f32> {
-  return f(T, S);
+fn m() {
+  f(T, S, A);
 }
 )";