blob: ff58ba3c94ada73c225fc072075ed7449c3b7fa8 [file] [log] [blame]
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001// Copyright 2021 The Tint Authors.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#include "src/tint/writer/append_vector.h"
Ben Clayton971318f2023-02-14 13:52:43 +000016#include "src/tint/ast/test_helper.h"
Ryan Harrisondbc13af2022-02-21 15:19:07 +000017#include "src/tint/program_builder.h"
18#include "src/tint/resolver/resolver.h"
Ben Clayton54a104e2023-02-22 20:04:40 +000019#include "src/tint/sem/value_constructor.h"
Ryan Harrisondbc13af2022-02-21 15:19:07 +000020
dan sinclair86216f52023-03-22 16:47:44 +000021#include "gmock/gmock.h"
Ryan Harrisondbc13af2022-02-21 15:19:07 +000022
Ben Clayton0ce9ab02022-05-05 20:23:40 +000023using namespace tint::number_suffixes; // NOLINT
24
dan sinclair67e79fe2022-04-07 14:43:05 +000025namespace tint::writer {
Ryan Harrisondbc13af2022-02-21 15:19:07 +000026namespace {
27
28class AppendVectorTest : public ::testing::Test, public ProgramBuilder {};
29
30// AppendVector(vec2<i32>(1, 2), 3) -> vec3<i32>(1, 2, 3)
31TEST_F(AppendVectorTest, Vec2i32_i32) {
Ben Clayton0ce9ab02022-05-05 20:23:40 +000032 auto* scalar_1 = Expr(1_i);
33 auto* scalar_2 = Expr(2_i);
34 auto* scalar_3 = Expr(3_i);
dan sinclair41e4d9a2022-05-01 14:40:55 +000035 auto* vec_12 = vec2<i32>(scalar_1, scalar_2);
36 WrapInFunction(vec_12, scalar_3);
Ryan Harrisondbc13af2022-02-21 15:19:07 +000037
dan sinclair41e4d9a2022-05-01 14:40:55 +000038 resolver::Resolver resolver(this);
dan sinclair86216f52023-03-22 16:47:44 +000039 EXPECT_TRUE(resolver.Resolve());
40 ASSERT_THAT(resolver.Diagnostics(), testing::IsEmpty());
Ryan Harrisondbc13af2022-02-21 15:19:07 +000041
dan sinclair41e4d9a2022-05-01 14:40:55 +000042 auto* append = AppendVector(this, vec_12, scalar_3);
Ryan Harrisondbc13af2022-02-21 15:19:07 +000043
dan sinclair41e4d9a2022-05-01 14:40:55 +000044 auto* vec_123 = As<ast::CallExpression>(append->Declaration());
45 ASSERT_NE(vec_123, nullptr);
Ben Clayton783b1692022-08-02 17:03:35 +000046 ASSERT_EQ(vec_123->args.Length(), 3u);
dan sinclair41e4d9a2022-05-01 14:40:55 +000047 EXPECT_EQ(vec_123->args[0], scalar_1);
48 EXPECT_EQ(vec_123->args[1], scalar_2);
49 EXPECT_EQ(vec_123->args[2], scalar_3);
Ryan Harrisondbc13af2022-02-21 15:19:07 +000050
Ben Claytone5a67ac2022-05-19 21:50:59 +000051 auto* call = Sem().Get<sem::Call>(vec_123);
dan sinclair41e4d9a2022-05-01 14:40:55 +000052 ASSERT_NE(call, nullptr);
Ben Clayton958a4642022-07-26 07:55:24 +000053 ASSERT_EQ(call->Arguments().Length(), 3u);
dan sinclair41e4d9a2022-05-01 14:40:55 +000054 EXPECT_EQ(call->Arguments()[0], Sem().Get(scalar_1));
55 EXPECT_EQ(call->Arguments()[1], Sem().Get(scalar_2));
56 EXPECT_EQ(call->Arguments()[2], Sem().Get(scalar_3));
Ryan Harrisondbc13af2022-02-21 15:19:07 +000057
Ben Clayton54a104e2023-02-22 20:04:40 +000058 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +000059 ASSERT_NE(ctor, nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +000060 ASSERT_TRUE(ctor->ReturnType()->Is<type::Vector>());
61 EXPECT_EQ(ctor->ReturnType()->As<type::Vector>()->Width(), 3u);
62 EXPECT_TRUE(ctor->ReturnType()->As<type::Vector>()->type()->Is<type::I32>());
dan sinclair41e4d9a2022-05-01 14:40:55 +000063 EXPECT_EQ(ctor->ReturnType(), call->Type());
Ryan Harrisondbc13af2022-02-21 15:19:07 +000064
Ben Clayton958a4642022-07-26 07:55:24 +000065 ASSERT_EQ(ctor->Parameters().Length(), 3u);
dan sinclaird37ecf92022-12-08 16:39:59 +000066 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::I32>());
67 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>());
68 EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::I32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +000069}
70
71// AppendVector(vec2<i32>(1, 2), 3u) -> vec3<i32>(1, 2, i32(3u))
72TEST_F(AppendVectorTest, Vec2i32_u32) {
Ben Clayton0ce9ab02022-05-05 20:23:40 +000073 auto* scalar_1 = Expr(1_i);
74 auto* scalar_2 = Expr(2_i);
75 auto* scalar_3 = Expr(3_u);
dan sinclair41e4d9a2022-05-01 14:40:55 +000076 auto* vec_12 = vec2<i32>(scalar_1, scalar_2);
77 WrapInFunction(vec_12, scalar_3);
Ryan Harrisondbc13af2022-02-21 15:19:07 +000078
dan sinclair41e4d9a2022-05-01 14:40:55 +000079 resolver::Resolver resolver(this);
dan sinclair86216f52023-03-22 16:47:44 +000080 EXPECT_TRUE(resolver.Resolve());
81 ASSERT_THAT(resolver.Diagnostics(), testing::IsEmpty());
Ryan Harrisondbc13af2022-02-21 15:19:07 +000082
dan sinclair41e4d9a2022-05-01 14:40:55 +000083 auto* append = AppendVector(this, vec_12, scalar_3);
Ryan Harrisondbc13af2022-02-21 15:19:07 +000084
dan sinclair41e4d9a2022-05-01 14:40:55 +000085 auto* vec_123 = As<ast::CallExpression>(append->Declaration());
86 ASSERT_NE(vec_123, nullptr);
Ben Clayton783b1692022-08-02 17:03:35 +000087 ASSERT_EQ(vec_123->args.Length(), 3u);
dan sinclair41e4d9a2022-05-01 14:40:55 +000088 EXPECT_EQ(vec_123->args[0], scalar_1);
89 EXPECT_EQ(vec_123->args[1], scalar_2);
90 auto* u32_to_i32 = vec_123->args[2]->As<ast::CallExpression>();
91 ASSERT_NE(u32_to_i32, nullptr);
dan sinclaird026e132023-04-18 19:38:25 +000092 ast::CheckIdentifier(u32_to_i32->target, "i32");
Ben Clayton6e0a5152023-02-09 23:33:24 +000093
Ben Clayton783b1692022-08-02 17:03:35 +000094 ASSERT_EQ(u32_to_i32->args.Length(), 1u);
dan sinclair41e4d9a2022-05-01 14:40:55 +000095 EXPECT_EQ(u32_to_i32->args[0], scalar_3);
Ryan Harrisondbc13af2022-02-21 15:19:07 +000096
Ben Claytone5a67ac2022-05-19 21:50:59 +000097 auto* call = Sem().Get<sem::Call>(vec_123);
dan sinclair41e4d9a2022-05-01 14:40:55 +000098 ASSERT_NE(call, nullptr);
Ben Clayton958a4642022-07-26 07:55:24 +000099 ASSERT_EQ(call->Arguments().Length(), 3u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000100 EXPECT_EQ(call->Arguments()[0], Sem().Get(scalar_1));
101 EXPECT_EQ(call->Arguments()[1], Sem().Get(scalar_2));
102 EXPECT_EQ(call->Arguments()[2], Sem().Get(u32_to_i32));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000103
Ben Clayton54a104e2023-02-22 20:04:40 +0000104 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000105 ASSERT_NE(ctor, nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +0000106 ASSERT_TRUE(ctor->ReturnType()->Is<type::Vector>());
107 EXPECT_EQ(ctor->ReturnType()->As<type::Vector>()->Width(), 3u);
108 EXPECT_TRUE(ctor->ReturnType()->As<type::Vector>()->type()->Is<type::I32>());
dan sinclair41e4d9a2022-05-01 14:40:55 +0000109 EXPECT_EQ(ctor->ReturnType(), call->Type());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000110
Ben Clayton958a4642022-07-26 07:55:24 +0000111 ASSERT_EQ(ctor->Parameters().Length(), 3u);
dan sinclaird37ecf92022-12-08 16:39:59 +0000112 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::I32>());
113 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>());
114 EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::I32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000115}
116
117// AppendVector(vec2<i32>(vec2<u32>(1u, 2u)), 3u) ->
118// vec3<i32>(vec2<i32>(vec2<u32>(1u, 2u)), i32(3u))
119TEST_F(AppendVectorTest, Vec2i32FromVec2u32_u32) {
Ben Clayton0ce9ab02022-05-05 20:23:40 +0000120 auto* scalar_1 = Expr(1_u);
121 auto* scalar_2 = Expr(2_u);
122 auto* scalar_3 = Expr(3_u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000123 auto* uvec_12 = vec2<u32>(scalar_1, scalar_2);
124 auto* vec_12 = vec2<i32>(uvec_12);
125 WrapInFunction(vec_12, scalar_3);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000126
dan sinclair41e4d9a2022-05-01 14:40:55 +0000127 resolver::Resolver resolver(this);
dan sinclair86216f52023-03-22 16:47:44 +0000128 EXPECT_TRUE(resolver.Resolve());
129 ASSERT_THAT(resolver.Diagnostics(), testing::IsEmpty());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000130
dan sinclair41e4d9a2022-05-01 14:40:55 +0000131 auto* append = AppendVector(this, vec_12, scalar_3);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000132
dan sinclair41e4d9a2022-05-01 14:40:55 +0000133 auto* vec_123 = As<ast::CallExpression>(append->Declaration());
134 ASSERT_NE(vec_123, nullptr);
Ben Clayton783b1692022-08-02 17:03:35 +0000135 ASSERT_EQ(vec_123->args.Length(), 2u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000136 auto* v2u32_to_v2i32 = vec_123->args[0]->As<ast::CallExpression>();
137 ASSERT_NE(v2u32_to_v2i32, nullptr);
Ben Clayton971318f2023-02-14 13:52:43 +0000138
dan sinclaird026e132023-04-18 19:38:25 +0000139 ast::CheckIdentifier(v2u32_to_v2i32->target, ast::Template("vec2", "i32"));
Ben Clayton783b1692022-08-02 17:03:35 +0000140 EXPECT_EQ(v2u32_to_v2i32->args.Length(), 1u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000141 EXPECT_EQ(v2u32_to_v2i32->args[0], uvec_12);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000142
dan sinclair41e4d9a2022-05-01 14:40:55 +0000143 auto* u32_to_i32 = vec_123->args[1]->As<ast::CallExpression>();
144 ASSERT_NE(u32_to_i32, nullptr);
dan sinclaird026e132023-04-18 19:38:25 +0000145 ast::CheckIdentifier(u32_to_i32->target, "i32");
Ben Clayton783b1692022-08-02 17:03:35 +0000146 ASSERT_EQ(u32_to_i32->args.Length(), 1u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000147 EXPECT_EQ(u32_to_i32->args[0], scalar_3);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000148
Ben Claytone5a67ac2022-05-19 21:50:59 +0000149 auto* call = Sem().Get<sem::Call>(vec_123);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000150 ASSERT_NE(call, nullptr);
Ben Clayton958a4642022-07-26 07:55:24 +0000151 ASSERT_EQ(call->Arguments().Length(), 2u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000152 EXPECT_EQ(call->Arguments()[0], Sem().Get(vec_12));
153 EXPECT_EQ(call->Arguments()[1], Sem().Get(u32_to_i32));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000154
Ben Clayton54a104e2023-02-22 20:04:40 +0000155 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000156 ASSERT_NE(ctor, nullptr);
Ben Clayton971318f2023-02-14 13:52:43 +0000157
dan sinclair0e780da2022-12-08 22:21:24 +0000158 ASSERT_TRUE(ctor->ReturnType()->Is<type::Vector>());
159 EXPECT_EQ(ctor->ReturnType()->As<type::Vector>()->Width(), 3u);
160 EXPECT_TRUE(ctor->ReturnType()->As<type::Vector>()->type()->Is<type::I32>());
dan sinclair41e4d9a2022-05-01 14:40:55 +0000161 EXPECT_EQ(ctor->ReturnType(), call->Type());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000162
Ben Clayton958a4642022-07-26 07:55:24 +0000163 ASSERT_EQ(ctor->Parameters().Length(), 2u);
dan sinclair0e780da2022-12-08 22:21:24 +0000164 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::Vector>());
dan sinclaird37ecf92022-12-08 16:39:59 +0000165 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000166}
167
168// AppendVector(vec2<i32>(1, 2), 3.0f) -> vec3<i32>(1, 2, i32(3.0f))
169TEST_F(AppendVectorTest, Vec2i32_f32) {
Ben Clayton0ce9ab02022-05-05 20:23:40 +0000170 auto* scalar_1 = Expr(1_i);
171 auto* scalar_2 = Expr(2_i);
Ben Clayton0a3cda92022-05-10 17:30:15 +0000172 auto* scalar_3 = Expr(3_f);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000173 auto* vec_12 = vec2<i32>(scalar_1, scalar_2);
174 WrapInFunction(vec_12, scalar_3);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000175
dan sinclair41e4d9a2022-05-01 14:40:55 +0000176 resolver::Resolver resolver(this);
dan sinclair86216f52023-03-22 16:47:44 +0000177 EXPECT_TRUE(resolver.Resolve());
178 ASSERT_THAT(resolver.Diagnostics(), testing::IsEmpty());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000179
dan sinclair41e4d9a2022-05-01 14:40:55 +0000180 auto* append = AppendVector(this, vec_12, scalar_3);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000181
dan sinclair41e4d9a2022-05-01 14:40:55 +0000182 auto* vec_123 = As<ast::CallExpression>(append->Declaration());
183 ASSERT_NE(vec_123, nullptr);
Ben Clayton783b1692022-08-02 17:03:35 +0000184 ASSERT_EQ(vec_123->args.Length(), 3u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000185 EXPECT_EQ(vec_123->args[0], scalar_1);
186 EXPECT_EQ(vec_123->args[1], scalar_2);
187 auto* f32_to_i32 = vec_123->args[2]->As<ast::CallExpression>();
188 ASSERT_NE(f32_to_i32, nullptr);
dan sinclaird026e132023-04-18 19:38:25 +0000189 ast::CheckIdentifier(f32_to_i32->target, "i32");
Ben Clayton783b1692022-08-02 17:03:35 +0000190 ASSERT_EQ(f32_to_i32->args.Length(), 1u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000191 EXPECT_EQ(f32_to_i32->args[0], scalar_3);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000192
Ben Claytone5a67ac2022-05-19 21:50:59 +0000193 auto* call = Sem().Get<sem::Call>(vec_123);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000194 ASSERT_NE(call, nullptr);
Ben Clayton958a4642022-07-26 07:55:24 +0000195 ASSERT_EQ(call->Arguments().Length(), 3u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000196 EXPECT_EQ(call->Arguments()[0], Sem().Get(scalar_1));
197 EXPECT_EQ(call->Arguments()[1], Sem().Get(scalar_2));
198 EXPECT_EQ(call->Arguments()[2], Sem().Get(f32_to_i32));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000199
Ben Clayton54a104e2023-02-22 20:04:40 +0000200 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000201 ASSERT_NE(ctor, nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +0000202 ASSERT_TRUE(ctor->ReturnType()->Is<type::Vector>());
203 EXPECT_EQ(ctor->ReturnType()->As<type::Vector>()->Width(), 3u);
204 EXPECT_TRUE(ctor->ReturnType()->As<type::Vector>()->type()->Is<type::I32>());
dan sinclair41e4d9a2022-05-01 14:40:55 +0000205 EXPECT_EQ(ctor->ReturnType(), call->Type());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000206
Ben Clayton958a4642022-07-26 07:55:24 +0000207 ASSERT_EQ(ctor->Parameters().Length(), 3u);
dan sinclaird37ecf92022-12-08 16:39:59 +0000208 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::I32>());
209 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>());
210 EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::I32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000211}
212
213// AppendVector(vec3<i32>(1, 2, 3), 4) -> vec4<i32>(1, 2, 3, 4)
214TEST_F(AppendVectorTest, Vec3i32_i32) {
Ben Clayton0ce9ab02022-05-05 20:23:40 +0000215 auto* scalar_1 = Expr(1_i);
216 auto* scalar_2 = Expr(2_i);
217 auto* scalar_3 = Expr(3_i);
218 auto* scalar_4 = Expr(4_i);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000219 auto* vec_123 = vec3<i32>(scalar_1, scalar_2, scalar_3);
220 WrapInFunction(vec_123, scalar_4);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000221
dan sinclair41e4d9a2022-05-01 14:40:55 +0000222 resolver::Resolver resolver(this);
dan sinclair86216f52023-03-22 16:47:44 +0000223 EXPECT_TRUE(resolver.Resolve());
224 ASSERT_THAT(resolver.Diagnostics(), testing::IsEmpty());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000225
dan sinclair41e4d9a2022-05-01 14:40:55 +0000226 auto* append = AppendVector(this, vec_123, scalar_4);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000227
dan sinclair41e4d9a2022-05-01 14:40:55 +0000228 auto* vec_1234 = As<ast::CallExpression>(append->Declaration());
229 ASSERT_NE(vec_1234, nullptr);
Ben Clayton783b1692022-08-02 17:03:35 +0000230 ASSERT_EQ(vec_1234->args.Length(), 4u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000231 EXPECT_EQ(vec_1234->args[0], scalar_1);
232 EXPECT_EQ(vec_1234->args[1], scalar_2);
233 EXPECT_EQ(vec_1234->args[2], scalar_3);
234 EXPECT_EQ(vec_1234->args[3], scalar_4);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000235
Ben Claytone5a67ac2022-05-19 21:50:59 +0000236 auto* call = Sem().Get<sem::Call>(vec_1234);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000237 ASSERT_NE(call, nullptr);
Ben Clayton958a4642022-07-26 07:55:24 +0000238 ASSERT_EQ(call->Arguments().Length(), 4u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000239 EXPECT_EQ(call->Arguments()[0], Sem().Get(scalar_1));
240 EXPECT_EQ(call->Arguments()[1], Sem().Get(scalar_2));
241 EXPECT_EQ(call->Arguments()[2], Sem().Get(scalar_3));
242 EXPECT_EQ(call->Arguments()[3], Sem().Get(scalar_4));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000243
Ben Clayton54a104e2023-02-22 20:04:40 +0000244 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000245 ASSERT_NE(ctor, nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +0000246 ASSERT_TRUE(ctor->ReturnType()->Is<type::Vector>());
247 EXPECT_EQ(ctor->ReturnType()->As<type::Vector>()->Width(), 4u);
248 EXPECT_TRUE(ctor->ReturnType()->As<type::Vector>()->type()->Is<type::I32>());
dan sinclair41e4d9a2022-05-01 14:40:55 +0000249 EXPECT_EQ(ctor->ReturnType(), call->Type());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000250
Ben Clayton958a4642022-07-26 07:55:24 +0000251 ASSERT_EQ(ctor->Parameters().Length(), 4u);
dan sinclaird37ecf92022-12-08 16:39:59 +0000252 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::I32>());
253 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>());
254 EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::I32>());
255 EXPECT_TRUE(ctor->Parameters()[3]->Type()->Is<type::I32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000256}
257
258// AppendVector(vec_12, 3) -> vec3<i32>(vec_12, 3)
259TEST_F(AppendVectorTest, Vec2i32Var_i32) {
dan sinclair2a651632023-02-19 04:03:55 +0000260 GlobalVar("vec_12", ty.vec2<i32>(), builtin::AddressSpace::kPrivate);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000261 auto* vec_12 = Expr("vec_12");
Ben Clayton0ce9ab02022-05-05 20:23:40 +0000262 auto* scalar_3 = Expr(3_i);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000263 WrapInFunction(vec_12, scalar_3);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000264
dan sinclair41e4d9a2022-05-01 14:40:55 +0000265 resolver::Resolver resolver(this);
dan sinclair86216f52023-03-22 16:47:44 +0000266 EXPECT_TRUE(resolver.Resolve());
267 ASSERT_THAT(resolver.Diagnostics(), testing::IsEmpty());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000268
dan sinclair41e4d9a2022-05-01 14:40:55 +0000269 auto* append = AppendVector(this, vec_12, scalar_3);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000270
dan sinclair41e4d9a2022-05-01 14:40:55 +0000271 auto* vec_123 = As<ast::CallExpression>(append->Declaration());
272 ASSERT_NE(vec_123, nullptr);
Ben Clayton783b1692022-08-02 17:03:35 +0000273 ASSERT_EQ(vec_123->args.Length(), 2u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000274 EXPECT_EQ(vec_123->args[0], vec_12);
275 EXPECT_EQ(vec_123->args[1], scalar_3);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000276
Ben Claytone5a67ac2022-05-19 21:50:59 +0000277 auto* call = Sem().Get<sem::Call>(vec_123);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000278 ASSERT_NE(call, nullptr);
Ben Clayton958a4642022-07-26 07:55:24 +0000279 ASSERT_EQ(call->Arguments().Length(), 2u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000280 EXPECT_EQ(call->Arguments()[0], Sem().Get(vec_12));
281 EXPECT_EQ(call->Arguments()[1], Sem().Get(scalar_3));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000282
Ben Clayton54a104e2023-02-22 20:04:40 +0000283 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000284 ASSERT_NE(ctor, nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +0000285 ASSERT_TRUE(ctor->ReturnType()->Is<type::Vector>());
286 EXPECT_EQ(ctor->ReturnType()->As<type::Vector>()->Width(), 3u);
287 EXPECT_TRUE(ctor->ReturnType()->As<type::Vector>()->type()->Is<type::I32>());
dan sinclair41e4d9a2022-05-01 14:40:55 +0000288 EXPECT_EQ(ctor->ReturnType(), call->Type());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000289
Ben Clayton958a4642022-07-26 07:55:24 +0000290 ASSERT_EQ(ctor->Parameters().Length(), 2u);
dan sinclair0e780da2022-12-08 22:21:24 +0000291 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::Vector>());
dan sinclaird37ecf92022-12-08 16:39:59 +0000292 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000293}
294
295// AppendVector(1, 2, scalar_3) -> vec3<i32>(1, 2, scalar_3)
296TEST_F(AppendVectorTest, Vec2i32_i32Var) {
dan sinclair2a651632023-02-19 04:03:55 +0000297 GlobalVar("scalar_3", ty.i32(), builtin::AddressSpace::kPrivate);
Ben Clayton0ce9ab02022-05-05 20:23:40 +0000298 auto* scalar_1 = Expr(1_i);
299 auto* scalar_2 = Expr(2_i);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000300 auto* scalar_3 = Expr("scalar_3");
301 auto* vec_12 = vec2<i32>(scalar_1, scalar_2);
302 WrapInFunction(vec_12, scalar_3);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000303
dan sinclair41e4d9a2022-05-01 14:40:55 +0000304 resolver::Resolver resolver(this);
dan sinclair86216f52023-03-22 16:47:44 +0000305 EXPECT_TRUE(resolver.Resolve());
306 ASSERT_THAT(resolver.Diagnostics(), testing::IsEmpty());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000307
dan sinclair41e4d9a2022-05-01 14:40:55 +0000308 auto* append = AppendVector(this, vec_12, scalar_3);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000309
dan sinclair41e4d9a2022-05-01 14:40:55 +0000310 auto* vec_123 = As<ast::CallExpression>(append->Declaration());
311 ASSERT_NE(vec_123, nullptr);
Ben Clayton783b1692022-08-02 17:03:35 +0000312 ASSERT_EQ(vec_123->args.Length(), 3u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000313 EXPECT_EQ(vec_123->args[0], scalar_1);
314 EXPECT_EQ(vec_123->args[1], scalar_2);
315 EXPECT_EQ(vec_123->args[2], scalar_3);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000316
Ben Claytone5a67ac2022-05-19 21:50:59 +0000317 auto* call = Sem().Get<sem::Call>(vec_123);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000318 ASSERT_NE(call, nullptr);
Ben Clayton958a4642022-07-26 07:55:24 +0000319 ASSERT_EQ(call->Arguments().Length(), 3u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000320 EXPECT_EQ(call->Arguments()[0], Sem().Get(scalar_1));
321 EXPECT_EQ(call->Arguments()[1], Sem().Get(scalar_2));
322 EXPECT_EQ(call->Arguments()[2], Sem().Get(scalar_3));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000323
Ben Clayton54a104e2023-02-22 20:04:40 +0000324 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000325 ASSERT_NE(ctor, nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +0000326 ASSERT_TRUE(ctor->ReturnType()->Is<type::Vector>());
327 EXPECT_EQ(ctor->ReturnType()->As<type::Vector>()->Width(), 3u);
328 EXPECT_TRUE(ctor->ReturnType()->As<type::Vector>()->type()->Is<type::I32>());
dan sinclair41e4d9a2022-05-01 14:40:55 +0000329 EXPECT_EQ(ctor->ReturnType(), call->Type());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000330
Ben Clayton958a4642022-07-26 07:55:24 +0000331 ASSERT_EQ(ctor->Parameters().Length(), 3u);
dan sinclaird37ecf92022-12-08 16:39:59 +0000332 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::I32>());
333 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>());
334 EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::I32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000335}
336
337// AppendVector(vec_12, scalar_3) -> vec3<i32>(vec_12, scalar_3)
338TEST_F(AppendVectorTest, Vec2i32Var_i32Var) {
dan sinclair2a651632023-02-19 04:03:55 +0000339 GlobalVar("vec_12", ty.vec2<i32>(), builtin::AddressSpace::kPrivate);
340 GlobalVar("scalar_3", ty.i32(), builtin::AddressSpace::kPrivate);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000341 auto* vec_12 = Expr("vec_12");
342 auto* scalar_3 = Expr("scalar_3");
343 WrapInFunction(vec_12, scalar_3);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000344
dan sinclair41e4d9a2022-05-01 14:40:55 +0000345 resolver::Resolver resolver(this);
dan sinclair86216f52023-03-22 16:47:44 +0000346 EXPECT_TRUE(resolver.Resolve());
347 ASSERT_THAT(resolver.Diagnostics(), testing::IsEmpty());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000348
dan sinclair41e4d9a2022-05-01 14:40:55 +0000349 auto* append = AppendVector(this, vec_12, scalar_3);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000350
dan sinclair41e4d9a2022-05-01 14:40:55 +0000351 auto* vec_123 = As<ast::CallExpression>(append->Declaration());
352 ASSERT_NE(vec_123, nullptr);
Ben Clayton783b1692022-08-02 17:03:35 +0000353 ASSERT_EQ(vec_123->args.Length(), 2u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000354 EXPECT_EQ(vec_123->args[0], vec_12);
355 EXPECT_EQ(vec_123->args[1], scalar_3);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000356
Ben Claytone5a67ac2022-05-19 21:50:59 +0000357 auto* call = Sem().Get<sem::Call>(vec_123);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000358 ASSERT_NE(call, nullptr);
Ben Clayton958a4642022-07-26 07:55:24 +0000359 ASSERT_EQ(call->Arguments().Length(), 2u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000360 EXPECT_EQ(call->Arguments()[0], Sem().Get(vec_12));
361 EXPECT_EQ(call->Arguments()[1], Sem().Get(scalar_3));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000362
Ben Clayton54a104e2023-02-22 20:04:40 +0000363 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000364 ASSERT_NE(ctor, nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +0000365 ASSERT_TRUE(ctor->ReturnType()->Is<type::Vector>());
366 EXPECT_EQ(ctor->ReturnType()->As<type::Vector>()->Width(), 3u);
367 EXPECT_TRUE(ctor->ReturnType()->As<type::Vector>()->type()->Is<type::I32>());
dan sinclair41e4d9a2022-05-01 14:40:55 +0000368 EXPECT_EQ(ctor->ReturnType(), call->Type());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000369
Ben Clayton958a4642022-07-26 07:55:24 +0000370 ASSERT_EQ(ctor->Parameters().Length(), 2u);
dan sinclair0e780da2022-12-08 22:21:24 +0000371 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::Vector>());
dan sinclaird37ecf92022-12-08 16:39:59 +0000372 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000373}
374
375// AppendVector(vec_12, scalar_3) -> vec3<i32>(vec_12, i32(scalar_3))
376TEST_F(AppendVectorTest, Vec2i32Var_f32Var) {
dan sinclair2a651632023-02-19 04:03:55 +0000377 GlobalVar("vec_12", ty.vec2<i32>(), builtin::AddressSpace::kPrivate);
378 GlobalVar("scalar_3", ty.f32(), builtin::AddressSpace::kPrivate);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000379 auto* vec_12 = Expr("vec_12");
380 auto* scalar_3 = Expr("scalar_3");
381 WrapInFunction(vec_12, scalar_3);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000382
dan sinclair41e4d9a2022-05-01 14:40:55 +0000383 resolver::Resolver resolver(this);
dan sinclair86216f52023-03-22 16:47:44 +0000384 EXPECT_TRUE(resolver.Resolve());
385 ASSERT_THAT(resolver.Diagnostics(), testing::IsEmpty());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000386
dan sinclair41e4d9a2022-05-01 14:40:55 +0000387 auto* append = AppendVector(this, vec_12, scalar_3);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000388
dan sinclair41e4d9a2022-05-01 14:40:55 +0000389 auto* vec_123 = As<ast::CallExpression>(append->Declaration());
390 ASSERT_NE(vec_123, nullptr);
Ben Clayton783b1692022-08-02 17:03:35 +0000391 ASSERT_EQ(vec_123->args.Length(), 2u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000392 EXPECT_EQ(vec_123->args[0], vec_12);
393 auto* f32_to_i32 = vec_123->args[1]->As<ast::CallExpression>();
394 ASSERT_NE(f32_to_i32, nullptr);
dan sinclaird026e132023-04-18 19:38:25 +0000395 ast::CheckIdentifier(f32_to_i32->target, "i32");
Ben Clayton783b1692022-08-02 17:03:35 +0000396 ASSERT_EQ(f32_to_i32->args.Length(), 1u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000397 EXPECT_EQ(f32_to_i32->args[0], scalar_3);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000398
Ben Claytone5a67ac2022-05-19 21:50:59 +0000399 auto* call = Sem().Get<sem::Call>(vec_123);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000400 ASSERT_NE(call, nullptr);
Ben Clayton958a4642022-07-26 07:55:24 +0000401 ASSERT_EQ(call->Arguments().Length(), 2u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000402 EXPECT_EQ(call->Arguments()[0], Sem().Get(vec_12));
403 EXPECT_EQ(call->Arguments()[1], Sem().Get(f32_to_i32));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000404
Ben Clayton54a104e2023-02-22 20:04:40 +0000405 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000406 ASSERT_NE(ctor, nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +0000407 ASSERT_TRUE(ctor->ReturnType()->Is<type::Vector>());
408 EXPECT_EQ(ctor->ReturnType()->As<type::Vector>()->Width(), 3u);
409 EXPECT_TRUE(ctor->ReturnType()->As<type::Vector>()->type()->Is<type::I32>());
dan sinclair41e4d9a2022-05-01 14:40:55 +0000410 EXPECT_EQ(ctor->ReturnType(), call->Type());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000411
Ben Clayton958a4642022-07-26 07:55:24 +0000412 ASSERT_EQ(ctor->Parameters().Length(), 2u);
dan sinclair0e780da2022-12-08 22:21:24 +0000413 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::Vector>());
dan sinclaird37ecf92022-12-08 16:39:59 +0000414 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000415}
416
417// AppendVector(vec_12, scalar_3) -> vec3<bool>(vec_12, scalar_3)
418TEST_F(AppendVectorTest, Vec2boolVar_boolVar) {
dan sinclair2a651632023-02-19 04:03:55 +0000419 GlobalVar("vec_12", ty.vec2<bool>(), builtin::AddressSpace::kPrivate);
420 GlobalVar("scalar_3", ty.bool_(), builtin::AddressSpace::kPrivate);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000421 auto* vec_12 = Expr("vec_12");
422 auto* scalar_3 = Expr("scalar_3");
423 WrapInFunction(vec_12, scalar_3);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000424
dan sinclair41e4d9a2022-05-01 14:40:55 +0000425 resolver::Resolver resolver(this);
dan sinclair86216f52023-03-22 16:47:44 +0000426 EXPECT_TRUE(resolver.Resolve());
427 ASSERT_THAT(resolver.Diagnostics(), testing::IsEmpty());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000428
dan sinclair41e4d9a2022-05-01 14:40:55 +0000429 auto* append = AppendVector(this, vec_12, scalar_3);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000430
dan sinclair41e4d9a2022-05-01 14:40:55 +0000431 auto* vec_123 = As<ast::CallExpression>(append->Declaration());
432 ASSERT_NE(vec_123, nullptr);
Ben Clayton783b1692022-08-02 17:03:35 +0000433 ASSERT_EQ(vec_123->args.Length(), 2u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000434 EXPECT_EQ(vec_123->args[0], vec_12);
435 EXPECT_EQ(vec_123->args[1], scalar_3);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000436
Ben Claytone5a67ac2022-05-19 21:50:59 +0000437 auto* call = Sem().Get<sem::Call>(vec_123);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000438 ASSERT_NE(call, nullptr);
Ben Clayton958a4642022-07-26 07:55:24 +0000439 ASSERT_EQ(call->Arguments().Length(), 2u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000440 EXPECT_EQ(call->Arguments()[0], Sem().Get(vec_12));
441 EXPECT_EQ(call->Arguments()[1], Sem().Get(scalar_3));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000442
Ben Clayton54a104e2023-02-22 20:04:40 +0000443 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000444 ASSERT_NE(ctor, nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +0000445 ASSERT_TRUE(ctor->ReturnType()->Is<type::Vector>());
446 EXPECT_EQ(ctor->ReturnType()->As<type::Vector>()->Width(), 3u);
447 EXPECT_TRUE(ctor->ReturnType()->As<type::Vector>()->type()->Is<type::Bool>());
dan sinclair41e4d9a2022-05-01 14:40:55 +0000448 EXPECT_EQ(ctor->ReturnType(), call->Type());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000449
Ben Clayton958a4642022-07-26 07:55:24 +0000450 ASSERT_EQ(ctor->Parameters().Length(), 2u);
dan sinclair0e780da2022-12-08 22:21:24 +0000451 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::Vector>());
dan sinclaird37ecf92022-12-08 16:39:59 +0000452 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::Bool>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000453}
454
455// AppendVector(vec3<i32>(), 4) -> vec3<bool>(0, 0, 0, 4)
456TEST_F(AppendVectorTest, ZeroVec3i32_i32) {
Ben Clayton0ce9ab02022-05-05 20:23:40 +0000457 auto* scalar = Expr(4_i);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000458 auto* vec000 = vec3<i32>();
459 WrapInFunction(vec000, scalar);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000460
dan sinclair41e4d9a2022-05-01 14:40:55 +0000461 resolver::Resolver resolver(this);
dan sinclair86216f52023-03-22 16:47:44 +0000462 EXPECT_TRUE(resolver.Resolve());
463 ASSERT_THAT(resolver.Diagnostics(), testing::IsEmpty());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000464
dan sinclair41e4d9a2022-05-01 14:40:55 +0000465 auto* append = AppendVector(this, vec000, scalar);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000466
dan sinclair41e4d9a2022-05-01 14:40:55 +0000467 auto* vec_0004 = As<ast::CallExpression>(append->Declaration());
468 ASSERT_NE(vec_0004, nullptr);
Ben Clayton783b1692022-08-02 17:03:35 +0000469 ASSERT_EQ(vec_0004->args.Length(), 4u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000470 for (size_t i = 0; i < 3; i++) {
Ben Clayton8822e292022-05-04 22:18:49 +0000471 auto* literal = As<ast::IntLiteralExpression>(vec_0004->args[i]);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000472 ASSERT_NE(literal, nullptr);
473 EXPECT_EQ(literal->value, 0);
474 }
475 EXPECT_EQ(vec_0004->args[3], scalar);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000476
Ben Claytone5a67ac2022-05-19 21:50:59 +0000477 auto* call = Sem().Get<sem::Call>(vec_0004);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000478 ASSERT_NE(call, nullptr);
Ben Clayton958a4642022-07-26 07:55:24 +0000479 ASSERT_EQ(call->Arguments().Length(), 4u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000480 EXPECT_EQ(call->Arguments()[0], Sem().Get(vec_0004->args[0]));
481 EXPECT_EQ(call->Arguments()[1], Sem().Get(vec_0004->args[1]));
482 EXPECT_EQ(call->Arguments()[2], Sem().Get(vec_0004->args[2]));
483 EXPECT_EQ(call->Arguments()[3], Sem().Get(scalar));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000484
Ben Clayton54a104e2023-02-22 20:04:40 +0000485 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000486 ASSERT_NE(ctor, nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +0000487 ASSERT_TRUE(ctor->ReturnType()->Is<type::Vector>());
488 EXPECT_EQ(ctor->ReturnType()->As<type::Vector>()->Width(), 4u);
489 EXPECT_TRUE(ctor->ReturnType()->As<type::Vector>()->type()->Is<type::I32>());
dan sinclair41e4d9a2022-05-01 14:40:55 +0000490 EXPECT_EQ(ctor->ReturnType(), call->Type());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000491
Ben Clayton958a4642022-07-26 07:55:24 +0000492 ASSERT_EQ(ctor->Parameters().Length(), 4u);
dan sinclaird37ecf92022-12-08 16:39:59 +0000493 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::I32>());
494 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>());
495 EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::I32>());
496 EXPECT_TRUE(ctor->Parameters()[3]->Type()->Is<type::I32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000497}
498
499} // namespace
dan sinclair67e79fe2022-04-07 14:43:05 +0000500} // namespace tint::writer