type determine accessor on aliased array

Change-Id: I8084bf6c30649acb2d6d7639fa6bf78cdd0a4a6a
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/23581
Reviewed-by: dan sinclair <dsinclair@google.com>
diff --git a/src/type_determiner.cc b/src/type_determiner.cc
index d118b19..23de278 100644
--- a/src/type_determiner.cc
+++ b/src/type_determiner.cc
@@ -369,7 +369,7 @@
   }
 
   auto* res = expr->array()->result_type();
-  auto* parent_type = res->UnwrapPtrIfNeeded();
+  auto* parent_type = res->UnwrapAliasPtrAlias();
   ast::type::Type* ret = nullptr;
   if (parent_type->IsArray()) {
     ret = parent_type->AsArray()->type();
diff --git a/src/type_determiner_test.cc b/src/type_determiner_test.cc
index 3ba3e53..15fd077 100644
--- a/src/type_determiner_test.cc
+++ b/src/type_determiner_test.cc
@@ -400,6 +400,31 @@
   EXPECT_TRUE(ptr->type()->IsF32());
 }
 
+TEST_F(TypeDeterminerTest, Expr_ArrayAccessor_Alias_Array) {
+  ast::type::I32Type i32;
+  ast::type::F32Type f32;
+  ast::type::ArrayType ary(&f32, 3);
+  ast::type::AliasType aary("myarrty", &ary);
+
+  auto idx = std::make_unique<ast::ScalarConstructorExpression>(
+      std::make_unique<ast::SintLiteral>(&i32, 2));
+  auto var = std::make_unique<ast::Variable>(
+      "my_var", ast::StorageClass::kFunction, &aary);
+  mod()->AddGlobalVariable(std::move(var));
+
+  // Register the global
+  EXPECT_TRUE(td()->Determine());
+
+  ast::ArrayAccessorExpression acc(
+      std::make_unique<ast::IdentifierExpression>("my_var"), std::move(idx));
+  EXPECT_TRUE(td()->DetermineResultType(&acc));
+  ASSERT_NE(acc.result_type(), nullptr);
+  ASSERT_TRUE(acc.result_type()->IsPointer());
+
+  auto* ptr = acc.result_type()->AsPointer();
+  EXPECT_TRUE(ptr->type()->IsF32());
+}
+
 TEST_F(TypeDeterminerTest, Expr_ArrayAccessor_Array_Constant) {
   ast::type::I32Type i32;
   ast::type::F32Type f32;