Reject OOB index access that are being washed through a ref

Fixes: 343762297
Change-Id: I67bf958e91cddf99ceb4d84d925562ca76ad7d41
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/191423
Commit-Queue: dan sinclair <dsinclair@chromium.org>
Auto-Submit: Ryan Harrison <rharrison@chromium.org>
Commit-Queue: Ryan Harrison <rharrison@chromium.org>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/tint/lang/core/constant/eval.cc b/src/tint/lang/core/constant/eval.cc
index a8e1f84..58beeca 100644
--- a/src/tint/lang/core/constant/eval.cc
+++ b/src/tint/lang/core/constant/eval.cc
@@ -1394,7 +1394,7 @@
                          const core::type::Type* obj_ty,
                          const Value* idx_val,
                          const Source& idx_source) {
-    auto el = obj_ty->UnwrapRef()->Elements();
+    auto el = obj_ty->UnwrapPtrOrRef()->Elements();
 
     AInt idx = idx_val->ValueAs<AInt>();
     if (idx < 0 || (el.count > 0 && idx >= el.count)) {
diff --git a/src/tint/lang/core/constant/eval_indexing_test.cc b/src/tint/lang/core/constant/eval_indexing_test.cc
index b27a053..f764e24 100644
--- a/src/tint/lang/core/constant/eval_indexing_test.cc
+++ b/src/tint/lang/core/constant/eval_indexing_test.cc
@@ -64,6 +64,26 @@
     EXPECT_EQ(r()->error(), "12:34 error: index -3 out of bounds [0..2]");
 }
 
+TEST_F(ConstEvalTest, Vec3_Index_Via_Ptr_OOB_High) {
+    auto* a = Var("a", ty.vec3(ty.i32()));
+    auto* p = Let("p", ty.ptr(function, ty.vec3(ty.i32())), AddressOf(a));
+    auto* expr = IndexAccessor("p", Expr(Source{{12, 34}}, 12_i));
+    WrapInFunction(a, p, expr);
+
+    EXPECT_FALSE(r()->Resolve()) << r()->error();
+    EXPECT_EQ(r()->error(), "12:34 error: index 12 out of bounds [0..2]");
+}
+
+TEST_F(ConstEvalTest, Vec3_Index_Via_Ptr_OOB_Low) {
+    auto* a = Var("a", ty.vec3(ty.i32()));
+    auto* p = Let("p", ty.ptr(function, ty.vec3(ty.i32())), AddressOf(a));
+    auto* expr = IndexAccessor("p", Expr(Source{{12, 34}}, -3_i));
+    WrapInFunction(a, p, expr);
+
+    EXPECT_FALSE(r()->Resolve()) << r()->error();
+    EXPECT_EQ(r()->error(), "12:34 error: index -3 out of bounds [0..2]");
+}
+
 namespace Swizzle {
 struct Case {
     Value input;