[tint] Validation error workgroupUniformLoad non constructible

WorkgroupUniformLoad only accepts a ptr to a parameter that is a
constructible type.

Arrays whose size is defined at pipeline creation time (aka overrides)
are not considered to be creation-fixed-footprint (not constructible).

https://www.w3.org/TR/WGSL/#workgroupUniformLoad-builtin

https://github.com/gpuweb/gpuweb/issues/5093

https://www.w3.org/TR/WGSL/#constructible-types

Bug: 402982337
Change-Id: I3f863bd8cdf54807d4316728ecc47787c2c74543
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/233115
Commit-Queue: Peter McNeeley <petermcneeley@google.com>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Reviewed-by: James Price <jrprice@google.com>
diff --git a/src/tint/lang/wgsl/resolver/validation_test.cc b/src/tint/lang/wgsl/resolver/validation_test.cc
index fa55dd0..7c274cc 100644
--- a/src/tint/lang/wgsl/resolver/validation_test.cc
+++ b/src/tint/lang/wgsl/resolver/validation_test.cc
@@ -1472,6 +1472,35 @@
         R"(1:2 error: shift left value must be less than the bit width of the lhs, which is 32)");
 }
 
+TEST_F(ResolverValidationTest, WorkgroupUniformLoad_ArraySize_NamedOverride) {
+    // override size = 10u;
+    // var<workgroup> a : array<u32, size>;
+    auto* override = Override("size", Expr(10_u));
+    auto* a = GlobalVar(Source{{7, 3}}, "a", ty.array(ty.u32(), override),
+                        core::AddressSpace::kWorkgroup);
+
+    auto* call = Call("workgroupUniformLoad", AddressOf(a));
+    WrapInFunction(call);
+
+    EXPECT_FALSE(r()->Resolve());
+    EXPECT_EQ(
+        r()->error(),
+        R"(error: workgroupUniformLoad must be called with an argument whose type is constructible)");
+}
+
+TEST_F(ResolverValidationTest, WorkgroupUniformLoad_ArraySize_NamedConstant) {
+    // const size = 10u;
+    // var<workgroup> a : array<u32, size>;
+    auto* const_exp = GlobalConst("size", Expr(10_u));
+    auto* a = GlobalVar(Source{{7, 3}}, "a", ty.array(ty.u32(), const_exp),
+                        core::AddressSpace::kWorkgroup);
+
+    auto* call = Call("workgroupUniformLoad", AddressOf(a));
+    WrapInFunction(call);
+
+    EXPECT_TRUE(r()->Resolve()) << r()->error();
+}
+
 }  // namespace
 }  // namespace tint::resolver
 
diff --git a/src/tint/lang/wgsl/resolver/validator.cc b/src/tint/lang/wgsl/resolver/validator.cc
index 1f3a1ac..edd26f0 100644
--- a/src/tint/lang/wgsl/resolver/validator.cc
+++ b/src/tint/lang/wgsl/resolver/validator.cc
@@ -2046,6 +2046,12 @@
         return false;
     }
 
+    if (!ty->IsConstructible()) {
+        AddError(arg->Declaration()->source)
+            << "workgroupUniformLoad must be called with an argument whose type is constructible";
+        return false;
+    }
+
     return true;
 }