Resolver: validate vector swizzle index is valid

Bug: tint:217
Change-Id: Ie8988b68f43914d1b05d982c8aa6f8b7346e2d8f
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/52800
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Antonio Maiorano <amaiorano@google.com>
Reviewed-by: David Neto <dneto@google.com>
diff --git a/src/resolver/resolver.cc b/src/resolver/resolver.cc
index 99dc700..3f9a9da 100644
--- a/src/resolver/resolver.cc
+++ b/src/resolver/resolver.cc
@@ -1983,6 +1983,12 @@
               expr->member()->source().Begin() + swizzle.size());
           return false;
       }
+
+      if (swizzle.back() >= vec->size()) {
+        diagnostics_.add_error("invalid vector swizzle member",
+                               expr->member()->source());
+        return false;
+      }
     }
 
     if (size < 1 || size > 4) {
diff --git a/src/resolver/resolver_test.cc b/src/resolver/resolver_test.cc
index e4c777a..aa71692 100644
--- a/src/resolver/resolver_test.cc
+++ b/src/resolver/resolver_test.cc
@@ -1115,7 +1115,7 @@
 }
 
 TEST_F(ResolverTest, Expr_MemberAccessor_VectorSwizzle) {
-  Global("my_vec", ty.vec3<f32>(), ast::StorageClass::kInput);
+  Global("my_vec", ty.vec4<f32>(), ast::StorageClass::kInput);
 
   auto* mem = MemberAccessor("my_vec", "xzyw");
   WrapInFunction(mem);
diff --git a/src/resolver/validation_test.cc b/src/resolver/validation_test.cc
index 4b9731c..f5933fc 100644
--- a/src/resolver/validation_test.cc
+++ b/src/resolver/validation_test.cc
@@ -389,7 +389,7 @@
 }
 
 TEST_F(ResolverValidationTest, Expr_MemberAccessor_VectorSwizzle_MixedChars) {
-  Global("my_vec", ty.vec3<f32>(), ast::StorageClass::kInput);
+  Global("my_vec", ty.vec4<f32>(), ast::StorageClass::kInput);
 
   auto* ident = create<ast::IdentifierExpression>(
       Source{{Source::Location{3, 3}, Source::Location{3, 7}}},
@@ -417,6 +417,18 @@
   EXPECT_EQ(r()->error(), "3:3 error: invalid vector swizzle size");
 }
 
+TEST_F(ResolverValidationTest, Expr_MemberAccessor_VectorSwizzle_BadIndex) {
+  Global("my_vec", ty.vec2<f32>(), ast::StorageClass::kInput);
+
+  auto* ident = create<ast::IdentifierExpression>(Source{{3, 3}},
+                                                  Symbols().Register("z"));
+  auto* mem = MemberAccessor("my_vec", ident);
+  WrapInFunction(mem);
+
+  EXPECT_FALSE(r()->Resolve());
+  EXPECT_EQ(r()->error(), "3:3 error: invalid vector swizzle member");
+}
+
 TEST_F(ResolverValidationTest,
        Stmt_Loop_ContinueInLoopBodyBeforeDecl_UsageInContinuing) {
   // loop  {