blob: dae4b5cb6338f73f1bd672a2946e889bc27a5618 [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 "gmock/gmock.h"
dan sinclair352f8c82023-07-21 00:40:07 +000016#include "src/tint/lang/core/type/reference.h"
dan sinclaird3b13692023-07-20 01:14:15 +000017#include "src/tint/lang/wgsl/sem/value_constructor.h"
18#include "src/tint/lang/wgsl/sem/value_conversion.h"
Ryan Harrisondbc13af2022-02-21 15:19:07 +000019#include "src/tint/resolver/resolver_test_helper.h"
dan sinclair22b4dd22023-07-21 00:40:07 +000020#include "src/tint/utils/text/string_stream.h"
Ryan Harrisondbc13af2022-02-21 15:19:07 +000021
dan sinclaird2093792022-04-07 17:45:45 +000022namespace tint::resolver {
Ryan Harrisondbc13af2022-02-21 15:19:07 +000023namespace {
24
Ben Clayton66805b02023-06-14 22:00:01 +000025using namespace tint::builtin::fluent_types; // NOLINT
26using namespace tint::number_suffixes; // NOLINT
27
Ryan Harrisondbc13af2022-02-21 15:19:07 +000028using ::testing::HasSubstr;
29
30// Helpers and typedefs
31using builder::alias;
32using builder::alias1;
33using builder::alias2;
34using builder::alias3;
35using builder::CreatePtrs;
36using builder::CreatePtrsFor;
37using builder::DataType;
Ryan Harrisondbc13af2022-02-21 15:19:07 +000038
Ben Clayton54a104e2023-02-22 20:04:40 +000039class ResolverValueConstructorValidationTest : public resolver::TestHelper, public testing::Test {};
Ryan Harrisondbc13af2022-02-21 15:19:07 +000040
41namespace InferTypeTest {
42struct Params {
dan sinclair41e4d9a2022-05-01 14:40:55 +000043 builder::ast_type_func_ptr create_rhs_ast_type;
Antonio Maioranob6d524382022-08-31 22:59:08 +000044 builder::ast_expr_from_double_func_ptr create_rhs_ast_value;
dan sinclair41e4d9a2022-05-01 14:40:55 +000045 builder::sem_type_func_ptr create_rhs_sem_type;
Ryan Harrisondbc13af2022-02-21 15:19:07 +000046};
47
48template <typename T>
49constexpr Params ParamsFor() {
Antonio Maioranob6d524382022-08-31 22:59:08 +000050 return Params{DataType<T>::AST, DataType<T>::ExprFromDouble, DataType<T>::Sem};
Ryan Harrisondbc13af2022-02-21 15:19:07 +000051}
52
Ben Clayton54a104e2023-02-22 20:04:40 +000053TEST_F(ResolverValueConstructorValidationTest, InferTypeTest_Simple) {
Ben Clayton6ae608c2022-05-16 20:54:42 +000054 // var a = 1i;
dan sinclair41e4d9a2022-05-01 14:40:55 +000055 // var b = a;
Ben Clayton58794ae2022-08-19 17:28:53 +000056 auto* a = Var("a", Expr(1_i));
57 auto* b = Var("b", Expr("a"));
dan sinclair41e4d9a2022-05-01 14:40:55 +000058 auto* a_ident = Expr("a");
59 auto* b_ident = Expr("b");
Ryan Harrisondbc13af2022-02-21 15:19:07 +000060
dan sinclair41e4d9a2022-05-01 14:40:55 +000061 WrapInFunction(a, b, Assign(a_ident, "a"), Assign(b_ident, "b"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +000062
dan sinclair41e4d9a2022-05-01 14:40:55 +000063 ASSERT_TRUE(r()->Resolve()) << r()->error();
dan sinclair4d56b482022-12-08 17:50:50 +000064 ASSERT_TRUE(TypeOf(a_ident)->Is<type::Reference>());
65 EXPECT_TRUE(TypeOf(a_ident)->As<type::Reference>()->StoreType()->Is<type::I32>());
dan sinclair18b21582023-01-21 19:56:49 +000066 EXPECT_EQ(TypeOf(a_ident)->As<type::Reference>()->AddressSpace(),
dan sinclair2a651632023-02-19 04:03:55 +000067 builtin::AddressSpace::kFunction);
dan sinclair4d56b482022-12-08 17:50:50 +000068 ASSERT_TRUE(TypeOf(b_ident)->Is<type::Reference>());
69 EXPECT_TRUE(TypeOf(b_ident)->As<type::Reference>()->StoreType()->Is<type::I32>());
dan sinclair18b21582023-01-21 19:56:49 +000070 EXPECT_EQ(TypeOf(b_ident)->As<type::Reference>()->AddressSpace(),
dan sinclair2a651632023-02-19 04:03:55 +000071 builtin::AddressSpace::kFunction);
Ryan Harrisondbc13af2022-02-21 15:19:07 +000072}
73
Ben Clayton54a104e2023-02-22 20:04:40 +000074using InferTypeTest_FromConstructorExpression = ResolverTestWithParam<Params>;
75TEST_P(InferTypeTest_FromConstructorExpression, All) {
dan sinclair41e4d9a2022-05-01 14:40:55 +000076 // e.g. for vec3<f32>
77 // {
78 // var a = vec3<f32>(0.0, 0.0, 0.0)
79 // }
80 auto& params = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +000081
dan sinclaire4039c72023-02-17 21:58:59 +000082 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +000083
dan sinclair6e77b472022-10-20 13:38:28 +000084 auto* initializer_expr = params.create_rhs_ast_value(*this, 0);
Ryan Harrisondbc13af2022-02-21 15:19:07 +000085
dan sinclair6e77b472022-10-20 13:38:28 +000086 auto* a = Var("a", initializer_expr);
dan sinclair41e4d9a2022-05-01 14:40:55 +000087 // Self-assign 'a' to force the expression to be resolved so we can test its
88 // type below
89 auto* a_ident = Expr("a");
90 WrapInFunction(Decl(a), Assign(a_ident, "a"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +000091
dan sinclair41e4d9a2022-05-01 14:40:55 +000092 ASSERT_TRUE(r()->Resolve()) << r()->error();
93 auto* got = TypeOf(a_ident);
dan sinclairb6cc4cb2023-02-19 04:01:29 +000094 auto* expected =
Ben Clayton1a8a19d2023-06-13 17:01:16 +000095 create<type::Reference>(builtin::AddressSpace::kFunction, params.create_rhs_sem_type(*this),
dan sinclairb6cc4cb2023-02-19 04:01:29 +000096 builtin::Access::kReadWrite);
dan sinclair41e4d9a2022-05-01 14:40:55 +000097 ASSERT_EQ(got, expected) << "got: " << FriendlyName(got) << "\n"
98 << "expected: " << FriendlyName(expected) << "\n";
Ryan Harrisondbc13af2022-02-21 15:19:07 +000099}
100
Ben Clayton54a104e2023-02-22 20:04:40 +0000101static constexpr Params from_constructor_expression_cases[] = {
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000102 ParamsFor<bool>(),
103 ParamsFor<i32>(),
104 ParamsFor<u32>(),
105 ParamsFor<f32>(),
Zhaoming Jiang60588822022-06-28 14:03:36 +0000106 ParamsFor<f16>(),
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000107 ParamsFor<vec3<i32>>(),
108 ParamsFor<vec3<u32>>(),
109 ParamsFor<vec3<f32>>(),
Zhaoming Jiang60588822022-06-28 14:03:36 +0000110 ParamsFor<vec3<f16>>(),
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000111 ParamsFor<mat3x3<f32>>(),
Zhaoming Jiang60588822022-06-28 14:03:36 +0000112 ParamsFor<mat3x3<f16>>(),
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000113 ParamsFor<alias<bool>>(),
114 ParamsFor<alias<i32>>(),
115 ParamsFor<alias<u32>>(),
116 ParamsFor<alias<f32>>(),
Zhaoming Jiang60588822022-06-28 14:03:36 +0000117 ParamsFor<alias<f16>>(),
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000118 ParamsFor<alias<vec3<i32>>>(),
119 ParamsFor<alias<vec3<u32>>>(),
120 ParamsFor<alias<vec3<f32>>>(),
Zhaoming Jiang60588822022-06-28 14:03:36 +0000121 ParamsFor<alias<vec3<f16>>>(),
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000122 ParamsFor<alias<mat3x3<f32>>>(),
Zhaoming Jiang60588822022-06-28 14:03:36 +0000123 ParamsFor<alias<mat3x3<f16>>>(),
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000124};
Ben Clayton54a104e2023-02-22 20:04:40 +0000125INSTANTIATE_TEST_SUITE_P(ResolverValueConstructorValidationTest,
126 InferTypeTest_FromConstructorExpression,
127 testing::ValuesIn(from_constructor_expression_cases));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000128
129using InferTypeTest_FromArithmeticExpression = ResolverTestWithParam<Params>;
130TEST_P(InferTypeTest_FromArithmeticExpression, All) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000131 // e.g. for vec3<f32>
132 // {
133 // var a = vec3<f32>(2.0, 2.0, 2.0) * 3.0;
134 // }
135 auto& params = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000136
dan sinclair41e4d9a2022-05-01 14:40:55 +0000137 auto* arith_lhs_expr = params.create_rhs_ast_value(*this, 2);
138 auto* arith_rhs_expr = params.create_rhs_ast_value(*this, 3);
dan sinclair6e77b472022-10-20 13:38:28 +0000139 auto* initializer_expr = Mul(arith_lhs_expr, arith_rhs_expr);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000140
dan sinclair6e77b472022-10-20 13:38:28 +0000141 auto* a = Var("a", initializer_expr);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000142 // Self-assign 'a' to force the expression to be resolved so we can test its
143 // type below
144 auto* a_ident = Expr("a");
145 WrapInFunction(Decl(a), Assign(a_ident, "a"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000146
dan sinclair41e4d9a2022-05-01 14:40:55 +0000147 ASSERT_TRUE(r()->Resolve()) << r()->error();
148 auto* got = TypeOf(a_ident);
dan sinclairb6cc4cb2023-02-19 04:01:29 +0000149 auto* expected =
Ben Clayton1a8a19d2023-06-13 17:01:16 +0000150 create<type::Reference>(builtin::AddressSpace::kFunction, params.create_rhs_sem_type(*this),
dan sinclairb6cc4cb2023-02-19 04:01:29 +0000151 builtin::Access::kReadWrite);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000152 ASSERT_EQ(got, expected) << "got: " << FriendlyName(got) << "\n"
153 << "expected: " << FriendlyName(expected) << "\n";
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000154}
155static constexpr Params from_arithmetic_expression_cases[] = {
Ben Clayton6ae608c2022-05-16 20:54:42 +0000156 ParamsFor<i32>(),
157 ParamsFor<u32>(),
158 ParamsFor<f32>(),
159 ParamsFor<vec3<f32>>(),
160 ParamsFor<mat3x3<f32>>(),
161 ParamsFor<alias<i32>>(),
162 ParamsFor<alias<u32>>(),
163 ParamsFor<alias<f32>>(),
164 ParamsFor<alias<vec3<f32>>>(),
165 ParamsFor<alias<mat3x3<f32>>>(),
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000166};
Ben Clayton54a104e2023-02-22 20:04:40 +0000167INSTANTIATE_TEST_SUITE_P(ResolverValueConstructorValidationTest,
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000168 InferTypeTest_FromArithmeticExpression,
169 testing::ValuesIn(from_arithmetic_expression_cases));
170
171using InferTypeTest_FromCallExpression = ResolverTestWithParam<Params>;
172TEST_P(InferTypeTest_FromCallExpression, All) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000173 // e.g. for vec3<f32>
174 //
175 // fn foo() -> vec3<f32> {
176 // return vec3<f32>();
177 // }
178 //
179 // fn bar()
180 // {
181 // var a = foo();
182 // }
183 auto& params = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000184
dan sinclaire4039c72023-02-17 21:58:59 +0000185 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +0000186
Ben Clayton783b1692022-08-02 17:03:35 +0000187 Func("foo", utils::Empty, params.create_rhs_ast_type(*this),
Ben Clayton01ac21c2023-02-07 16:14:25 +0000188 utils::Vector{Return(Call(params.create_rhs_ast_type(*this)))}, {});
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000189
Ben Clayton58794ae2022-08-19 17:28:53 +0000190 auto* a = Var("a", Call("foo"));
dan sinclair41e4d9a2022-05-01 14:40:55 +0000191 // Self-assign 'a' to force the expression to be resolved so we can test its
192 // type below
193 auto* a_ident = Expr("a");
194 WrapInFunction(Decl(a), Assign(a_ident, "a"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000195
dan sinclair41e4d9a2022-05-01 14:40:55 +0000196 ASSERT_TRUE(r()->Resolve()) << r()->error();
197 auto* got = TypeOf(a_ident);
dan sinclairb6cc4cb2023-02-19 04:01:29 +0000198 auto* expected =
Ben Clayton1a8a19d2023-06-13 17:01:16 +0000199 create<type::Reference>(builtin::AddressSpace::kFunction, params.create_rhs_sem_type(*this),
dan sinclairb6cc4cb2023-02-19 04:01:29 +0000200 builtin::Access::kReadWrite);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000201 ASSERT_EQ(got, expected) << "got: " << FriendlyName(got) << "\n"
202 << "expected: " << FriendlyName(expected) << "\n";
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000203}
204static constexpr Params from_call_expression_cases[] = {
205 ParamsFor<bool>(),
206 ParamsFor<i32>(),
207 ParamsFor<u32>(),
208 ParamsFor<f32>(),
Zhaoming Jiang60588822022-06-28 14:03:36 +0000209 ParamsFor<f16>(),
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000210 ParamsFor<vec3<i32>>(),
211 ParamsFor<vec3<u32>>(),
212 ParamsFor<vec3<f32>>(),
Zhaoming Jiang60588822022-06-28 14:03:36 +0000213 ParamsFor<vec3<f16>>(),
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000214 ParamsFor<mat3x3<f32>>(),
Zhaoming Jiang60588822022-06-28 14:03:36 +0000215 ParamsFor<mat3x3<f16>>(),
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000216 ParamsFor<alias<bool>>(),
217 ParamsFor<alias<i32>>(),
218 ParamsFor<alias<u32>>(),
219 ParamsFor<alias<f32>>(),
Zhaoming Jiang60588822022-06-28 14:03:36 +0000220 ParamsFor<alias<f16>>(),
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000221 ParamsFor<alias<vec3<i32>>>(),
222 ParamsFor<alias<vec3<u32>>>(),
223 ParamsFor<alias<vec3<f32>>>(),
Zhaoming Jiang60588822022-06-28 14:03:36 +0000224 ParamsFor<alias<vec3<f16>>>(),
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000225 ParamsFor<alias<mat3x3<f32>>>(),
Zhaoming Jiang60588822022-06-28 14:03:36 +0000226 ParamsFor<alias<mat3x3<f16>>>(),
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000227};
Ben Clayton54a104e2023-02-22 20:04:40 +0000228INSTANTIATE_TEST_SUITE_P(ResolverValueConstructorValidationTest,
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000229 InferTypeTest_FromCallExpression,
230 testing::ValuesIn(from_call_expression_cases));
231
232} // namespace InferTypeTest
233
234namespace ConversionConstructTest {
235enum class Kind {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000236 Construct,
237 Conversion,
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000238};
239
240struct Params {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000241 Kind kind;
242 builder::ast_type_func_ptr lhs_type;
243 builder::ast_type_func_ptr rhs_type;
Antonio Maioranob6d524382022-08-31 22:59:08 +0000244 builder::ast_expr_from_double_func_ptr rhs_value_expr;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000245};
246
247template <typename LhsType, typename RhsType>
248constexpr Params ParamsFor(Kind kind) {
Antonio Maioranob6d524382022-08-31 22:59:08 +0000249 return Params{kind, DataType<LhsType>::AST, DataType<RhsType>::AST,
250 DataType<RhsType>::ExprFromDouble};
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000251}
252
253static constexpr Params valid_cases[] = {
Ben Clayton3b5edf12022-05-16 21:14:11 +0000254 // Identity
255 ParamsFor<bool, bool>(Kind::Construct), //
256 ParamsFor<i32, i32>(Kind::Construct), //
257 ParamsFor<u32, u32>(Kind::Construct), //
258 ParamsFor<f32, f32>(Kind::Construct), //
Zhaoming Jiang60588822022-06-28 14:03:36 +0000259 ParamsFor<f16, f16>(Kind::Construct), //
Ben Clayton3b5edf12022-05-16 21:14:11 +0000260 ParamsFor<vec3<bool>, vec3<bool>>(Kind::Construct), //
261 ParamsFor<vec3<i32>, vec3<i32>>(Kind::Construct), //
262 ParamsFor<vec3<u32>, vec3<u32>>(Kind::Construct), //
263 ParamsFor<vec3<f32>, vec3<f32>>(Kind::Construct), //
Zhaoming Jiang60588822022-06-28 14:03:36 +0000264 ParamsFor<vec3<f16>, vec3<f16>>(Kind::Construct), //
Ben Clayton3b5edf12022-05-16 21:14:11 +0000265 ParamsFor<mat3x3<f32>, mat3x3<f32>>(Kind::Construct), //
266 ParamsFor<mat2x3<f32>, mat2x3<f32>>(Kind::Construct), //
267 ParamsFor<mat3x2<f32>, mat3x2<f32>>(Kind::Construct), //
Zhaoming Jiang60588822022-06-28 14:03:36 +0000268 ParamsFor<mat3x3<f16>, mat3x3<f16>>(Kind::Construct), //
269 ParamsFor<mat2x3<f16>, mat2x3<f16>>(Kind::Construct), //
270 ParamsFor<mat3x2<f16>, mat3x2<f16>>(Kind::Construct), //
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000271
272 // Splat
273 ParamsFor<vec3<bool>, bool>(Kind::Construct), //
274 ParamsFor<vec3<i32>, i32>(Kind::Construct), //
275 ParamsFor<vec3<u32>, u32>(Kind::Construct), //
276 ParamsFor<vec3<f32>, f32>(Kind::Construct), //
Zhaoming Jiang60588822022-06-28 14:03:36 +0000277 ParamsFor<vec3<f16>, f16>(Kind::Construct), //
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000278
279 // Conversion
280 ParamsFor<bool, u32>(Kind::Conversion), //
281 ParamsFor<bool, i32>(Kind::Conversion), //
282 ParamsFor<bool, f32>(Kind::Conversion), //
Zhaoming Jiang60588822022-06-28 14:03:36 +0000283 ParamsFor<bool, f16>(Kind::Conversion), //
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000284
285 ParamsFor<i32, bool>(Kind::Conversion), //
286 ParamsFor<i32, u32>(Kind::Conversion), //
287 ParamsFor<i32, f32>(Kind::Conversion), //
Zhaoming Jiang60588822022-06-28 14:03:36 +0000288 ParamsFor<i32, f16>(Kind::Conversion), //
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000289
290 ParamsFor<u32, bool>(Kind::Conversion), //
291 ParamsFor<u32, i32>(Kind::Conversion), //
292 ParamsFor<u32, f32>(Kind::Conversion), //
Zhaoming Jiang60588822022-06-28 14:03:36 +0000293 ParamsFor<u32, f16>(Kind::Conversion), //
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000294
295 ParamsFor<f32, bool>(Kind::Conversion), //
296 ParamsFor<f32, u32>(Kind::Conversion), //
297 ParamsFor<f32, i32>(Kind::Conversion), //
Zhaoming Jiang60588822022-06-28 14:03:36 +0000298 ParamsFor<f32, f16>(Kind::Conversion), //
299
300 ParamsFor<f16, bool>(Kind::Conversion), //
301 ParamsFor<f16, u32>(Kind::Conversion), //
302 ParamsFor<f16, i32>(Kind::Conversion), //
303 ParamsFor<f16, f32>(Kind::Conversion), //
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000304
305 ParamsFor<vec3<bool>, vec3<u32>>(Kind::Conversion), //
306 ParamsFor<vec3<bool>, vec3<i32>>(Kind::Conversion), //
307 ParamsFor<vec3<bool>, vec3<f32>>(Kind::Conversion), //
Zhaoming Jiang60588822022-06-28 14:03:36 +0000308 ParamsFor<vec3<bool>, vec3<f16>>(Kind::Conversion), //
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000309
310 ParamsFor<vec3<i32>, vec3<bool>>(Kind::Conversion), //
311 ParamsFor<vec3<i32>, vec3<u32>>(Kind::Conversion), //
312 ParamsFor<vec3<i32>, vec3<f32>>(Kind::Conversion), //
Zhaoming Jiang60588822022-06-28 14:03:36 +0000313 ParamsFor<vec3<i32>, vec3<f16>>(Kind::Conversion), //
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000314
315 ParamsFor<vec3<u32>, vec3<bool>>(Kind::Conversion), //
316 ParamsFor<vec3<u32>, vec3<i32>>(Kind::Conversion), //
317 ParamsFor<vec3<u32>, vec3<f32>>(Kind::Conversion), //
Zhaoming Jiang60588822022-06-28 14:03:36 +0000318 ParamsFor<vec3<u32>, vec3<f16>>(Kind::Conversion), //
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000319
320 ParamsFor<vec3<f32>, vec3<bool>>(Kind::Conversion), //
321 ParamsFor<vec3<f32>, vec3<u32>>(Kind::Conversion), //
322 ParamsFor<vec3<f32>, vec3<i32>>(Kind::Conversion), //
Zhaoming Jiang60588822022-06-28 14:03:36 +0000323 ParamsFor<vec3<f32>, vec3<f16>>(Kind::Conversion), //
324
325 ParamsFor<vec3<f16>, vec3<bool>>(Kind::Conversion), //
326 ParamsFor<vec3<f16>, vec3<u32>>(Kind::Conversion), //
327 ParamsFor<vec3<f16>, vec3<i32>>(Kind::Conversion), //
328 ParamsFor<vec3<f16>, vec3<f32>>(Kind::Conversion), //
329
330 ParamsFor<mat3x3<f16>, mat3x3<f32>>(Kind::Conversion), //
331 ParamsFor<mat2x3<f16>, mat2x3<f32>>(Kind::Conversion), //
332 ParamsFor<mat3x2<f16>, mat3x2<f32>>(Kind::Conversion), //
333
334 ParamsFor<mat3x3<f32>, mat3x3<f16>>(Kind::Conversion), //
335 ParamsFor<mat2x3<f32>, mat2x3<f16>>(Kind::Conversion), //
336 ParamsFor<mat3x2<f32>, mat3x2<f16>>(Kind::Conversion), //
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000337};
338
Ben Clayton54a104e2023-02-22 20:04:40 +0000339using ConversionConstructorValidTest = ResolverTestWithParam<Params>;
340TEST_P(ConversionConstructorValidTest, All) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000341 auto& params = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000342
dan sinclaire4039c72023-02-17 21:58:59 +0000343 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +0000344
dan sinclair41e4d9a2022-05-01 14:40:55 +0000345 // var a : <lhs_type1> = <lhs_type2>(<rhs_type>(<rhs_value_expr>));
Ben Clayton971318f2023-02-14 13:52:43 +0000346 auto lhs_type1 = params.lhs_type(*this);
347 auto lhs_type2 = params.lhs_type(*this);
348 auto rhs_type = params.rhs_type(*this);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000349 auto* rhs_value_expr = params.rhs_value_expr(*this, 0);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000350
dan sinclairb23cda42023-02-28 17:31:54 +0000351 utils::StringStream ss;
dan sinclair41e4d9a2022-05-01 14:40:55 +0000352 ss << FriendlyName(lhs_type1) << " = " << FriendlyName(lhs_type2) << "("
353 << FriendlyName(rhs_type) << "(<rhs value expr>))";
354 SCOPED_TRACE(ss.str());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000355
Ben Clayton01ac21c2023-02-07 16:14:25 +0000356 auto* arg = Call(rhs_type, rhs_value_expr);
357 auto* tc = Call(lhs_type2, arg);
Ben Clayton58794ae2022-08-19 17:28:53 +0000358 auto* a = Var("a", lhs_type1, tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000359
dan sinclair41e4d9a2022-05-01 14:40:55 +0000360 // Self-assign 'a' to force the expression to be resolved so we can test its
361 // type below
362 auto* a_ident = Expr("a");
363 WrapInFunction(Decl(a), Assign(a_ident, "a"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000364
dan sinclair41e4d9a2022-05-01 14:40:55 +0000365 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000366
Ben Claytone5a67ac2022-05-19 21:50:59 +0000367 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000368 ASSERT_NE(call, nullptr);
369 switch (params.kind) {
370 case Kind::Construct: {
Ben Clayton54a104e2023-02-22 20:04:40 +0000371 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000372 ASSERT_NE(ctor, nullptr);
373 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +0000374 ASSERT_EQ(ctor->Parameters().Length(), 1u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000375 EXPECT_EQ(ctor->Parameters()[0]->Type(), TypeOf(arg));
376 break;
377 }
378 case Kind::Conversion: {
Ben Clayton54a104e2023-02-22 20:04:40 +0000379 auto* conv = call->Target()->As<sem::ValueConversion>();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000380 ASSERT_NE(conv, nullptr);
381 EXPECT_EQ(call->Type(), conv->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +0000382 ASSERT_EQ(conv->Parameters().Length(), 1u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000383 EXPECT_EQ(conv->Parameters()[0]->Type(), TypeOf(arg));
384 break;
385 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000386 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000387}
Ben Clayton54a104e2023-02-22 20:04:40 +0000388INSTANTIATE_TEST_SUITE_P(ResolverValueConstructorValidationTest,
389 ConversionConstructorValidTest,
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000390 testing::ValuesIn(valid_cases));
391
392constexpr CreatePtrs all_types[] = {
393 CreatePtrsFor<bool>(), //
394 CreatePtrsFor<u32>(), //
395 CreatePtrsFor<i32>(), //
396 CreatePtrsFor<f32>(), //
Zhaoming Jiang60588822022-06-28 14:03:36 +0000397 CreatePtrsFor<f16>(), //
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000398 CreatePtrsFor<vec3<bool>>(), //
399 CreatePtrsFor<vec3<i32>>(), //
400 CreatePtrsFor<vec3<u32>>(), //
401 CreatePtrsFor<vec3<f32>>(), //
Zhaoming Jiang60588822022-06-28 14:03:36 +0000402 CreatePtrsFor<vec3<f16>>(), //
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000403 CreatePtrsFor<mat3x3<i32>>(), //
404 CreatePtrsFor<mat3x3<u32>>(), //
405 CreatePtrsFor<mat3x3<f32>>(), //
Zhaoming Jiang60588822022-06-28 14:03:36 +0000406 CreatePtrsFor<mat3x3<f16>>(), //
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000407 CreatePtrsFor<mat2x3<i32>>(), //
408 CreatePtrsFor<mat2x3<u32>>(), //
409 CreatePtrsFor<mat2x3<f32>>(), //
Zhaoming Jiang60588822022-06-28 14:03:36 +0000410 CreatePtrsFor<mat2x3<f16>>(), //
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000411 CreatePtrsFor<mat3x2<i32>>(), //
412 CreatePtrsFor<mat3x2<u32>>(), //
Zhaoming Jiang60588822022-06-28 14:03:36 +0000413 CreatePtrsFor<mat3x2<f32>>(), //
414 CreatePtrsFor<mat3x2<f16>>(), //
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000415};
416
Ben Clayton54a104e2023-02-22 20:04:40 +0000417using ConversionConstructorInvalidTest = ResolverTestWithParam<std::tuple<CreatePtrs, // lhs
dan sinclair41e4d9a2022-05-01 14:40:55 +0000418 CreatePtrs // rhs
419 >>;
Ben Clayton54a104e2023-02-22 20:04:40 +0000420TEST_P(ConversionConstructorInvalidTest, All) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000421 auto& params = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000422
dan sinclair41e4d9a2022-05-01 14:40:55 +0000423 auto& lhs_params = std::get<0>(params);
424 auto& rhs_params = std::get<1>(params);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000425
dan sinclair41e4d9a2022-05-01 14:40:55 +0000426 // Skip test for valid cases
427 for (auto& v : valid_cases) {
428 if (v.lhs_type == lhs_params.ast && v.rhs_type == rhs_params.ast &&
Antonio Maioranob6d524382022-08-31 22:59:08 +0000429 v.rhs_value_expr == rhs_params.expr_from_double) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000430 return;
431 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000432 }
dan sinclair41e4d9a2022-05-01 14:40:55 +0000433 // Skip non-conversions
434 if (lhs_params.ast == rhs_params.ast) {
435 return;
436 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000437
dan sinclair41e4d9a2022-05-01 14:40:55 +0000438 // var a : <lhs_type1> = <lhs_type2>(<rhs_type>(<rhs_value_expr>));
Ben Clayton971318f2023-02-14 13:52:43 +0000439 auto lhs_type1 = lhs_params.ast(*this);
440 auto lhs_type2 = lhs_params.ast(*this);
441 auto rhs_type = rhs_params.ast(*this);
Antonio Maioranob6d524382022-08-31 22:59:08 +0000442 auto* rhs_value_expr = rhs_params.expr_from_double(*this, 0);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000443
dan sinclairb23cda42023-02-28 17:31:54 +0000444 utils::StringStream ss;
dan sinclair41e4d9a2022-05-01 14:40:55 +0000445 ss << FriendlyName(lhs_type1) << " = " << FriendlyName(lhs_type2) << "("
446 << FriendlyName(rhs_type) << "(<rhs value expr>))";
447 SCOPED_TRACE(ss.str());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000448
dan sinclaire4039c72023-02-17 21:58:59 +0000449 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +0000450
Ben Clayton01ac21c2023-02-07 16:14:25 +0000451 auto* a = Var("a", lhs_type1, Call(lhs_type2, Call(rhs_type, rhs_value_expr)));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000452
dan sinclair41e4d9a2022-05-01 14:40:55 +0000453 // Self-assign 'a' to force the expression to be resolved so we can test its
454 // type below
455 auto* a_ident = Expr("a");
456 WrapInFunction(Decl(a), Assign(a_ident, "a"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000457
dan sinclair41e4d9a2022-05-01 14:40:55 +0000458 ASSERT_FALSE(r()->Resolve());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000459}
Ben Clayton54a104e2023-02-22 20:04:40 +0000460INSTANTIATE_TEST_SUITE_P(ResolverValueConstructorValidationTest,
461 ConversionConstructorInvalidTest,
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000462 testing::Combine(testing::ValuesIn(all_types),
463 testing::ValuesIn(all_types)));
464
Ben Clayton54a104e2023-02-22 20:04:40 +0000465TEST_F(ResolverValueConstructorValidationTest, ConversionConstructorInvalid_TooManyConstructors) {
Ben Clayton01ac21c2023-02-07 16:14:25 +0000466 auto* a = Var("a", ty.f32(), Call(Source{{12, 34}}, ty.f32(), Expr(1_f), Expr(2_f)));
dan sinclair41e4d9a2022-05-01 14:40:55 +0000467 WrapInFunction(a);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000468
dan sinclair41e4d9a2022-05-01 14:40:55 +0000469 ASSERT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +0000470 EXPECT_THAT(r()->error(), HasSubstr("12:34 error: no matching constructor for f32(f32, f32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000471}
472
Ben Clayton54a104e2023-02-22 20:04:40 +0000473TEST_F(ResolverValueConstructorValidationTest, ConversionConstructorInvalid_InvalidConstructor) {
Ben Clayton66805b02023-06-14 22:00:01 +0000474 auto* a = Var("a", ty.f32(), Call(Source{{12, 34}}, ty.f32(), Call<array<f32, 4>>()));
dan sinclair41e4d9a2022-05-01 14:40:55 +0000475 WrapInFunction(a);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000476
dan sinclair41e4d9a2022-05-01 14:40:55 +0000477 ASSERT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +0000478 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +0000479 HasSubstr("12:34 error: no matching constructor for f32(array<f32, 4>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000480}
481
482} // namespace ConversionConstructTest
483
Ben Clayton54a104e2023-02-22 20:04:40 +0000484namespace ArrayConstructor {
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000485
Ben Clayton54a104e2023-02-22 20:04:40 +0000486TEST_F(ResolverValueConstructorValidationTest, Array_ZeroValue_Pass) {
Ben Clayton0ce9ab02022-05-05 20:23:40 +0000487 // array<u32, 10u>();
Ben Clayton66805b02023-06-14 22:00:01 +0000488 auto* tc = Call<array<u32, 10>>();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000489 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000490
dan sinclair41e4d9a2022-05-01 14:40:55 +0000491 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000492
Ben Claytone5a67ac2022-05-19 21:50:59 +0000493 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000494 ASSERT_NE(call, nullptr);
dan sinclair946858a2022-12-08 22:21:24 +0000495 EXPECT_TRUE(call->Type()->Is<type::Array>());
Ben Clayton54a104e2023-02-22 20:04:40 +0000496 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000497 ASSERT_NE(ctor, nullptr);
498 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +0000499 ASSERT_EQ(ctor->Parameters().Length(), 0u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000500}
501
Ben Clayton54a104e2023-02-22 20:04:40 +0000502TEST_F(ResolverValueConstructorValidationTest, Array_U32U32U32) {
Ben Clayton6315a272022-08-01 17:18:04 +0000503 // array<u32, 3u>(0u, 10u, 20u);
Ben Clayton66805b02023-06-14 22:00:01 +0000504 auto* tc = Call<array<u32, 3>>(0_u, 10_u, 20_u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000505 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000506
dan sinclair41e4d9a2022-05-01 14:40:55 +0000507 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000508
Ben Claytone5a67ac2022-05-19 21:50:59 +0000509 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000510 ASSERT_NE(call, nullptr);
dan sinclair946858a2022-12-08 22:21:24 +0000511 EXPECT_TRUE(call->Type()->Is<type::Array>());
Ben Clayton54a104e2023-02-22 20:04:40 +0000512 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000513 ASSERT_NE(ctor, nullptr);
514 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +0000515 ASSERT_EQ(ctor->Parameters().Length(), 3u);
dan sinclaird37ecf92022-12-08 16:39:59 +0000516 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::U32>());
517 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::U32>());
518 EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::U32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000519}
520
Ben Clayton54a104e2023-02-22 20:04:40 +0000521TEST_F(ResolverValueConstructorValidationTest, InferredArray_U32U32U32) {
Ben Clayton4a656202022-08-01 17:36:54 +0000522 // array(0u, 10u, 20u);
Ben Clayton66805b02023-06-14 22:00:01 +0000523 auto* tc = Call<array<Infer>>(Source{{12, 34}}, 0_u, 10_u, 20_u);
Ben Clayton4a656202022-08-01 17:36:54 +0000524 WrapInFunction(tc);
525
526 ASSERT_TRUE(r()->Resolve()) << r()->error();
527
528 auto* call = Sem().Get<sem::Call>(tc);
529 ASSERT_NE(call, nullptr);
dan sinclair946858a2022-12-08 22:21:24 +0000530 EXPECT_TRUE(call->Type()->Is<type::Array>());
Ben Clayton54a104e2023-02-22 20:04:40 +0000531 auto* ctor = call->Target()->As<sem::ValueConstructor>();
Ben Clayton4a656202022-08-01 17:36:54 +0000532 ASSERT_NE(ctor, nullptr);
533 EXPECT_EQ(call->Type(), ctor->ReturnType());
534 ASSERT_EQ(ctor->Parameters().Length(), 3u);
dan sinclaird37ecf92022-12-08 16:39:59 +0000535 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::U32>());
536 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::U32>());
537 EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::U32>());
Ben Clayton4a656202022-08-01 17:36:54 +0000538}
539
Ben Clayton54a104e2023-02-22 20:04:40 +0000540TEST_F(ResolverValueConstructorValidationTest, Array_U32AIU32) {
Ben Clayton4a656202022-08-01 17:36:54 +0000541 // array<u32, 3u>(0u, 10, 20u);
Ben Clayton66805b02023-06-14 22:00:01 +0000542 auto* tc = Call<array<u32, 3>>(0_u, 10_a, 20_u);
Ben Clayton4a656202022-08-01 17:36:54 +0000543 WrapInFunction(tc);
544
545 ASSERT_TRUE(r()->Resolve()) << r()->error();
546
547 auto* call = Sem().Get<sem::Call>(tc);
548 ASSERT_NE(call, nullptr);
dan sinclair946858a2022-12-08 22:21:24 +0000549 EXPECT_TRUE(call->Type()->Is<type::Array>());
Ben Clayton54a104e2023-02-22 20:04:40 +0000550 auto* ctor = call->Target()->As<sem::ValueConstructor>();
Ben Clayton4a656202022-08-01 17:36:54 +0000551 ASSERT_NE(ctor, nullptr);
552 EXPECT_EQ(call->Type(), ctor->ReturnType());
553 ASSERT_EQ(ctor->Parameters().Length(), 3u);
dan sinclaird37ecf92022-12-08 16:39:59 +0000554 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::U32>());
555 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::U32>());
556 EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::U32>());
Ben Clayton4a656202022-08-01 17:36:54 +0000557}
558
Ben Clayton54a104e2023-02-22 20:04:40 +0000559TEST_F(ResolverValueConstructorValidationTest, InferredArray_U32AIU32) {
Ben Clayton4a656202022-08-01 17:36:54 +0000560 // array(0u, 10u, 20u);
Ben Clayton66805b02023-06-14 22:00:01 +0000561 auto* tc = Call<array<Infer>>(Source{{12, 34}}, 0_u, 10_a, 20_u);
Ben Clayton4a656202022-08-01 17:36:54 +0000562 WrapInFunction(tc);
563
564 ASSERT_TRUE(r()->Resolve()) << r()->error();
565
566 auto* call = Sem().Get<sem::Call>(tc);
567 ASSERT_NE(call, nullptr);
dan sinclair946858a2022-12-08 22:21:24 +0000568 EXPECT_TRUE(call->Type()->Is<type::Array>());
Ben Clayton54a104e2023-02-22 20:04:40 +0000569 auto* ctor = call->Target()->As<sem::ValueConstructor>();
Ben Clayton4a656202022-08-01 17:36:54 +0000570 ASSERT_NE(ctor, nullptr);
571 EXPECT_EQ(call->Type(), ctor->ReturnType());
572 ASSERT_EQ(ctor->Parameters().Length(), 3u);
dan sinclaird37ecf92022-12-08 16:39:59 +0000573 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::U32>());
574 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::U32>());
575 EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::U32>());
Ben Clayton4a656202022-08-01 17:36:54 +0000576}
577
Ben Clayton54a104e2023-02-22 20:04:40 +0000578TEST_F(ResolverValueConstructorValidationTest, ArrayU32_AIAIAI) {
Ben Clayton4a656202022-08-01 17:36:54 +0000579 // array<u32, 3u>(0, 10, 20);
Ben Clayton66805b02023-06-14 22:00:01 +0000580 auto* tc = Call<array<u32, 3>>(0_a, 10_a, 20_a);
Ben Clayton4a656202022-08-01 17:36:54 +0000581 WrapInFunction(tc);
582
583 ASSERT_TRUE(r()->Resolve()) << r()->error();
584
585 auto* call = Sem().Get<sem::Call>(tc);
586 ASSERT_NE(call, nullptr);
dan sinclair946858a2022-12-08 22:21:24 +0000587 EXPECT_TRUE(call->Type()->Is<type::Array>());
Ben Clayton54a104e2023-02-22 20:04:40 +0000588 auto* ctor = call->Target()->As<sem::ValueConstructor>();
Ben Clayton4a656202022-08-01 17:36:54 +0000589 ASSERT_NE(ctor, nullptr);
590 EXPECT_EQ(call->Type(), ctor->ReturnType());
591 ASSERT_EQ(ctor->Parameters().Length(), 3u);
dan sinclaird37ecf92022-12-08 16:39:59 +0000592 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::U32>());
593 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::U32>());
594 EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::U32>());
Ben Clayton4a656202022-08-01 17:36:54 +0000595}
596
Ben Clayton54a104e2023-02-22 20:04:40 +0000597TEST_F(ResolverValueConstructorValidationTest, InferredArray_AIAIAI) {
Ben Clayton4a656202022-08-01 17:36:54 +0000598 // const c = array(0, 10, 20);
Ben Clayton66805b02023-06-14 22:00:01 +0000599 auto* tc = Call<array<Infer>>(Source{{12, 34}}, 0_a, 10_a, 20_a);
Ben Clayton58794ae2022-08-19 17:28:53 +0000600 WrapInFunction(Decl(Const("C", tc)));
Ben Clayton4a656202022-08-01 17:36:54 +0000601
602 ASSERT_TRUE(r()->Resolve()) << r()->error();
603
604 auto* call = Sem().Get<sem::Call>(tc);
605 ASSERT_NE(call, nullptr);
dan sinclair946858a2022-12-08 22:21:24 +0000606 EXPECT_TRUE(call->Type()->Is<type::Array>());
Ben Clayton54a104e2023-02-22 20:04:40 +0000607 auto* ctor = call->Target()->As<sem::ValueConstructor>();
Ben Clayton4a656202022-08-01 17:36:54 +0000608 ASSERT_NE(ctor, nullptr);
609 EXPECT_EQ(call->Type(), ctor->ReturnType());
610 ASSERT_EQ(ctor->Parameters().Length(), 3u);
dan sinclair094ace62022-12-08 15:33:01 +0000611 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::AbstractInt>());
612 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::AbstractInt>());
613 EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::AbstractInt>());
Ben Clayton4a656202022-08-01 17:36:54 +0000614}
615
Ben Clayton54a104e2023-02-22 20:04:40 +0000616TEST_F(ResolverValueConstructorValidationTest, InferredArrayU32_VecI32_VecAI) {
Ben Clayton4a656202022-08-01 17:36:54 +0000617 // array(vec2(10i), vec2(20));
Ben Clayton66805b02023-06-14 22:00:01 +0000618 auto* tc = Call<array<Infer>>(Source{{12, 34}}, //
619 Call<vec2<Infer>>(20_i), //
620 Call<vec2<Infer>>(20_a));
Ben Clayton4a656202022-08-01 17:36:54 +0000621 WrapInFunction(tc);
622
623 ASSERT_TRUE(r()->Resolve()) << r()->error();
624
625 auto* call = Sem().Get<sem::Call>(tc);
626 ASSERT_NE(call, nullptr);
dan sinclair946858a2022-12-08 22:21:24 +0000627 EXPECT_TRUE(call->Type()->Is<type::Array>());
Ben Clayton54a104e2023-02-22 20:04:40 +0000628 auto* ctor = call->Target()->As<sem::ValueConstructor>();
Ben Clayton4a656202022-08-01 17:36:54 +0000629 ASSERT_NE(ctor, nullptr);
630 EXPECT_EQ(call->Type(), ctor->ReturnType());
631 ASSERT_EQ(ctor->Parameters().Length(), 2u);
dan sinclair0e780da2022-12-08 22:21:24 +0000632 ASSERT_TRUE(ctor->Parameters()[0]->Type()->Is<type::Vector>());
633 EXPECT_TRUE(ctor->Parameters()[0]->Type()->As<type::Vector>()->type()->Is<type::I32>());
634 ASSERT_TRUE(ctor->Parameters()[1]->Type()->Is<type::Vector>());
635 EXPECT_TRUE(ctor->Parameters()[1]->Type()->As<type::Vector>()->type()->Is<type::I32>());
Ben Clayton4a656202022-08-01 17:36:54 +0000636}
637
Ben Clayton54a104e2023-02-22 20:04:40 +0000638TEST_F(ResolverValueConstructorValidationTest, InferredArrayU32_VecAI_VecF32) {
Ben Clayton4a656202022-08-01 17:36:54 +0000639 // array(vec2(20), vec2(10f));
Ben Clayton66805b02023-06-14 22:00:01 +0000640 auto* tc = Call<array<Infer>>(Source{{12, 34}}, //
641 Call<vec2<Infer>>(20_a), //
642 Call<vec2<Infer>>(20_f));
Ben Clayton4a656202022-08-01 17:36:54 +0000643 WrapInFunction(tc);
644
645 ASSERT_TRUE(r()->Resolve()) << r()->error();
646
647 auto* call = Sem().Get<sem::Call>(tc);
648 ASSERT_NE(call, nullptr);
dan sinclair946858a2022-12-08 22:21:24 +0000649 EXPECT_TRUE(call->Type()->Is<type::Array>());
Ben Clayton54a104e2023-02-22 20:04:40 +0000650 auto* ctor = call->Target()->As<sem::ValueConstructor>();
Ben Clayton4a656202022-08-01 17:36:54 +0000651 ASSERT_NE(ctor, nullptr);
652 EXPECT_EQ(call->Type(), ctor->ReturnType());
653 ASSERT_EQ(ctor->Parameters().Length(), 2u);
dan sinclair0e780da2022-12-08 22:21:24 +0000654 ASSERT_TRUE(ctor->Parameters()[0]->Type()->Is<type::Vector>());
655 EXPECT_TRUE(ctor->Parameters()[0]->Type()->As<type::Vector>()->type()->Is<type::F32>());
656 ASSERT_TRUE(ctor->Parameters()[1]->Type()->Is<type::Vector>());
657 EXPECT_TRUE(ctor->Parameters()[1]->Type()->As<type::Vector>()->type()->Is<type::F32>());
Ben Clayton4a656202022-08-01 17:36:54 +0000658}
659
Ben Clayton54a104e2023-02-22 20:04:40 +0000660TEST_F(ResolverValueConstructorValidationTest, ArrayArgumentTypeMismatch_U32F32) {
Ben Clayton0ce9ab02022-05-05 20:23:40 +0000661 // array<u32, 3u>(0u, 1.0f, 20u);
Ben Clayton66805b02023-06-14 22:00:01 +0000662 auto* tc = Call<array<u32, 3>>(0_u, Expr(Source{{12, 34}}, 1_f), 20_u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000663 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000664
dan sinclair41e4d9a2022-05-01 14:40:55 +0000665 EXPECT_FALSE(r()->Resolve());
Ben Clayton9c4d0c92022-07-31 19:33:04 +0000666 EXPECT_EQ(r()->error(), R"(12:34 error: 'f32' cannot be used to construct an array of 'u32')");
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000667}
668
Ben Clayton54a104e2023-02-22 20:04:40 +0000669TEST_F(ResolverValueConstructorValidationTest, InferredArrayArgumentTypeMismatch_U32F32) {
Ben Clayton4a656202022-08-01 17:36:54 +0000670 // array(0u, 1.0f, 20u);
Ben Clayton66805b02023-06-14 22:00:01 +0000671 auto* tc = Call<array<Infer>>(Source{{12, 34}}, 0_u, 1_f, 20_u);
Ben Clayton4a656202022-08-01 17:36:54 +0000672 WrapInFunction(tc);
673
674 EXPECT_FALSE(r()->Resolve());
675 EXPECT_EQ(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +0000676 R"(12:34 error: cannot infer common array element type from constructor arguments
Ben Clayton4a656202022-08-01 17:36:54 +0000677note: argument 0 is of type 'u32'
678note: argument 1 is of type 'f32')");
679}
680
Ben Clayton54a104e2023-02-22 20:04:40 +0000681TEST_F(ResolverValueConstructorValidationTest, ArrayArgumentTypeMismatch_F32I32) {
Ben Clayton0ce9ab02022-05-05 20:23:40 +0000682 // array<f32, 1u>(1i);
Ben Clayton66805b02023-06-14 22:00:01 +0000683 auto* tc = Call<array<f32, 1>>(Expr(Source{{12, 34}}, 1_i));
dan sinclair41e4d9a2022-05-01 14:40:55 +0000684 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000685
dan sinclair41e4d9a2022-05-01 14:40:55 +0000686 EXPECT_FALSE(r()->Resolve());
Ben Clayton9c4d0c92022-07-31 19:33:04 +0000687 EXPECT_EQ(r()->error(), R"(12:34 error: 'i32' cannot be used to construct an array of 'f32')");
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000688}
689
Ben Clayton54a104e2023-02-22 20:04:40 +0000690TEST_F(ResolverValueConstructorValidationTest, InferredArrayArgumentTypeMismatch_F32I32) {
Ben Clayton4a656202022-08-01 17:36:54 +0000691 // array(1f, 1i);
Ben Clayton66805b02023-06-14 22:00:01 +0000692 auto* tc = Call<array<Infer>>(Source{{12, 34}}, 1_f, 1_i);
Ben Clayton4a656202022-08-01 17:36:54 +0000693 WrapInFunction(tc);
694
695 EXPECT_FALSE(r()->Resolve());
696 EXPECT_EQ(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +0000697 R"(12:34 error: cannot infer common array element type from constructor arguments
Ben Clayton4a656202022-08-01 17:36:54 +0000698note: argument 0 is of type 'f32'
699note: argument 1 is of type 'i32')");
700}
701
Ben Clayton54a104e2023-02-22 20:04:40 +0000702TEST_F(ResolverValueConstructorValidationTest, ArrayArgumentTypeMismatch_U32I32) {
Ben Clayton0ce9ab02022-05-05 20:23:40 +0000703 // array<u32, 1u>(1i, 0u, 0u, 0u, 0u, 0u);
Ben Clayton66805b02023-06-14 22:00:01 +0000704 auto* tc = Call<array<u32, 1>>(Expr(Source{{12, 34}}, 1_i), 0_u, 0_u, 0_u, 0_u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000705 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000706
dan sinclair41e4d9a2022-05-01 14:40:55 +0000707 EXPECT_FALSE(r()->Resolve());
Ben Clayton9c4d0c92022-07-31 19:33:04 +0000708 EXPECT_EQ(r()->error(), R"(12:34 error: 'i32' cannot be used to construct an array of 'u32')");
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000709}
710
Ben Clayton54a104e2023-02-22 20:04:40 +0000711TEST_F(ResolverValueConstructorValidationTest, InferredArrayArgumentTypeMismatch_U32I32) {
Ben Clayton4a656202022-08-01 17:36:54 +0000712 // array(1i, 0u, 0u, 0u, 0u, 0u);
Ben Clayton66805b02023-06-14 22:00:01 +0000713 auto* tc = Call<array<Infer>>(Source{{12, 34}}, 1_i, 0_u, 0_u, 0_u, 0_u);
Ben Clayton4a656202022-08-01 17:36:54 +0000714 WrapInFunction(tc);
715
716 EXPECT_FALSE(r()->Resolve());
717 EXPECT_EQ(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +0000718 R"(12:34 error: cannot infer common array element type from constructor arguments
Ben Clayton4a656202022-08-01 17:36:54 +0000719note: argument 0 is of type 'i32'
720note: argument 1 is of type 'u32')");
721}
722
Ben Clayton54a104e2023-02-22 20:04:40 +0000723TEST_F(ResolverValueConstructorValidationTest, ArrayArgumentTypeMismatch_I32Vec2) {
Ben Clayton0ce9ab02022-05-05 20:23:40 +0000724 // array<i32, 3u>(1i, vec2<i32>());
Ben Clayton66805b02023-06-14 22:00:01 +0000725 auto* tc = Call<array<i32, 3>>(1_i, Call<vec2<i32>>(Source{{12, 34}}));
dan sinclair41e4d9a2022-05-01 14:40:55 +0000726 WrapInFunction(tc);
727 EXPECT_FALSE(r()->Resolve());
728 EXPECT_EQ(r()->error(),
Ben Clayton9c4d0c92022-07-31 19:33:04 +0000729 R"(12:34 error: 'vec2<i32>' cannot be used to construct an array of 'i32')");
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000730}
731
Ben Clayton54a104e2023-02-22 20:04:40 +0000732TEST_F(ResolverValueConstructorValidationTest, InferredArrayArgumentTypeMismatch_I32Vec2) {
Ben Clayton4a656202022-08-01 17:36:54 +0000733 // array(1i, vec2<i32>());
Ben Clayton66805b02023-06-14 22:00:01 +0000734 auto* tc = Call<array<Infer>>(Source{{12, 34}}, 1_i, Call<vec2<i32>>());
Ben Clayton4a656202022-08-01 17:36:54 +0000735 WrapInFunction(tc);
736 EXPECT_FALSE(r()->Resolve());
737 EXPECT_EQ(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +0000738 R"(12:34 error: cannot infer common array element type from constructor arguments
Ben Clayton4a656202022-08-01 17:36:54 +0000739note: argument 0 is of type 'i32'
740note: argument 1 is of type 'vec2<i32>')");
741}
742
Ben Clayton54a104e2023-02-22 20:04:40 +0000743TEST_F(ResolverValueConstructorValidationTest, ArrayArgumentTypeMismatch_Vec3i32_Vec3u32) {
Ben Clayton6315a272022-08-01 17:18:04 +0000744 // array<vec3<i32>, 2u>(vec3<u32>(), vec3<u32>());
Ben Clayton66805b02023-06-14 22:00:01 +0000745 auto* t = Call<array<vec3<i32>, 2>>(Call<vec3<u32>>(Source{{12, 34}}), Call<vec3<u32>>());
dan sinclair41e4d9a2022-05-01 14:40:55 +0000746 WrapInFunction(t);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000747
dan sinclair41e4d9a2022-05-01 14:40:55 +0000748 EXPECT_FALSE(r()->Resolve());
749 EXPECT_EQ(r()->error(),
Ben Clayton9c4d0c92022-07-31 19:33:04 +0000750 R"(12:34 error: 'vec3<u32>' cannot be used to construct an array of 'vec3<i32>')");
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000751}
752
Ben Clayton54a104e2023-02-22 20:04:40 +0000753TEST_F(ResolverValueConstructorValidationTest, InferredArrayArgumentTypeMismatch_Vec3i32_Vec3u32) {
Ben Clayton4a656202022-08-01 17:36:54 +0000754 // array(vec3<i32>(), vec3<u32>());
Ben Clayton66805b02023-06-14 22:00:01 +0000755 auto* t = Call<array<Infer>>(Source{{12, 34}}, Call<vec3<i32>>(), Call<vec3<u32>>());
Ben Clayton4a656202022-08-01 17:36:54 +0000756 WrapInFunction(t);
757
758 EXPECT_FALSE(r()->Resolve());
759 EXPECT_EQ(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +0000760 R"(12:34 error: cannot infer common array element type from constructor arguments
Ben Clayton4a656202022-08-01 17:36:54 +0000761note: argument 0 is of type 'vec3<i32>'
762note: argument 1 is of type 'vec3<u32>')");
763}
764
Ben Clayton54a104e2023-02-22 20:04:40 +0000765TEST_F(ResolverValueConstructorValidationTest, InferredArrayArgumentTypeMismatch_Vec3i32_Vec3AF) {
Ben Clayton4a656202022-08-01 17:36:54 +0000766 // array(vec3<i32>(), vec3(1.0));
Ben Clayton66805b02023-06-14 22:00:01 +0000767 auto* t = Call<array<Infer>>(Source{{12, 34}}, Call<vec3<i32>>(), Call("vec3", 1._a));
Ben Clayton4a656202022-08-01 17:36:54 +0000768 WrapInFunction(t);
769
770 EXPECT_FALSE(r()->Resolve());
771 EXPECT_EQ(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +0000772 R"(12:34 error: cannot infer common array element type from constructor arguments
Ben Clayton4a656202022-08-01 17:36:54 +0000773note: argument 0 is of type 'vec3<i32>'
774note: argument 1 is of type 'vec3<abstract-float>')");
775}
776
Ben Clayton54a104e2023-02-22 20:04:40 +0000777TEST_F(ResolverValueConstructorValidationTest, ArrayArgumentTypeMismatch_Vec3i32_Vec3bool) {
Ben Clayton6315a272022-08-01 17:18:04 +0000778 // array<vec3<i32>, 2u>(vec3<i32>(), vec3<bool>());
Ben Clayton66805b02023-06-14 22:00:01 +0000779 auto* t = Call<array<vec3<i32>, 2>>(Call<vec3<i32>>(), Call<vec3<bool>>());
dan sinclair41e4d9a2022-05-01 14:40:55 +0000780 WrapInFunction(t);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000781
dan sinclair41e4d9a2022-05-01 14:40:55 +0000782 EXPECT_FALSE(r()->Resolve());
783 EXPECT_EQ(r()->error(),
Ben Clayton6315a272022-08-01 17:18:04 +0000784 R"(error: 'vec3<bool>' cannot be used to construct an array of 'vec3<i32>')");
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000785}
786
Ben Clayton54a104e2023-02-22 20:04:40 +0000787TEST_F(ResolverValueConstructorValidationTest, InferredArrayArgumentTypeMismatch_Vec3i32_Vec3bool) {
Ben Clayton4a656202022-08-01 17:36:54 +0000788 // array(vec3<i32>(), vec3<bool>());
Ben Clayton66805b02023-06-14 22:00:01 +0000789 auto* t = Call<array<Infer>>(Source{{12, 34}}, Call<vec3<i32>>(), Call<vec3<bool>>());
Ben Clayton4a656202022-08-01 17:36:54 +0000790 WrapInFunction(t);
791
792 EXPECT_FALSE(r()->Resolve());
793 EXPECT_EQ(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +0000794 R"(12:34 error: cannot infer common array element type from constructor arguments
Ben Clayton4a656202022-08-01 17:36:54 +0000795note: argument 0 is of type 'vec3<i32>'
796note: argument 1 is of type 'vec3<bool>')");
797}
798
Ben Clayton54a104e2023-02-22 20:04:40 +0000799TEST_F(ResolverValueConstructorValidationTest, ArrayOfArray_SubElemSizeMismatch) {
Ben Clayton0ce9ab02022-05-05 20:23:40 +0000800 // array<array<i32, 2u>, 2u>(array<i32, 3u>(), array<i32, 2u>());
Ben Clayton66805b02023-06-14 22:00:01 +0000801 auto* t = Call<array<array<i32, 2>, 2>>(Source{{12, 34}}, Call<array<i32, 3>>(),
802 Call<array<i32, 2>>());
dan sinclair41e4d9a2022-05-01 14:40:55 +0000803 WrapInFunction(t);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000804
dan sinclair41e4d9a2022-05-01 14:40:55 +0000805 EXPECT_FALSE(r()->Resolve());
Ben Clayton6315a272022-08-01 17:18:04 +0000806 EXPECT_EQ(r()->error(),
807 R"(error: 'array<i32, 3>' cannot be used to construct an array of 'array<i32, 2>')");
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000808}
809
Ben Clayton54a104e2023-02-22 20:04:40 +0000810TEST_F(ResolverValueConstructorValidationTest, InferredArrayOfArray_SubElemSizeMismatch) {
Ben Clayton4a656202022-08-01 17:36:54 +0000811 // array<array<i32, 2u>, 2u>(array<i32, 3u>(), array<i32, 2u>());
Ben Clayton66805b02023-06-14 22:00:01 +0000812 auto* t = Call<array<Infer>>(Source{{12, 34}}, Call<array<i32, 3>>(), Call<array<i32, 2>>());
Ben Clayton4a656202022-08-01 17:36:54 +0000813 WrapInFunction(t);
814
815 EXPECT_FALSE(r()->Resolve());
816 EXPECT_EQ(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +0000817 R"(12:34 error: cannot infer common array element type from constructor arguments
Ben Clayton4a656202022-08-01 17:36:54 +0000818note: argument 0 is of type 'array<i32, 3>'
819note: argument 1 is of type 'array<i32, 2>')");
820}
821
Ben Clayton54a104e2023-02-22 20:04:40 +0000822TEST_F(ResolverValueConstructorValidationTest, ArrayOfArray_SubElemTypeMismatch) {
Ben Clayton0ce9ab02022-05-05 20:23:40 +0000823 // array<array<i32, 2u>, 2u>(array<i32, 2u>(), array<u32, 2u>());
Ben Clayton66805b02023-06-14 22:00:01 +0000824 auto* t = Call<array<array<i32, 2>, 2>>(Source{{12, 34}}, Call<array<i32, 2>>(),
825 Call<array<u32, 2>>());
dan sinclair41e4d9a2022-05-01 14:40:55 +0000826 WrapInFunction(t);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000827
dan sinclair41e4d9a2022-05-01 14:40:55 +0000828 EXPECT_FALSE(r()->Resolve());
Ben Clayton6315a272022-08-01 17:18:04 +0000829 EXPECT_EQ(r()->error(),
830 R"(error: 'array<u32, 2>' cannot be used to construct an array of 'array<i32, 2>')");
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000831}
832
Ben Clayton54a104e2023-02-22 20:04:40 +0000833TEST_F(ResolverValueConstructorValidationTest, InferredArrayOfArray_SubElemTypeMismatch) {
Ben Clayton4a656202022-08-01 17:36:54 +0000834 // array<array<i32, 2u>, 2u>(array<i32, 2u>(), array<u32, 2u>());
Ben Clayton66805b02023-06-14 22:00:01 +0000835 auto* t = Call<array<Infer>>(Source{{12, 34}}, Call<array<i32, 2>>(), Call<array<u32, 2>>());
Ben Clayton4a656202022-08-01 17:36:54 +0000836 WrapInFunction(t);
837
838 EXPECT_FALSE(r()->Resolve());
839 EXPECT_EQ(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +0000840 R"(12:34 error: cannot infer common array element type from constructor arguments
Ben Clayton4a656202022-08-01 17:36:54 +0000841note: argument 0 is of type 'array<i32, 2>'
842note: argument 1 is of type 'array<u32, 2>')");
843}
844
Ben Clayton54a104e2023-02-22 20:04:40 +0000845TEST_F(ResolverValueConstructorValidationTest, Array_TooFewElements) {
Ben Clayton0ce9ab02022-05-05 20:23:40 +0000846 // array<i32, 4u>(1i, 2i, 3i);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000847 SetSource(Source::Location({12, 34}));
Ben Clayton66805b02023-06-14 22:00:01 +0000848 auto* tc = Call<array<i32, 4>>(Expr(1_i), Expr(2_i), Expr(3_i));
dan sinclair41e4d9a2022-05-01 14:40:55 +0000849 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000850
dan sinclair41e4d9a2022-05-01 14:40:55 +0000851 EXPECT_FALSE(r()->Resolve());
852 EXPECT_EQ(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +0000853 "12:34 error: array constructor has too few elements: expected 4, found 3");
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000854}
855
Ben Clayton54a104e2023-02-22 20:04:40 +0000856TEST_F(ResolverValueConstructorValidationTest, Array_TooManyElements) {
Ben Clayton0ce9ab02022-05-05 20:23:40 +0000857 // array<i32, 4u>(1i, 2i, 3i, 4i, 5i);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000858 SetSource(Source::Location({12, 34}));
Ben Clayton66805b02023-06-14 22:00:01 +0000859 auto* tc = Call<array<i32, 4>>(Expr(1_i), Expr(2_i), Expr(3_i), Expr(4_i), Expr(5_i));
dan sinclair41e4d9a2022-05-01 14:40:55 +0000860 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000861
dan sinclair41e4d9a2022-05-01 14:40:55 +0000862 EXPECT_FALSE(r()->Resolve());
863 EXPECT_EQ(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +0000864 "12:34 error: array constructor has too many "
dan sinclair41e4d9a2022-05-01 14:40:55 +0000865 "elements: expected 4, "
866 "found 5");
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000867}
868
Ben Clayton54a104e2023-02-22 20:04:40 +0000869TEST_F(ResolverValueConstructorValidationTest, Array_Runtime) {
Ben Clayton0ce9ab02022-05-05 20:23:40 +0000870 // array<i32>(1i);
Ben Clayton66805b02023-06-14 22:00:01 +0000871 auto* tc = Call<array<i32>>(Source{{12, 34}}, Expr(1_i));
dan sinclair41e4d9a2022-05-01 14:40:55 +0000872 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000873
dan sinclair41e4d9a2022-05-01 14:40:55 +0000874 EXPECT_FALSE(r()->Resolve());
Ben Clayton6315a272022-08-01 17:18:04 +0000875 EXPECT_EQ(r()->error(), "12:34 error: cannot construct a runtime-sized array");
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000876}
877
Ben Clayton54a104e2023-02-22 20:04:40 +0000878TEST_F(ResolverValueConstructorValidationTest, Array_RuntimeZeroValue) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000879 // array<i32>();
Ben Clayton66805b02023-06-14 22:00:01 +0000880 auto* tc = Call<array<i32>>(Source{{12, 34}});
dan sinclair41e4d9a2022-05-01 14:40:55 +0000881 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000882
dan sinclair41e4d9a2022-05-01 14:40:55 +0000883 EXPECT_FALSE(r()->Resolve());
Ben Clayton6315a272022-08-01 17:18:04 +0000884 EXPECT_EQ(r()->error(), "12:34 error: cannot construct a runtime-sized array");
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000885}
886
Ben Clayton54a104e2023-02-22 20:04:40 +0000887} // namespace ArrayConstructor
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000888
Ben Clayton54a104e2023-02-22 20:04:40 +0000889namespace ScalarConstructor {
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000890
Ben Clayton54a104e2023-02-22 20:04:40 +0000891TEST_F(ResolverValueConstructorValidationTest, I32_Success) {
Ben Clayton01ac21c2023-02-07 16:14:25 +0000892 auto* expr = Call<i32>(Expr(123_i));
dan sinclair41e4d9a2022-05-01 14:40:55 +0000893 WrapInFunction(expr);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000894
dan sinclair41e4d9a2022-05-01 14:40:55 +0000895 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000896
dan sinclair41e4d9a2022-05-01 14:40:55 +0000897 ASSERT_NE(TypeOf(expr), nullptr);
dan sinclaird37ecf92022-12-08 16:39:59 +0000898 ASSERT_TRUE(TypeOf(expr)->Is<type::I32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000899
Ben Claytone5a67ac2022-05-19 21:50:59 +0000900 auto* call = Sem().Get<sem::Call>(expr);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000901 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +0000902 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000903 ASSERT_NE(ctor, nullptr);
904 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +0000905 ASSERT_EQ(ctor->Parameters().Length(), 1u);
dan sinclaird37ecf92022-12-08 16:39:59 +0000906 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::I32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000907}
908
Ben Clayton54a104e2023-02-22 20:04:40 +0000909TEST_F(ResolverValueConstructorValidationTest, U32_Success) {
Ben Clayton01ac21c2023-02-07 16:14:25 +0000910 auto* expr = Call<u32>(Expr(123_u));
dan sinclair41e4d9a2022-05-01 14:40:55 +0000911 WrapInFunction(expr);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000912
dan sinclair41e4d9a2022-05-01 14:40:55 +0000913 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000914
dan sinclair41e4d9a2022-05-01 14:40:55 +0000915 ASSERT_NE(TypeOf(expr), nullptr);
dan sinclaird37ecf92022-12-08 16:39:59 +0000916 ASSERT_TRUE(TypeOf(expr)->Is<type::U32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000917
Ben Claytone5a67ac2022-05-19 21:50:59 +0000918 auto* call = Sem().Get<sem::Call>(expr);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000919 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +0000920 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000921 ASSERT_NE(ctor, nullptr);
922 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +0000923 ASSERT_EQ(ctor->Parameters().Length(), 1u);
dan sinclaird37ecf92022-12-08 16:39:59 +0000924 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::U32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000925}
926
Ben Clayton54a104e2023-02-22 20:04:40 +0000927TEST_F(ResolverValueConstructorValidationTest, F32_Success) {
Ben Clayton01ac21c2023-02-07 16:14:25 +0000928 auto* expr = Call<f32>(Expr(1.23_f));
dan sinclair41e4d9a2022-05-01 14:40:55 +0000929 WrapInFunction(expr);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000930
dan sinclair41e4d9a2022-05-01 14:40:55 +0000931 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000932
dan sinclair41e4d9a2022-05-01 14:40:55 +0000933 ASSERT_NE(TypeOf(expr), nullptr);
dan sinclaird37ecf92022-12-08 16:39:59 +0000934 ASSERT_TRUE(TypeOf(expr)->Is<type::F32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000935
Ben Claytone5a67ac2022-05-19 21:50:59 +0000936 auto* call = Sem().Get<sem::Call>(expr);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000937 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +0000938 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000939 ASSERT_NE(ctor, nullptr);
940 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +0000941 ASSERT_EQ(ctor->Parameters().Length(), 1u);
dan sinclaird37ecf92022-12-08 16:39:59 +0000942 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::F32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000943}
944
Ben Clayton54a104e2023-02-22 20:04:40 +0000945TEST_F(ResolverValueConstructorValidationTest, F16_Success) {
dan sinclaire4039c72023-02-17 21:58:59 +0000946 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +0000947
Ben Clayton01ac21c2023-02-07 16:14:25 +0000948 auto* expr = Call<f16>(Expr(1.5_h));
Zhaoming Jiang60588822022-06-28 14:03:36 +0000949 WrapInFunction(expr);
950
951 ASSERT_TRUE(r()->Resolve()) << r()->error();
952
953 ASSERT_NE(TypeOf(expr), nullptr);
dan sinclaird37ecf92022-12-08 16:39:59 +0000954 ASSERT_TRUE(TypeOf(expr)->Is<type::F16>());
Zhaoming Jiang60588822022-06-28 14:03:36 +0000955
956 auto* call = Sem().Get<sem::Call>(expr);
957 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +0000958 auto* ctor = call->Target()->As<sem::ValueConstructor>();
Zhaoming Jiang60588822022-06-28 14:03:36 +0000959 ASSERT_NE(ctor, nullptr);
960 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +0000961 ASSERT_EQ(ctor->Parameters().Length(), 1u);
dan sinclaird37ecf92022-12-08 16:39:59 +0000962 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::F16>());
Zhaoming Jiang60588822022-06-28 14:03:36 +0000963}
964
Ben Clayton54a104e2023-02-22 20:04:40 +0000965TEST_F(ResolverValueConstructorValidationTest, Convert_f32_to_i32_Success) {
Ben Clayton01ac21c2023-02-07 16:14:25 +0000966 auto* expr = Call<i32>(1.23_f);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000967 WrapInFunction(expr);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000968
dan sinclair41e4d9a2022-05-01 14:40:55 +0000969 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000970
dan sinclair41e4d9a2022-05-01 14:40:55 +0000971 ASSERT_NE(TypeOf(expr), nullptr);
dan sinclaird37ecf92022-12-08 16:39:59 +0000972 ASSERT_TRUE(TypeOf(expr)->Is<type::I32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000973
Ben Claytone5a67ac2022-05-19 21:50:59 +0000974 auto* call = Sem().Get<sem::Call>(expr);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000975 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +0000976 auto* ctor = call->Target()->As<sem::ValueConversion>();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000977 ASSERT_NE(ctor, nullptr);
978 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +0000979 ASSERT_EQ(ctor->Parameters().Length(), 1u);
dan sinclaird37ecf92022-12-08 16:39:59 +0000980 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::F32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000981}
982
Ben Clayton54a104e2023-02-22 20:04:40 +0000983TEST_F(ResolverValueConstructorValidationTest, Convert_i32_to_u32_Success) {
Ben Clayton01ac21c2023-02-07 16:14:25 +0000984 auto* expr = Call<u32>(123_i);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000985 WrapInFunction(expr);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000986
dan sinclair41e4d9a2022-05-01 14:40:55 +0000987 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000988
dan sinclair41e4d9a2022-05-01 14:40:55 +0000989 ASSERT_NE(TypeOf(expr), nullptr);
dan sinclaird37ecf92022-12-08 16:39:59 +0000990 ASSERT_TRUE(TypeOf(expr)->Is<type::U32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000991
Ben Claytone5a67ac2022-05-19 21:50:59 +0000992 auto* call = Sem().Get<sem::Call>(expr);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000993 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +0000994 auto* ctor = call->Target()->As<sem::ValueConversion>();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000995 ASSERT_NE(ctor, nullptr);
996 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +0000997 ASSERT_EQ(ctor->Parameters().Length(), 1u);
dan sinclaird37ecf92022-12-08 16:39:59 +0000998 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::I32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000999}
1000
Ben Clayton54a104e2023-02-22 20:04:40 +00001001TEST_F(ResolverValueConstructorValidationTest, Convert_u32_to_f16_Success) {
dan sinclaire4039c72023-02-17 21:58:59 +00001002 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00001003
Ben Clayton01ac21c2023-02-07 16:14:25 +00001004 auto* expr = Call<f16>(123_u);
Zhaoming Jiang60588822022-06-28 14:03:36 +00001005 WrapInFunction(expr);
1006
1007 ASSERT_TRUE(r()->Resolve()) << r()->error();
1008
1009 ASSERT_NE(TypeOf(expr), nullptr);
dan sinclaird37ecf92022-12-08 16:39:59 +00001010 ASSERT_TRUE(TypeOf(expr)->Is<type::F16>());
Zhaoming Jiang60588822022-06-28 14:03:36 +00001011
1012 auto* call = Sem().Get<sem::Call>(expr);
1013 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001014 auto* ctor = call->Target()->As<sem::ValueConversion>();
Zhaoming Jiang60588822022-06-28 14:03:36 +00001015 ASSERT_NE(ctor, nullptr);
1016 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001017 ASSERT_EQ(ctor->Parameters().Length(), 1u);
dan sinclaird37ecf92022-12-08 16:39:59 +00001018 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::U32>());
Zhaoming Jiang60588822022-06-28 14:03:36 +00001019}
1020
Ben Clayton54a104e2023-02-22 20:04:40 +00001021TEST_F(ResolverValueConstructorValidationTest, Convert_f16_to_f32_Success) {
dan sinclaire4039c72023-02-17 21:58:59 +00001022 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00001023
Ben Clayton01ac21c2023-02-07 16:14:25 +00001024 auto* expr = Call<f32>(123_h);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001025 WrapInFunction(expr);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001026
dan sinclair41e4d9a2022-05-01 14:40:55 +00001027 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001028
dan sinclair41e4d9a2022-05-01 14:40:55 +00001029 ASSERT_NE(TypeOf(expr), nullptr);
dan sinclaird37ecf92022-12-08 16:39:59 +00001030 ASSERT_TRUE(TypeOf(expr)->Is<type::F32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001031
Ben Claytone5a67ac2022-05-19 21:50:59 +00001032 auto* call = Sem().Get<sem::Call>(expr);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001033 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001034 auto* ctor = call->Target()->As<sem::ValueConversion>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001035 ASSERT_NE(ctor, nullptr);
1036 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001037 ASSERT_EQ(ctor->Parameters().Length(), 1u);
dan sinclaird37ecf92022-12-08 16:39:59 +00001038 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::F16>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001039}
1040
Ben Clayton54a104e2023-02-22 20:04:40 +00001041} // namespace ScalarConstructor
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001042
Ben Clayton54a104e2023-02-22 20:04:40 +00001043namespace VectorConstructor {
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001044
Ben Clayton54a104e2023-02-22 20:04:40 +00001045TEST_F(ResolverValueConstructorValidationTest, Vec2F32_Error_ScalarArgumentTypeMismatch) {
Ben Clayton66805b02023-06-14 22:00:01 +00001046 WrapInFunction(Call<vec2<f32>>(Source{{12, 34}}, 1_i, 2_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001047
dan sinclair41e4d9a2022-05-01 14:40:55 +00001048 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001049 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001050 HasSubstr("12:34 error: no matching constructor for vec2<f32>(i32, f32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001051}
1052
Ben Clayton54a104e2023-02-22 20:04:40 +00001053TEST_F(ResolverValueConstructorValidationTest, Vec2F16_Error_ScalarArgumentTypeMismatch) {
dan sinclaire4039c72023-02-17 21:58:59 +00001054 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00001055
Ben Clayton66805b02023-06-14 22:00:01 +00001056 WrapInFunction(Call<vec2<f16>>(Source{{12, 34}}, 1_h, 2_f));
Zhaoming Jiang60588822022-06-28 14:03:36 +00001057
1058 EXPECT_FALSE(r()->Resolve());
1059 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001060 HasSubstr("12:34 error: no matching constructor for vec2<f16>(f16, f32)"));
Zhaoming Jiang60588822022-06-28 14:03:36 +00001061}
1062
Ben Clayton54a104e2023-02-22 20:04:40 +00001063TEST_F(ResolverValueConstructorValidationTest, Vec2U32_Error_ScalarArgumentTypeMismatch) {
Ben Clayton66805b02023-06-14 22:00:01 +00001064 WrapInFunction(Call<vec2<u32>>(Source{{12, 34}}, 1_u, 2_i));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001065
dan sinclair41e4d9a2022-05-01 14:40:55 +00001066 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001067 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001068 HasSubstr("12:34 error: no matching constructor for vec2<u32>(u32, i32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001069}
1070
Ben Clayton54a104e2023-02-22 20:04:40 +00001071TEST_F(ResolverValueConstructorValidationTest, Vec2I32_Error_ScalarArgumentTypeMismatch) {
Ben Clayton66805b02023-06-14 22:00:01 +00001072 WrapInFunction(Call<vec2<i32>>(Source{{12, 34}}, 1_u, 2_i));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001073
dan sinclair41e4d9a2022-05-01 14:40:55 +00001074 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001075 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001076 HasSubstr("12:34 error: no matching constructor for vec2<i32>(u32, i32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001077}
1078
Ben Clayton54a104e2023-02-22 20:04:40 +00001079TEST_F(ResolverValueConstructorValidationTest, Vec2Bool_Error_ScalarArgumentTypeMismatch) {
Ben Clayton66805b02023-06-14 22:00:01 +00001080 WrapInFunction(Call<vec2<bool>>(Source{{12, 34}}, true, 1_i));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001081
dan sinclair41e4d9a2022-05-01 14:40:55 +00001082 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001083 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001084 HasSubstr("12:34 error: no matching constructor for vec2<bool>(bool, i32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001085}
1086
Ben Clayton54a104e2023-02-22 20:04:40 +00001087TEST_F(ResolverValueConstructorValidationTest, Vec2_Error_Vec3ArgumentCardinalityTooLarge) {
Ben Clayton66805b02023-06-14 22:00:01 +00001088 WrapInFunction(Call<vec2<f32>>(Source{{12, 34}}, Call<vec3<f32>>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001089
dan sinclair41e4d9a2022-05-01 14:40:55 +00001090 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001091 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001092 HasSubstr("12:34 error: no matching constructor for vec2<f32>(vec3<f32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001093}
1094
Ben Clayton54a104e2023-02-22 20:04:40 +00001095TEST_F(ResolverValueConstructorValidationTest, Vec2_Error_Vec4ArgumentCardinalityTooLarge) {
Ben Clayton66805b02023-06-14 22:00:01 +00001096 WrapInFunction(Call<vec2<f32>>(Source{{12, 34}}, Call<vec4<f32>>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001097
dan sinclair41e4d9a2022-05-01 14:40:55 +00001098 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001099 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001100 HasSubstr("12:34 error: no matching constructor for vec2<f32>(vec4<f32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001101}
1102
Ben Clayton54a104e2023-02-22 20:04:40 +00001103TEST_F(ResolverValueConstructorValidationTest, Vec2_Error_TooManyArgumentsScalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001104 WrapInFunction(Call<vec2<f32>>(Source{{12, 34}}, 1_f, 2_f, 3_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001105
dan sinclair41e4d9a2022-05-01 14:40:55 +00001106 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001107 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001108 HasSubstr("12:34 error: no matching constructor for vec2<f32>(f32, f32, f32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001109}
1110
Ben Clayton54a104e2023-02-22 20:04:40 +00001111TEST_F(ResolverValueConstructorValidationTest, Vec2_Error_TooManyArgumentsVector) {
Ben Clayton66805b02023-06-14 22:00:01 +00001112 WrapInFunction(Call<vec2<f32>>(Source{{12, 34}}, Call<vec2<f32>>(), Call<vec2<f32>>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001113
dan sinclair41e4d9a2022-05-01 14:40:55 +00001114 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001115 EXPECT_THAT(
1116 r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001117 HasSubstr("12:34 error: no matching constructor for vec2<f32>(vec2<f32>, vec2<f32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001118}
1119
Ben Clayton54a104e2023-02-22 20:04:40 +00001120TEST_F(ResolverValueConstructorValidationTest, Vec2_Error_TooManyArgumentsVectorAndScalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001121 WrapInFunction(Call<vec2<f32>>(Source{{12, 34}}, Call<vec2<f32>>(), 1_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001122
dan sinclair41e4d9a2022-05-01 14:40:55 +00001123 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001124 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001125 HasSubstr("12:34 error: no matching constructor for vec2<f32>(vec2<f32>, f32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001126}
1127
Ben Clayton54a104e2023-02-22 20:04:40 +00001128TEST_F(ResolverValueConstructorValidationTest, Vec2_Error_InvalidArgumentType) {
Ben Clayton66805b02023-06-14 22:00:01 +00001129 WrapInFunction(Call<vec2<f32>>(Source{{12, 34}}, Call<mat2x2<f32>>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001130
dan sinclair41e4d9a2022-05-01 14:40:55 +00001131 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001132 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001133 HasSubstr("12:34 error: no matching constructor for vec2<f32>(mat2x2<f32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001134}
1135
Ben Clayton54a104e2023-02-22 20:04:40 +00001136TEST_F(ResolverValueConstructorValidationTest, Vec2_Success_ZeroValue) {
Ben Clayton66805b02023-06-14 22:00:01 +00001137 auto* tc = Call<vec2<f32>>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001138 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001139
dan sinclair41e4d9a2022-05-01 14:40:55 +00001140 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001141
dan sinclair41e4d9a2022-05-01 14:40:55 +00001142 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +00001143 ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
1144 EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
1145 EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 2u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001146
Ben Claytone5a67ac2022-05-19 21:50:59 +00001147 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001148 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001149 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001150 ASSERT_NE(ctor, nullptr);
1151 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001152 ASSERT_EQ(ctor->Parameters().Length(), 0u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001153}
1154
Ben Clayton54a104e2023-02-22 20:04:40 +00001155TEST_F(ResolverValueConstructorValidationTest, Vec2F32_Success_Scalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001156 auto* tc = Call<vec2<f32>>(1_f, 1_f);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001157 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001158
dan sinclair41e4d9a2022-05-01 14:40:55 +00001159 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001160
dan sinclair41e4d9a2022-05-01 14:40:55 +00001161 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +00001162 ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
1163 EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
1164 EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 2u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001165
Ben Claytone5a67ac2022-05-19 21:50:59 +00001166 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001167 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001168 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001169 ASSERT_NE(ctor, nullptr);
1170 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001171 ASSERT_EQ(ctor->Parameters().Length(), 2u);
dan sinclaird37ecf92022-12-08 16:39:59 +00001172 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::F32>());
1173 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::F32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001174}
1175
Ben Clayton54a104e2023-02-22 20:04:40 +00001176TEST_F(ResolverValueConstructorValidationTest, Vec2F16_Success_Scalar) {
dan sinclaire4039c72023-02-17 21:58:59 +00001177 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00001178
Ben Clayton66805b02023-06-14 22:00:01 +00001179 auto* tc = Call<vec2<f16>>(1_h, 1_h);
Zhaoming Jiang60588822022-06-28 14:03:36 +00001180 WrapInFunction(tc);
1181
1182 ASSERT_TRUE(r()->Resolve()) << r()->error();
1183
1184 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +00001185 ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
1186 EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F16>());
1187 EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 2u);
Zhaoming Jiang60588822022-06-28 14:03:36 +00001188
1189 auto* call = Sem().Get<sem::Call>(tc);
1190 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001191 auto* ctor = call->Target()->As<sem::ValueConstructor>();
Zhaoming Jiang60588822022-06-28 14:03:36 +00001192 ASSERT_NE(ctor, nullptr);
1193 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001194 ASSERT_EQ(ctor->Parameters().Length(), 2u);
dan sinclaird37ecf92022-12-08 16:39:59 +00001195 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::F16>());
1196 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::F16>());
Zhaoming Jiang60588822022-06-28 14:03:36 +00001197}
1198
Ben Clayton54a104e2023-02-22 20:04:40 +00001199TEST_F(ResolverValueConstructorValidationTest, Vec2U32_Success_Scalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001200 auto* tc = Call<vec2<u32>>(1_u, 1_u);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001201 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001202
dan sinclair41e4d9a2022-05-01 14:40:55 +00001203 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001204
dan sinclair41e4d9a2022-05-01 14:40:55 +00001205 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +00001206 ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
1207 EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::U32>());
1208 EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 2u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001209
Ben Claytone5a67ac2022-05-19 21:50:59 +00001210 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001211 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001212 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001213 ASSERT_NE(ctor, nullptr);
1214 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001215 ASSERT_EQ(ctor->Parameters().Length(), 2u);
dan sinclaird37ecf92022-12-08 16:39:59 +00001216 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::U32>());
1217 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::U32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001218}
1219
Ben Clayton54a104e2023-02-22 20:04:40 +00001220TEST_F(ResolverValueConstructorValidationTest, Vec2I32_Success_Scalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001221 auto* tc = Call<vec2<i32>>(1_i, 1_i);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001222 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001223
dan sinclair41e4d9a2022-05-01 14:40:55 +00001224 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001225
dan sinclair41e4d9a2022-05-01 14:40:55 +00001226 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +00001227 ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
1228 EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::I32>());
1229 EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 2u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001230
Ben Claytone5a67ac2022-05-19 21:50:59 +00001231 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001232 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001233 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001234 ASSERT_NE(ctor, nullptr);
1235 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001236 ASSERT_EQ(ctor->Parameters().Length(), 2u);
dan sinclaird37ecf92022-12-08 16:39:59 +00001237 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::I32>());
1238 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001239}
1240
Ben Clayton54a104e2023-02-22 20:04:40 +00001241TEST_F(ResolverValueConstructorValidationTest, Vec2Bool_Success_Scalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001242 auto* tc = Call<vec2<bool>>(true, false);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001243 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001244
dan sinclair41e4d9a2022-05-01 14:40:55 +00001245 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001246
dan sinclair41e4d9a2022-05-01 14:40:55 +00001247 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +00001248 ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
1249 EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::Bool>());
1250 EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 2u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001251
Ben Claytone5a67ac2022-05-19 21:50:59 +00001252 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001253 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001254 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001255 ASSERT_NE(ctor, nullptr);
1256 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001257 ASSERT_EQ(ctor->Parameters().Length(), 2u);
dan sinclaird37ecf92022-12-08 16:39:59 +00001258 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::Bool>());
1259 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::Bool>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001260}
1261
Ben Clayton54a104e2023-02-22 20:04:40 +00001262TEST_F(ResolverValueConstructorValidationTest, Vec2_Success_Identity) {
Ben Clayton66805b02023-06-14 22:00:01 +00001263 auto* tc = Call<vec2<f32>>(Call<vec2<f32>>());
dan sinclair41e4d9a2022-05-01 14:40:55 +00001264 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001265
dan sinclair41e4d9a2022-05-01 14:40:55 +00001266 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001267
dan sinclair41e4d9a2022-05-01 14:40:55 +00001268 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +00001269 ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
1270 EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
1271 EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 2u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001272
Ben Claytone5a67ac2022-05-19 21:50:59 +00001273 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001274 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001275 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001276 ASSERT_NE(ctor, nullptr);
1277 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001278 ASSERT_EQ(ctor->Parameters().Length(), 1u);
dan sinclair0e780da2022-12-08 22:21:24 +00001279 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::Vector>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001280}
1281
Ben Clayton54a104e2023-02-22 20:04:40 +00001282TEST_F(ResolverValueConstructorValidationTest, Vec2_Success_Vec2TypeConversion) {
Ben Clayton66805b02023-06-14 22:00:01 +00001283 auto* tc = Call<vec2<f32>>(Call<vec2<i32>>());
dan sinclair41e4d9a2022-05-01 14:40:55 +00001284 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001285
dan sinclair41e4d9a2022-05-01 14:40:55 +00001286 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001287
dan sinclair41e4d9a2022-05-01 14:40:55 +00001288 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +00001289 ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
1290 EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
1291 EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 2u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001292
Ben Claytone5a67ac2022-05-19 21:50:59 +00001293 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001294 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001295 auto* ctor = call->Target()->As<sem::ValueConversion>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001296 ASSERT_NE(ctor, nullptr);
1297 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001298 ASSERT_EQ(ctor->Parameters().Length(), 1u);
dan sinclair0e780da2022-12-08 22:21:24 +00001299 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::Vector>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001300}
1301
Ben Clayton54a104e2023-02-22 20:04:40 +00001302TEST_F(ResolverValueConstructorValidationTest, Vec3F32_Error_ScalarArgumentTypeMismatch) {
Ben Clayton66805b02023-06-14 22:00:01 +00001303 WrapInFunction(Call<vec3<f32>>(Source{{12, 34}}, 1_f, 2_f, 3_i));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001304
dan sinclair41e4d9a2022-05-01 14:40:55 +00001305 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001306 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001307 HasSubstr("12:34 error: no matching constructor for vec3<f32>(f32, f32, i32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001308}
1309
Ben Clayton54a104e2023-02-22 20:04:40 +00001310TEST_F(ResolverValueConstructorValidationTest, Vec3F16_Error_ScalarArgumentTypeMismatch) {
dan sinclaire4039c72023-02-17 21:58:59 +00001311 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00001312
Ben Clayton66805b02023-06-14 22:00:01 +00001313 WrapInFunction(Call<vec3<f16>>(Source{{12, 34}}, 1_h, 2_h, 3_f));
Zhaoming Jiang60588822022-06-28 14:03:36 +00001314
1315 EXPECT_FALSE(r()->Resolve());
1316 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001317 HasSubstr("12:34 error: no matching constructor for vec3<f16>(f16, f16, f32)"));
Zhaoming Jiang60588822022-06-28 14:03:36 +00001318}
1319
Ben Clayton54a104e2023-02-22 20:04:40 +00001320TEST_F(ResolverValueConstructorValidationTest, Vec3U32_Error_ScalarArgumentTypeMismatch) {
Ben Clayton66805b02023-06-14 22:00:01 +00001321 WrapInFunction(Call<vec3<u32>>(Source{{12, 34}}, 1_u, 2_i, 3_u));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001322
dan sinclair41e4d9a2022-05-01 14:40:55 +00001323 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001324 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001325 HasSubstr("12:34 error: no matching constructor for vec3<u32>(u32, i32, u32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001326}
1327
Ben Clayton54a104e2023-02-22 20:04:40 +00001328TEST_F(ResolverValueConstructorValidationTest, Vec3I32_Error_ScalarArgumentTypeMismatch) {
Ben Clayton66805b02023-06-14 22:00:01 +00001329 WrapInFunction(Call<vec3<i32>>(Source{{12, 34}}, 1_i, 2_u, 3_i));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001330
dan sinclair41e4d9a2022-05-01 14:40:55 +00001331 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001332 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001333 HasSubstr("12:34 error: no matching constructor for vec3<i32>(i32, u32, i32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001334}
1335
Ben Clayton54a104e2023-02-22 20:04:40 +00001336TEST_F(ResolverValueConstructorValidationTest, Vec3Bool_Error_ScalarArgumentTypeMismatch) {
Ben Clayton66805b02023-06-14 22:00:01 +00001337 WrapInFunction(Call<vec3<bool>>(Source{{12, 34}}, false, 1_i, true));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001338
dan sinclair41e4d9a2022-05-01 14:40:55 +00001339 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001340 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001341 HasSubstr("12:34 error: no matching constructor for vec3<bool>(bool, i32, bool)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001342}
1343
Ben Clayton54a104e2023-02-22 20:04:40 +00001344TEST_F(ResolverValueConstructorValidationTest, Vec3_Error_Vec4ArgumentCardinalityTooLarge) {
Ben Clayton66805b02023-06-14 22:00:01 +00001345 WrapInFunction(Call<vec3<f32>>(Source{{12, 34}}, Call<vec4<f32>>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001346
dan sinclair41e4d9a2022-05-01 14:40:55 +00001347 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001348 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001349 HasSubstr("12:34 error: no matching constructor for vec3<f32>(vec4<f32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001350}
1351
Ben Clayton54a104e2023-02-22 20:04:40 +00001352TEST_F(ResolverValueConstructorValidationTest, Vec3_Error_TooFewArgumentsScalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001353 WrapInFunction(Call<vec3<f32>>(Source{{12, 34}}, 1_f, 2_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001354
dan sinclair41e4d9a2022-05-01 14:40:55 +00001355 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001356 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001357 HasSubstr("12:34 error: no matching constructor for vec3<f32>(f32, f32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001358}
1359
Ben Clayton54a104e2023-02-22 20:04:40 +00001360TEST_F(ResolverValueConstructorValidationTest, Vec3_Error_TooManyArgumentsScalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001361 WrapInFunction(Call<vec3<f32>>(Source{{12, 34}}, 1_f, 2_f, 3_f, 4_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001362
dan sinclair41e4d9a2022-05-01 14:40:55 +00001363 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001364 EXPECT_THAT(
1365 r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001366 HasSubstr("12:34 error: no matching constructor for vec3<f32>(f32, f32, f32, f32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001367}
1368
Ben Clayton54a104e2023-02-22 20:04:40 +00001369TEST_F(ResolverValueConstructorValidationTest, Vec3_Error_TooFewArgumentsVec2) {
Ben Clayton66805b02023-06-14 22:00:01 +00001370 WrapInFunction(Call<vec3<f32>>(Source{{12, 34}}, Call<vec2<f32>>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001371
dan sinclair41e4d9a2022-05-01 14:40:55 +00001372 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001373 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001374 HasSubstr("12:34 error: no matching constructor for vec3<f32>(vec2<f32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001375}
1376
Ben Clayton54a104e2023-02-22 20:04:40 +00001377TEST_F(ResolverValueConstructorValidationTest, Vec3_Error_TooManyArgumentsVec2) {
Ben Clayton66805b02023-06-14 22:00:01 +00001378 WrapInFunction(Call<vec3<f32>>(Source{{12, 34}}, Call<vec2<f32>>(), Call<vec2<f32>>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001379
dan sinclair41e4d9a2022-05-01 14:40:55 +00001380 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001381 EXPECT_THAT(
1382 r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001383 HasSubstr("12:34 error: no matching constructor for vec3<f32>(vec2<f32>, vec2<f32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001384}
1385
Ben Clayton54a104e2023-02-22 20:04:40 +00001386TEST_F(ResolverValueConstructorValidationTest, Vec3_Error_TooManyArgumentsVec2AndScalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001387 WrapInFunction(Call<vec3<f32>>(Source{{12, 34}}, Call<vec2<f32>>(), 1_f, 1_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001388
dan sinclair41e4d9a2022-05-01 14:40:55 +00001389 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001390 EXPECT_THAT(
1391 r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001392 HasSubstr("12:34 error: no matching constructor for vec3<f32>(vec2<f32>, f32, f32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001393}
1394
Ben Clayton54a104e2023-02-22 20:04:40 +00001395TEST_F(ResolverValueConstructorValidationTest, Vec3_Error_TooManyArgumentsVec3) {
Ben Clayton66805b02023-06-14 22:00:01 +00001396 WrapInFunction(Call<vec3<f32>>(Source{{12, 34}}, Call<vec3<f32>>(), 1_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001397
dan sinclair41e4d9a2022-05-01 14:40:55 +00001398 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001399 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001400 HasSubstr("12:34 error: no matching constructor for vec3<f32>(vec3<f32>, f32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001401}
1402
Ben Clayton54a104e2023-02-22 20:04:40 +00001403TEST_F(ResolverValueConstructorValidationTest, Vec3_Error_InvalidArgumentType) {
Ben Clayton66805b02023-06-14 22:00:01 +00001404 WrapInFunction(Call<vec3<f32>>(Source{{12, 34}}, Call<mat2x2<f32>>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001405
dan sinclair41e4d9a2022-05-01 14:40:55 +00001406 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001407 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001408 HasSubstr("12:34 error: no matching constructor for vec3<f32>(mat2x2<f32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001409}
1410
Ben Clayton54a104e2023-02-22 20:04:40 +00001411TEST_F(ResolverValueConstructorValidationTest, Vec3_Success_ZeroValue) {
Ben Clayton66805b02023-06-14 22:00:01 +00001412 auto* tc = Call<vec3<f32>>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001413 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001414
dan sinclair41e4d9a2022-05-01 14:40:55 +00001415 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001416
dan sinclair41e4d9a2022-05-01 14:40:55 +00001417 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +00001418 ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
1419 EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
1420 EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 3u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001421
Ben Claytone5a67ac2022-05-19 21:50:59 +00001422 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001423 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001424 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001425 ASSERT_NE(ctor, nullptr);
1426 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001427 ASSERT_EQ(ctor->Parameters().Length(), 0u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001428}
1429
Ben Clayton54a104e2023-02-22 20:04:40 +00001430TEST_F(ResolverValueConstructorValidationTest, Vec3F32_Success_Scalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001431 auto* tc = Call<vec3<f32>>(1_f, 1_f, 1_f);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001432 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001433
dan sinclair41e4d9a2022-05-01 14:40:55 +00001434 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001435
dan sinclair41e4d9a2022-05-01 14:40:55 +00001436 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +00001437 ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
1438 EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
1439 EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 3u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001440
Ben Claytone5a67ac2022-05-19 21:50:59 +00001441 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001442 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001443 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001444 ASSERT_NE(ctor, nullptr);
1445 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001446 ASSERT_EQ(ctor->Parameters().Length(), 3u);
dan sinclaird37ecf92022-12-08 16:39:59 +00001447 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::F32>());
1448 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::F32>());
1449 EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::F32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001450}
1451
Ben Clayton54a104e2023-02-22 20:04:40 +00001452TEST_F(ResolverValueConstructorValidationTest, Vec3F16_Success_Scalar) {
dan sinclaire4039c72023-02-17 21:58:59 +00001453 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00001454
Ben Clayton66805b02023-06-14 22:00:01 +00001455 auto* tc = Call<vec3<f16>>(1_h, 1_h, 1_h);
Zhaoming Jiang60588822022-06-28 14:03:36 +00001456 WrapInFunction(tc);
1457
1458 ASSERT_TRUE(r()->Resolve()) << r()->error();
1459
1460 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +00001461 ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
1462 EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F16>());
1463 EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 3u);
Zhaoming Jiang60588822022-06-28 14:03:36 +00001464
1465 auto* call = Sem().Get<sem::Call>(tc);
1466 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001467 auto* ctor = call->Target()->As<sem::ValueConstructor>();
Zhaoming Jiang60588822022-06-28 14:03:36 +00001468 ASSERT_NE(ctor, nullptr);
1469 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001470 ASSERT_EQ(ctor->Parameters().Length(), 3u);
dan sinclaird37ecf92022-12-08 16:39:59 +00001471 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::F16>());
1472 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::F16>());
1473 EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::F16>());
Zhaoming Jiang60588822022-06-28 14:03:36 +00001474}
1475
Ben Clayton54a104e2023-02-22 20:04:40 +00001476TEST_F(ResolverValueConstructorValidationTest, Vec3U32_Success_Scalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001477 auto* tc = Call<vec3<u32>>(1_u, 1_u, 1_u);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001478 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001479
dan sinclair41e4d9a2022-05-01 14:40:55 +00001480 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001481
dan sinclair41e4d9a2022-05-01 14:40:55 +00001482 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +00001483 ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
1484 EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::U32>());
1485 EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 3u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001486
Ben Claytone5a67ac2022-05-19 21:50:59 +00001487 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001488 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001489 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001490 ASSERT_NE(ctor, nullptr);
1491 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001492 ASSERT_EQ(ctor->Parameters().Length(), 3u);
dan sinclaird37ecf92022-12-08 16:39:59 +00001493 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::U32>());
1494 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::U32>());
1495 EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::U32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001496}
1497
Ben Clayton54a104e2023-02-22 20:04:40 +00001498TEST_F(ResolverValueConstructorValidationTest, Vec3I32_Success_Scalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001499 auto* tc = Call<vec3<i32>>(1_i, 1_i, 1_i);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001500 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001501
dan sinclair41e4d9a2022-05-01 14:40:55 +00001502 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001503
dan sinclair41e4d9a2022-05-01 14:40:55 +00001504 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +00001505 ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
1506 EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::I32>());
1507 EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 3u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001508
Ben Claytone5a67ac2022-05-19 21:50:59 +00001509 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001510 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001511 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001512 ASSERT_NE(ctor, nullptr);
1513 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001514 ASSERT_EQ(ctor->Parameters().Length(), 3u);
dan sinclaird37ecf92022-12-08 16:39:59 +00001515 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::I32>());
1516 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>());
1517 EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::I32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001518}
1519
Ben Clayton54a104e2023-02-22 20:04:40 +00001520TEST_F(ResolverValueConstructorValidationTest, Vec3Bool_Success_Scalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001521 auto* tc = Call<vec3<bool>>(true, false, true);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001522 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001523
dan sinclair41e4d9a2022-05-01 14:40:55 +00001524 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001525
dan sinclair41e4d9a2022-05-01 14:40:55 +00001526 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +00001527 ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
1528 EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::Bool>());
1529 EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 3u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001530
Ben Claytone5a67ac2022-05-19 21:50:59 +00001531 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001532 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001533 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001534 ASSERT_NE(ctor, nullptr);
1535 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001536 ASSERT_EQ(ctor->Parameters().Length(), 3u);
dan sinclaird37ecf92022-12-08 16:39:59 +00001537 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::Bool>());
1538 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::Bool>());
1539 EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::Bool>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001540}
1541
Ben Clayton54a104e2023-02-22 20:04:40 +00001542TEST_F(ResolverValueConstructorValidationTest, Vec3_Success_Vec2AndScalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001543 auto* tc = Call<vec3<f32>>(Call<vec2<f32>>(), 1_f);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001544 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001545
dan sinclair41e4d9a2022-05-01 14:40:55 +00001546 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001547
dan sinclair41e4d9a2022-05-01 14:40:55 +00001548 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +00001549 ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
1550 EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
1551 EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 3u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001552
Ben Claytone5a67ac2022-05-19 21:50:59 +00001553 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001554 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001555 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001556 ASSERT_NE(ctor, nullptr);
1557 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001558 ASSERT_EQ(ctor->Parameters().Length(), 2u);
dan sinclair0e780da2022-12-08 22:21:24 +00001559 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::Vector>());
dan sinclaird37ecf92022-12-08 16:39:59 +00001560 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::F32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001561}
1562
Ben Clayton54a104e2023-02-22 20:04:40 +00001563TEST_F(ResolverValueConstructorValidationTest, Vec3_Success_ScalarAndVec2) {
Ben Clayton66805b02023-06-14 22:00:01 +00001564 auto* tc = Call<vec3<f32>>(1_f, Call<vec2<f32>>());
dan sinclair41e4d9a2022-05-01 14:40:55 +00001565 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001566
dan sinclair41e4d9a2022-05-01 14:40:55 +00001567 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001568
dan sinclair41e4d9a2022-05-01 14:40:55 +00001569 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +00001570 ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
1571 EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
1572 EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 3u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001573
Ben Claytone5a67ac2022-05-19 21:50:59 +00001574 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001575 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001576 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001577 ASSERT_NE(ctor, nullptr);
1578 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001579 ASSERT_EQ(ctor->Parameters().Length(), 2u);
dan sinclaird37ecf92022-12-08 16:39:59 +00001580 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::F32>());
dan sinclair0e780da2022-12-08 22:21:24 +00001581 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::Vector>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001582}
1583
Ben Clayton54a104e2023-02-22 20:04:40 +00001584TEST_F(ResolverValueConstructorValidationTest, Vec3_Success_Identity) {
Ben Clayton66805b02023-06-14 22:00:01 +00001585 auto* tc = Call<vec3<f32>>(Call<vec3<f32>>());
dan sinclair41e4d9a2022-05-01 14:40:55 +00001586 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001587
dan sinclair41e4d9a2022-05-01 14:40:55 +00001588 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001589
dan sinclair41e4d9a2022-05-01 14:40:55 +00001590 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +00001591 ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
1592 EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
1593 EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 3u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001594
Ben Claytone5a67ac2022-05-19 21:50:59 +00001595 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001596 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001597 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001598 ASSERT_NE(ctor, nullptr);
1599 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001600 ASSERT_EQ(ctor->Parameters().Length(), 1u);
dan sinclair0e780da2022-12-08 22:21:24 +00001601 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::Vector>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001602}
1603
Ben Clayton54a104e2023-02-22 20:04:40 +00001604TEST_F(ResolverValueConstructorValidationTest, Vec3_Success_Vec3TypeConversion) {
Ben Clayton66805b02023-06-14 22:00:01 +00001605 auto* tc = Call<vec3<f32>>(Call<vec3<i32>>());
dan sinclair41e4d9a2022-05-01 14:40:55 +00001606 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001607
dan sinclair41e4d9a2022-05-01 14:40:55 +00001608 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001609
dan sinclair41e4d9a2022-05-01 14:40:55 +00001610 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +00001611 ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
1612 EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
1613 EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 3u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001614
Ben Claytone5a67ac2022-05-19 21:50:59 +00001615 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001616 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001617 auto* ctor = call->Target()->As<sem::ValueConversion>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001618 ASSERT_NE(ctor, nullptr);
1619 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001620 ASSERT_EQ(ctor->Parameters().Length(), 1u);
dan sinclair0e780da2022-12-08 22:21:24 +00001621 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::Vector>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001622}
1623
Ben Clayton54a104e2023-02-22 20:04:40 +00001624TEST_F(ResolverValueConstructorValidationTest, Vec4F32_Error_ScalarArgumentTypeMismatch) {
Ben Clayton66805b02023-06-14 22:00:01 +00001625 WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, 1_f, 1_f, 1_i, 1_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001626
dan sinclair41e4d9a2022-05-01 14:40:55 +00001627 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001628 EXPECT_THAT(
1629 r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001630 HasSubstr("12:34 error: no matching constructor for vec4<f32>(f32, f32, i32, f32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001631}
1632
Ben Clayton54a104e2023-02-22 20:04:40 +00001633TEST_F(ResolverValueConstructorValidationTest, Vec4F16_Error_ScalarArgumentTypeMismatch) {
dan sinclaire4039c72023-02-17 21:58:59 +00001634 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00001635
Ben Clayton66805b02023-06-14 22:00:01 +00001636 WrapInFunction(Call<vec4<f16>>(Source{{12, 34}}, 1_h, 1_h, 1_f, 1_h));
Zhaoming Jiang60588822022-06-28 14:03:36 +00001637
1638 EXPECT_FALSE(r()->Resolve());
1639 EXPECT_THAT(
1640 r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001641 HasSubstr("12:34 error: no matching constructor for vec4<f16>(f16, f16, f32, f16)"));
Zhaoming Jiang60588822022-06-28 14:03:36 +00001642}
1643
Ben Clayton54a104e2023-02-22 20:04:40 +00001644TEST_F(ResolverValueConstructorValidationTest, Vec4U32_Error_ScalarArgumentTypeMismatch) {
Ben Clayton66805b02023-06-14 22:00:01 +00001645 WrapInFunction(Call<vec4<u32>>(Source{{12, 34}}, 1_u, 1_u, 1_i, 1_u));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001646
dan sinclair41e4d9a2022-05-01 14:40:55 +00001647 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001648 EXPECT_THAT(
1649 r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001650 HasSubstr("12:34 error: no matching constructor for vec4<u32>(u32, u32, i32, u32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001651}
1652
Ben Clayton54a104e2023-02-22 20:04:40 +00001653TEST_F(ResolverValueConstructorValidationTest, Vec4I32_Error_ScalarArgumentTypeMismatch) {
Ben Clayton66805b02023-06-14 22:00:01 +00001654 WrapInFunction(Call<vec4<i32>>(Source{{12, 34}}, 1_i, 1_i, 1_u, 1_i));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001655
dan sinclair41e4d9a2022-05-01 14:40:55 +00001656 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001657 EXPECT_THAT(
1658 r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001659 HasSubstr("12:34 error: no matching constructor for vec4<i32>(i32, i32, u32, i32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001660}
1661
Ben Clayton54a104e2023-02-22 20:04:40 +00001662TEST_F(ResolverValueConstructorValidationTest, Vec4Bool_Error_ScalarArgumentTypeMismatch) {
Ben Clayton66805b02023-06-14 22:00:01 +00001663 WrapInFunction(Call<vec4<bool>>(Source{{12, 34}}, true, false, 1_i, true));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001664
dan sinclair41e4d9a2022-05-01 14:40:55 +00001665 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001666 EXPECT_THAT(
1667 r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001668 HasSubstr("12:34 error: no matching constructor for vec4<bool>(bool, bool, i32, bool)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001669}
1670
Ben Clayton54a104e2023-02-22 20:04:40 +00001671TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_TooFewArgumentsScalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001672 WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, 1_f, 2_f, 3_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001673
dan sinclair41e4d9a2022-05-01 14:40:55 +00001674 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001675 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001676 HasSubstr("12:34 error: no matching constructor for vec4<f32>(f32, f32, f32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001677}
1678
Ben Clayton54a104e2023-02-22 20:04:40 +00001679TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_TooManyArgumentsScalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001680 WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, 1_f, 2_f, 3_f, 4_f, 5_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001681
dan sinclair41e4d9a2022-05-01 14:40:55 +00001682 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001683 EXPECT_THAT(
1684 r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001685 HasSubstr("12:34 error: no matching constructor for vec4<f32>(f32, f32, f32, f32, f32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001686}
1687
Ben Clayton54a104e2023-02-22 20:04:40 +00001688TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_TooFewArgumentsVec2AndScalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001689 WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, Call<vec2<f32>>(), 1_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001690
dan sinclair41e4d9a2022-05-01 14:40:55 +00001691 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001692 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001693 HasSubstr("12:34 error: no matching constructor for vec4<f32>(vec2<f32>, f32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001694}
1695
Ben Clayton54a104e2023-02-22 20:04:40 +00001696TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_TooManyArgumentsVec2AndScalars) {
Ben Clayton66805b02023-06-14 22:00:01 +00001697 WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, Call<vec2<f32>>(), 1_f, 2_f, 3_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001698
dan sinclair41e4d9a2022-05-01 14:40:55 +00001699 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001700 EXPECT_THAT(
1701 r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001702 HasSubstr("12:34 error: no matching constructor for vec4<f32>(vec2<f32>, f32, f32, f32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001703}
1704
Ben Clayton54a104e2023-02-22 20:04:40 +00001705TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_TooManyArgumentsVec2Vec2Scalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001706 WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, Call<vec2<f32>>(), Call<vec2<f32>>(), 1_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001707
dan sinclair41e4d9a2022-05-01 14:40:55 +00001708 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001709 EXPECT_THAT(
1710 r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001711 HasSubstr("12:34 error: no matching constructor for vec4<f32>(vec2<f32>, vec2<f32>, f32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001712}
1713
Ben Clayton54a104e2023-02-22 20:04:40 +00001714TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_TooManyArgumentsVec2Vec2Vec2) {
Ben Clayton66805b02023-06-14 22:00:01 +00001715 WrapInFunction(
1716 Call<vec4<f32>>(Source{{12, 34}}, Call<vec2<f32>>(), Call<vec2<f32>>(), Call<vec2<f32>>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001717
dan sinclair41e4d9a2022-05-01 14:40:55 +00001718 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001719 EXPECT_THAT(
1720 r()->error(),
1721 HasSubstr(
Ben Clayton54a104e2023-02-22 20:04:40 +00001722 "12:34 error: no matching constructor for vec4<f32>(vec2<f32>, vec2<f32>, vec2<f32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001723}
1724
Ben Clayton54a104e2023-02-22 20:04:40 +00001725TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_TooFewArgumentsVec3) {
Ben Clayton66805b02023-06-14 22:00:01 +00001726 WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, Call<vec3<f32>>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001727
dan sinclair41e4d9a2022-05-01 14:40:55 +00001728 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001729 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001730 HasSubstr("12:34 error: no matching constructor for vec4<f32>(vec3<f32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001731}
1732
Ben Clayton54a104e2023-02-22 20:04:40 +00001733TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_TooManyArgumentsVec3AndScalars) {
Ben Clayton66805b02023-06-14 22:00:01 +00001734 WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, Call<vec3<f32>>(), 1_f, 2_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001735
dan sinclair41e4d9a2022-05-01 14:40:55 +00001736 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001737 EXPECT_THAT(
1738 r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001739 HasSubstr("12:34 error: no matching constructor for vec4<f32>(vec3<f32>, f32, f32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001740}
1741
Ben Clayton54a104e2023-02-22 20:04:40 +00001742TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_TooManyArgumentsVec3AndVec2) {
Ben Clayton66805b02023-06-14 22:00:01 +00001743 WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, Call<vec3<f32>>(), Call<vec2<f32>>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001744
dan sinclair41e4d9a2022-05-01 14:40:55 +00001745 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001746 EXPECT_THAT(
1747 r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001748 HasSubstr("12:34 error: no matching constructor for vec4<f32>(vec3<f32>, vec2<f32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001749}
1750
Ben Clayton54a104e2023-02-22 20:04:40 +00001751TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_TooManyArgumentsVec2AndVec3) {
Ben Clayton66805b02023-06-14 22:00:01 +00001752 WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, Call<vec2<f32>>(), Call<vec3<f32>>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001753
dan sinclair41e4d9a2022-05-01 14:40:55 +00001754 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001755 EXPECT_THAT(
1756 r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001757 HasSubstr("12:34 error: no matching constructor for vec4<f32>(vec2<f32>, vec3<f32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001758}
1759
Ben Clayton54a104e2023-02-22 20:04:40 +00001760TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_TooManyArgumentsVec3AndVec3) {
Ben Clayton66805b02023-06-14 22:00:01 +00001761 WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, Call<vec3<f32>>(), Call<vec3<f32>>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001762
dan sinclair41e4d9a2022-05-01 14:40:55 +00001763 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001764 EXPECT_THAT(
1765 r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001766 HasSubstr("12:34 error: no matching constructor for vec4<f32>(vec3<f32>, vec3<f32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001767}
1768
Ben Clayton54a104e2023-02-22 20:04:40 +00001769TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_InvalidArgumentType) {
Ben Clayton66805b02023-06-14 22:00:01 +00001770 WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, Call<mat2x2<f32>>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001771
dan sinclair41e4d9a2022-05-01 14:40:55 +00001772 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001773 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001774 HasSubstr("12:34 error: no matching constructor for vec4<f32>(mat2x2<f32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001775}
1776
Ben Clayton54a104e2023-02-22 20:04:40 +00001777TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_ZeroValue) {
Ben Clayton66805b02023-06-14 22:00:01 +00001778 auto* tc = Call<vec4<f32>>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001779 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001780
dan sinclair41e4d9a2022-05-01 14:40:55 +00001781 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001782
dan sinclair41e4d9a2022-05-01 14:40:55 +00001783 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +00001784 ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
1785 EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
1786 EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001787}
1788
Ben Clayton54a104e2023-02-22 20:04:40 +00001789TEST_F(ResolverValueConstructorValidationTest, Vec4F32_Success_Scalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001790 auto* tc = Call<vec4<f32>>(1_f, 1_f, 1_f, 1_f);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001791 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001792
dan sinclair41e4d9a2022-05-01 14:40:55 +00001793 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001794
dan sinclair41e4d9a2022-05-01 14:40:55 +00001795 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +00001796 ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
1797 EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
1798 EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001799}
1800
Ben Clayton54a104e2023-02-22 20:04:40 +00001801TEST_F(ResolverValueConstructorValidationTest, Vec4F16_Success_Scalar) {
dan sinclaire4039c72023-02-17 21:58:59 +00001802 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00001803
Ben Clayton66805b02023-06-14 22:00:01 +00001804 auto* tc = Call<vec4<f16>>(1_h, 1_h, 1_h, 1_h);
Zhaoming Jiang60588822022-06-28 14:03:36 +00001805 WrapInFunction(tc);
1806
1807 ASSERT_TRUE(r()->Resolve()) << r()->error();
1808
1809 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +00001810 ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
1811 EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F16>());
1812 EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 4u);
Zhaoming Jiang60588822022-06-28 14:03:36 +00001813}
1814
Ben Clayton54a104e2023-02-22 20:04:40 +00001815TEST_F(ResolverValueConstructorValidationTest, Vec4U32_Success_Scalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001816 auto* tc = Call<vec4<u32>>(1_u, 1_u, 1_u, 1_u);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001817 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001818
dan sinclair41e4d9a2022-05-01 14:40:55 +00001819 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001820
dan sinclair41e4d9a2022-05-01 14:40:55 +00001821 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +00001822 ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
1823 EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::U32>());
1824 EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001825}
1826
Ben Clayton54a104e2023-02-22 20:04:40 +00001827TEST_F(ResolverValueConstructorValidationTest, Vec4I32_Success_Scalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001828 auto* tc = Call<vec4<i32>>(1_i, 1_i, 1_i, 1_i);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001829 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001830
dan sinclair41e4d9a2022-05-01 14:40:55 +00001831 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001832
dan sinclair41e4d9a2022-05-01 14:40:55 +00001833 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +00001834 ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
1835 EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::I32>());
1836 EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001837}
1838
Ben Clayton54a104e2023-02-22 20:04:40 +00001839TEST_F(ResolverValueConstructorValidationTest, Vec4Bool_Success_Scalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001840 auto* tc = Call<vec4<bool>>(true, false, true, false);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001841 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001842
dan sinclair41e4d9a2022-05-01 14:40:55 +00001843 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001844
dan sinclair41e4d9a2022-05-01 14:40:55 +00001845 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +00001846 ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
1847 EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::Bool>());
1848 EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001849}
1850
Ben Clayton54a104e2023-02-22 20:04:40 +00001851TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_Vec2ScalarScalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001852 auto* tc = Call<vec4<f32>>(Call<vec2<f32>>(), 1_f, 1_f);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001853 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001854
dan sinclair41e4d9a2022-05-01 14:40:55 +00001855 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001856
dan sinclair41e4d9a2022-05-01 14:40:55 +00001857 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +00001858 ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
1859 EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
1860 EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001861}
1862
Ben Clayton54a104e2023-02-22 20:04:40 +00001863TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_ScalarVec2Scalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001864 auto* tc = Call<vec4<f32>>(1_f, Call<vec2<f32>>(), 1_f);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001865 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001866
dan sinclair41e4d9a2022-05-01 14:40:55 +00001867 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001868
dan sinclair41e4d9a2022-05-01 14:40:55 +00001869 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +00001870 ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
1871 EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
1872 EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001873}
1874
Ben Clayton54a104e2023-02-22 20:04:40 +00001875TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_ScalarScalarVec2) {
Ben Clayton66805b02023-06-14 22:00:01 +00001876 auto* tc = Call<vec4<f32>>(1_f, 1_f, Call<vec2<f32>>());
dan sinclair41e4d9a2022-05-01 14:40:55 +00001877 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001878
dan sinclair41e4d9a2022-05-01 14:40:55 +00001879 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001880
dan sinclair41e4d9a2022-05-01 14:40:55 +00001881 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +00001882 ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
1883 EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
1884 EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001885}
1886
Ben Clayton54a104e2023-02-22 20:04:40 +00001887TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_Vec2AndVec2) {
Ben Clayton66805b02023-06-14 22:00:01 +00001888 auto* tc = Call<vec4<f32>>(Call<vec2<f32>>(), Call<vec2<f32>>());
dan sinclair41e4d9a2022-05-01 14:40:55 +00001889 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001890
dan sinclair41e4d9a2022-05-01 14:40:55 +00001891 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001892
dan sinclair41e4d9a2022-05-01 14:40:55 +00001893 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +00001894 ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
1895 EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
1896 EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001897}
1898
Ben Clayton54a104e2023-02-22 20:04:40 +00001899TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_Vec3AndScalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001900 auto* tc = Call<vec4<f32>>(Call<vec3<f32>>(), 1_f);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001901 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001902
dan sinclair41e4d9a2022-05-01 14:40:55 +00001903 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001904
dan sinclair41e4d9a2022-05-01 14:40:55 +00001905 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +00001906 ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
1907 EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
1908 EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001909}
1910
Ben Clayton54a104e2023-02-22 20:04:40 +00001911TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_ScalarAndVec3) {
Ben Clayton66805b02023-06-14 22:00:01 +00001912 auto* tc = Call<vec4<f32>>(1_f, Call<vec3<f32>>());
dan sinclair41e4d9a2022-05-01 14:40:55 +00001913 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001914
dan sinclair41e4d9a2022-05-01 14:40:55 +00001915 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001916
dan sinclair41e4d9a2022-05-01 14:40:55 +00001917 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +00001918 ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
1919 EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
1920 EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001921}
1922
Ben Clayton54a104e2023-02-22 20:04:40 +00001923TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_Identity) {
Ben Clayton66805b02023-06-14 22:00:01 +00001924 auto* tc = Call<vec4<f32>>(Call<vec4<f32>>());
dan sinclair41e4d9a2022-05-01 14:40:55 +00001925 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001926
dan sinclair41e4d9a2022-05-01 14:40:55 +00001927 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001928
dan sinclair41e4d9a2022-05-01 14:40:55 +00001929 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +00001930 ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
1931 EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
1932 EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001933}
1934
Ben Clayton54a104e2023-02-22 20:04:40 +00001935TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_Vec4TypeConversion) {
Ben Clayton66805b02023-06-14 22:00:01 +00001936 auto* tc = Call<vec4<f32>>(Call<vec4<i32>>());
dan sinclair41e4d9a2022-05-01 14:40:55 +00001937 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001938
dan sinclair41e4d9a2022-05-01 14:40:55 +00001939 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001940
dan sinclair41e4d9a2022-05-01 14:40:55 +00001941 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +00001942 ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
1943 EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
1944 EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001945}
1946
Ben Clayton54a104e2023-02-22 20:04:40 +00001947TEST_F(ResolverValueConstructorValidationTest, NestedVectorConstructors_InnerError) {
Ben Clayton66805b02023-06-14 22:00:01 +00001948 WrapInFunction(Call<vec4<f32>>(Call<vec4<f32>>(1_f, 1_f, //
1949 Call<vec3<f32>>(Source{{12, 34}}, 1_f, 1_f)),
1950 1_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001951
dan sinclair41e4d9a2022-05-01 14:40:55 +00001952 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001953 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001954 HasSubstr("12:34 error: no matching constructor for vec3<f32>(f32, f32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001955}
1956
Ben Clayton54a104e2023-02-22 20:04:40 +00001957TEST_F(ResolverValueConstructorValidationTest, NestedVectorConstructors_Success) {
Ben Clayton66805b02023-06-14 22:00:01 +00001958 auto* tc = Call<vec4<f32>>(Call<vec3<f32>>(Call<vec2<f32>>(1_f, 1_f), 1_f), 1_f);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001959 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001960
dan sinclair41e4d9a2022-05-01 14:40:55 +00001961 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001962
dan sinclair41e4d9a2022-05-01 14:40:55 +00001963 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclair0e780da2022-12-08 22:21:24 +00001964 ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
1965 EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
1966 EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001967}
1968
Ben Clayton54a104e2023-02-22 20:04:40 +00001969TEST_F(ResolverValueConstructorValidationTest, Vector_Alias_Argument_Error) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00001970 auto* alias = Alias("UnsignedInt", ty.u32());
dan sinclair2a651632023-02-19 04:03:55 +00001971 GlobalVar("uint_var", ty.Of(alias), builtin::AddressSpace::kPrivate);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001972
Ben Clayton66805b02023-06-14 22:00:01 +00001973 auto* tc = Call<vec2<f32>>(Source{{12, 34}}, "uint_var");
dan sinclair41e4d9a2022-05-01 14:40:55 +00001974 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001975
dan sinclair41e4d9a2022-05-01 14:40:55 +00001976 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00001977 EXPECT_THAT(r()->error(), HasSubstr("12:34 error: no matching constructor for vec2<f32>(u32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001978}
1979
Ben Clayton54a104e2023-02-22 20:04:40 +00001980TEST_F(ResolverValueConstructorValidationTest, Vector_Alias_Argument_Success) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00001981 auto* f32_alias = Alias("Float32", ty.f32());
1982 auto* vec2_alias = Alias("VectorFloat2", ty.vec2<f32>());
dan sinclair2a651632023-02-19 04:03:55 +00001983 GlobalVar("my_f32", ty.Of(f32_alias), builtin::AddressSpace::kPrivate);
1984 GlobalVar("my_vec2", ty.Of(vec2_alias), builtin::AddressSpace::kPrivate);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001985
Ben Clayton66805b02023-06-14 22:00:01 +00001986 auto* tc = Call<vec3<f32>>("my_vec2", "my_f32");
dan sinclair41e4d9a2022-05-01 14:40:55 +00001987 WrapInFunction(tc);
1988 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001989}
1990
Ben Clayton54a104e2023-02-22 20:04:40 +00001991TEST_F(ResolverValueConstructorValidationTest, Vector_ElementTypeAlias_Error) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00001992 auto* f32_alias = Alias("Float32", ty.f32());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001993
dan sinclair41e4d9a2022-05-01 14:40:55 +00001994 // vec2<Float32>(1.0f, 1u)
Ben Clayton971318f2023-02-14 13:52:43 +00001995 auto vec_type = ty.vec(ty.Of(f32_alias), 2);
Ben Clayton01ac21c2023-02-07 16:14:25 +00001996 WrapInFunction(Call(Source{{12, 34}}, vec_type, 1_f, 1_u));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001997
dan sinclair41e4d9a2022-05-01 14:40:55 +00001998 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001999 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00002000 HasSubstr("12:34 error: no matching constructor for vec2<f32>(f32, u32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002001}
2002
Ben Clayton54a104e2023-02-22 20:04:40 +00002003TEST_F(ResolverValueConstructorValidationTest, Vector_ElementTypeAlias_Success) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002004 auto* f32_alias = Alias("Float32", ty.f32());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002005
dan sinclair41e4d9a2022-05-01 14:40:55 +00002006 // vec2<Float32>(1.0f, 1.0f)
Ben Clayton971318f2023-02-14 13:52:43 +00002007 auto vec_type = ty.vec(ty.Of(f32_alias), 2);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002008 auto* tc = Call(Source{{12, 34}}, vec_type, 1_f, 1_f);
dan sinclair41e4d9a2022-05-01 14:40:55 +00002009 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002010
dan sinclair41e4d9a2022-05-01 14:40:55 +00002011 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002012}
2013
Ben Clayton54a104e2023-02-22 20:04:40 +00002014TEST_F(ResolverValueConstructorValidationTest, Vector_ArgumentElementTypeAlias_Error) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002015 auto* f32_alias = Alias("Float32", ty.f32());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002016
dan sinclair41e4d9a2022-05-01 14:40:55 +00002017 // vec3<u32>(vec<Float32>(), 1.0f)
Ben Clayton971318f2023-02-14 13:52:43 +00002018 auto vec_type = ty.vec(ty.Of(f32_alias), 2);
Ben Clayton66805b02023-06-14 22:00:01 +00002019 WrapInFunction(Call<vec3<u32>>(Source{{12, 34}}, Call(vec_type), 1_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002020
dan sinclair41e4d9a2022-05-01 14:40:55 +00002021 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00002022 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00002023 HasSubstr("12:34 error: no matching constructor for vec3<u32>(vec2<f32>, f32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002024}
2025
Ben Clayton54a104e2023-02-22 20:04:40 +00002026TEST_F(ResolverValueConstructorValidationTest, Vector_ArgumentElementTypeAlias_Success) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002027 auto* f32_alias = Alias("Float32", ty.f32());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002028
dan sinclair41e4d9a2022-05-01 14:40:55 +00002029 // vec3<f32>(vec<Float32>(), 1.0f)
Ben Clayton971318f2023-02-14 13:52:43 +00002030 auto vec_type = ty.vec(ty.Of(f32_alias), 2);
Ben Clayton66805b02023-06-14 22:00:01 +00002031 auto* tc = Call<vec3<f32>>(Call(Source{{12, 34}}, vec_type), 1_f);
dan sinclair41e4d9a2022-05-01 14:40:55 +00002032 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002033
dan sinclair41e4d9a2022-05-01 14:40:55 +00002034 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002035}
2036
Ben Clayton54a104e2023-02-22 20:04:40 +00002037TEST_F(ResolverValueConstructorValidationTest, InferVec2ElementTypeFromScalars) {
dan sinclaire4039c72023-02-17 21:58:59 +00002038 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002039
Ben Clayton66805b02023-06-14 22:00:01 +00002040 auto* vec2_bool = Call<vec2<Infer>>(true, false);
2041 auto* vec2_i32 = Call<vec2<Infer>>(1_i, 2_i);
2042 auto* vec2_u32 = Call<vec2<Infer>>(1_u, 2_u);
2043 auto* vec2_f32 = Call<vec2<Infer>>(1_f, 2_f);
2044 auto* vec2_f16 = Call<vec2<Infer>>(1_h, 2_h);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002045 WrapInFunction(vec2_bool, vec2_i32, vec2_u32, vec2_f32, vec2_f16);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002046
dan sinclair41e4d9a2022-05-01 14:40:55 +00002047 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002048
dan sinclair0e780da2022-12-08 22:21:24 +00002049 ASSERT_TRUE(TypeOf(vec2_bool)->Is<type::Vector>());
2050 ASSERT_TRUE(TypeOf(vec2_i32)->Is<type::Vector>());
2051 ASSERT_TRUE(TypeOf(vec2_u32)->Is<type::Vector>());
2052 ASSERT_TRUE(TypeOf(vec2_f32)->Is<type::Vector>());
2053 ASSERT_TRUE(TypeOf(vec2_f16)->Is<type::Vector>());
2054 EXPECT_TRUE(TypeOf(vec2_bool)->As<type::Vector>()->type()->Is<type::Bool>());
2055 EXPECT_TRUE(TypeOf(vec2_i32)->As<type::Vector>()->type()->Is<type::I32>());
2056 EXPECT_TRUE(TypeOf(vec2_u32)->As<type::Vector>()->type()->Is<type::U32>());
2057 EXPECT_TRUE(TypeOf(vec2_f32)->As<type::Vector>()->type()->Is<type::F32>());
2058 EXPECT_TRUE(TypeOf(vec2_f16)->As<type::Vector>()->type()->Is<type::F16>());
2059 EXPECT_EQ(TypeOf(vec2_bool)->As<type::Vector>()->Width(), 2u);
2060 EXPECT_EQ(TypeOf(vec2_i32)->As<type::Vector>()->Width(), 2u);
2061 EXPECT_EQ(TypeOf(vec2_u32)->As<type::Vector>()->Width(), 2u);
2062 EXPECT_EQ(TypeOf(vec2_f32)->As<type::Vector>()->Width(), 2u);
2063 EXPECT_EQ(TypeOf(vec2_f16)->As<type::Vector>()->Width(), 2u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002064}
2065
Ben Clayton54a104e2023-02-22 20:04:40 +00002066TEST_F(ResolverValueConstructorValidationTest, InferVec2ElementTypeFromVec2) {
dan sinclaire4039c72023-02-17 21:58:59 +00002067 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002068
Ben Clayton66805b02023-06-14 22:00:01 +00002069 auto* vec2_bool = Call<vec2<Infer>>(Call<vec2<bool>>(true, false));
2070 auto* vec2_i32 = Call<vec2<Infer>>(Call<vec2<i32>>(1_i, 2_i));
2071 auto* vec2_u32 = Call<vec2<Infer>>(Call<vec2<u32>>(1_u, 2_u));
2072 auto* vec2_f32 = Call<vec2<Infer>>(Call<vec2<f32>>(1_f, 2_f));
2073 auto* vec2_f16 = Call<vec2<Infer>>(Call<vec2<f16>>(1_h, 2_h));
Zhaoming Jiang60588822022-06-28 14:03:36 +00002074 WrapInFunction(vec2_bool, vec2_i32, vec2_u32, vec2_f32, vec2_f16);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002075
dan sinclair41e4d9a2022-05-01 14:40:55 +00002076 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002077
dan sinclair0e780da2022-12-08 22:21:24 +00002078 ASSERT_TRUE(TypeOf(vec2_bool)->Is<type::Vector>());
2079 ASSERT_TRUE(TypeOf(vec2_i32)->Is<type::Vector>());
2080 ASSERT_TRUE(TypeOf(vec2_u32)->Is<type::Vector>());
2081 ASSERT_TRUE(TypeOf(vec2_f32)->Is<type::Vector>());
2082 ASSERT_TRUE(TypeOf(vec2_f16)->Is<type::Vector>());
2083 EXPECT_TRUE(TypeOf(vec2_bool)->As<type::Vector>()->type()->Is<type::Bool>());
2084 EXPECT_TRUE(TypeOf(vec2_i32)->As<type::Vector>()->type()->Is<type::I32>());
2085 EXPECT_TRUE(TypeOf(vec2_u32)->As<type::Vector>()->type()->Is<type::U32>());
2086 EXPECT_TRUE(TypeOf(vec2_f32)->As<type::Vector>()->type()->Is<type::F32>());
2087 EXPECT_TRUE(TypeOf(vec2_f16)->As<type::Vector>()->type()->Is<type::F16>());
2088 EXPECT_EQ(TypeOf(vec2_bool)->As<type::Vector>()->Width(), 2u);
2089 EXPECT_EQ(TypeOf(vec2_i32)->As<type::Vector>()->Width(), 2u);
2090 EXPECT_EQ(TypeOf(vec2_u32)->As<type::Vector>()->Width(), 2u);
2091 EXPECT_EQ(TypeOf(vec2_f32)->As<type::Vector>()->Width(), 2u);
2092 EXPECT_EQ(TypeOf(vec2_f16)->As<type::Vector>()->Width(), 2u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002093}
2094
Ben Clayton54a104e2023-02-22 20:04:40 +00002095TEST_F(ResolverValueConstructorValidationTest, InferVec3ElementTypeFromScalars) {
dan sinclaire4039c72023-02-17 21:58:59 +00002096 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002097
Ben Clayton66805b02023-06-14 22:00:01 +00002098 auto* vec3_bool = Call<vec3<Infer>>(true, false, true);
2099 auto* vec3_i32 = Call<vec3<Infer>>(1_i, 2_i, 3_i);
2100 auto* vec3_u32 = Call<vec3<Infer>>(1_u, 2_u, 3_u);
2101 auto* vec3_f32 = Call<vec3<Infer>>(1_f, 2_f, 3_f);
2102 auto* vec3_f16 = Call<vec3<Infer>>(1_h, 2_h, 3_h);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002103 WrapInFunction(vec3_bool, vec3_i32, vec3_u32, vec3_f32, vec3_f16);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002104
dan sinclair41e4d9a2022-05-01 14:40:55 +00002105 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002106
dan sinclair0e780da2022-12-08 22:21:24 +00002107 ASSERT_TRUE(TypeOf(vec3_bool)->Is<type::Vector>());
2108 ASSERT_TRUE(TypeOf(vec3_i32)->Is<type::Vector>());
2109 ASSERT_TRUE(TypeOf(vec3_u32)->Is<type::Vector>());
2110 ASSERT_TRUE(TypeOf(vec3_f32)->Is<type::Vector>());
2111 ASSERT_TRUE(TypeOf(vec3_f16)->Is<type::Vector>());
2112 EXPECT_TRUE(TypeOf(vec3_bool)->As<type::Vector>()->type()->Is<type::Bool>());
2113 EXPECT_TRUE(TypeOf(vec3_i32)->As<type::Vector>()->type()->Is<type::I32>());
2114 EXPECT_TRUE(TypeOf(vec3_u32)->As<type::Vector>()->type()->Is<type::U32>());
2115 EXPECT_TRUE(TypeOf(vec3_f32)->As<type::Vector>()->type()->Is<type::F32>());
2116 EXPECT_TRUE(TypeOf(vec3_f16)->As<type::Vector>()->type()->Is<type::F16>());
2117 EXPECT_EQ(TypeOf(vec3_bool)->As<type::Vector>()->Width(), 3u);
2118 EXPECT_EQ(TypeOf(vec3_i32)->As<type::Vector>()->Width(), 3u);
2119 EXPECT_EQ(TypeOf(vec3_u32)->As<type::Vector>()->Width(), 3u);
2120 EXPECT_EQ(TypeOf(vec3_f32)->As<type::Vector>()->Width(), 3u);
2121 EXPECT_EQ(TypeOf(vec3_f16)->As<type::Vector>()->Width(), 3u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002122}
2123
Ben Clayton54a104e2023-02-22 20:04:40 +00002124TEST_F(ResolverValueConstructorValidationTest, InferVec3ElementTypeFromVec3) {
dan sinclaire4039c72023-02-17 21:58:59 +00002125 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002126
Ben Clayton66805b02023-06-14 22:00:01 +00002127 auto* vec3_bool = Call<vec3<Infer>>(Call<vec3<bool>>(true, false, true));
2128 auto* vec3_i32 = Call<vec3<Infer>>(Call<vec3<i32>>(1_i, 2_i, 3_i));
2129 auto* vec3_u32 = Call<vec3<Infer>>(Call<vec3<u32>>(1_u, 2_u, 3_u));
2130 auto* vec3_f32 = Call<vec3<Infer>>(Call<vec3<f32>>(1_f, 2_f, 3_f));
2131 auto* vec3_f16 = Call<vec3<Infer>>(Call<vec3<f16>>(1_h, 2_h, 3_h));
Zhaoming Jiang60588822022-06-28 14:03:36 +00002132 WrapInFunction(vec3_bool, vec3_i32, vec3_u32, vec3_f32, vec3_f16);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002133
dan sinclair41e4d9a2022-05-01 14:40:55 +00002134 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002135
dan sinclair0e780da2022-12-08 22:21:24 +00002136 ASSERT_TRUE(TypeOf(vec3_bool)->Is<type::Vector>());
2137 ASSERT_TRUE(TypeOf(vec3_i32)->Is<type::Vector>());
2138 ASSERT_TRUE(TypeOf(vec3_u32)->Is<type::Vector>());
2139 ASSERT_TRUE(TypeOf(vec3_f32)->Is<type::Vector>());
2140 ASSERT_TRUE(TypeOf(vec3_f16)->Is<type::Vector>());
2141 EXPECT_TRUE(TypeOf(vec3_bool)->As<type::Vector>()->type()->Is<type::Bool>());
2142 EXPECT_TRUE(TypeOf(vec3_i32)->As<type::Vector>()->type()->Is<type::I32>());
2143 EXPECT_TRUE(TypeOf(vec3_u32)->As<type::Vector>()->type()->Is<type::U32>());
2144 EXPECT_TRUE(TypeOf(vec3_f32)->As<type::Vector>()->type()->Is<type::F32>());
2145 EXPECT_TRUE(TypeOf(vec3_f16)->As<type::Vector>()->type()->Is<type::F16>());
2146 EXPECT_EQ(TypeOf(vec3_bool)->As<type::Vector>()->Width(), 3u);
2147 EXPECT_EQ(TypeOf(vec3_i32)->As<type::Vector>()->Width(), 3u);
2148 EXPECT_EQ(TypeOf(vec3_u32)->As<type::Vector>()->Width(), 3u);
2149 EXPECT_EQ(TypeOf(vec3_f32)->As<type::Vector>()->Width(), 3u);
2150 EXPECT_EQ(TypeOf(vec3_f16)->As<type::Vector>()->Width(), 3u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002151}
2152
Ben Clayton54a104e2023-02-22 20:04:40 +00002153TEST_F(ResolverValueConstructorValidationTest, InferVec3ElementTypeFromScalarAndVec2) {
dan sinclaire4039c72023-02-17 21:58:59 +00002154 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002155
Ben Clayton66805b02023-06-14 22:00:01 +00002156 auto* vec3_bool = Call<vec3<Infer>>(true, Call<vec2<bool>>(false, true));
2157 auto* vec3_i32 = Call<vec3<Infer>>(1_i, Call<vec2<i32>>(2_i, 3_i));
2158 auto* vec3_u32 = Call<vec3<Infer>>(1_u, Call<vec2<u32>>(2_u, 3_u));
2159 auto* vec3_f32 = Call<vec3<Infer>>(1_f, Call<vec2<f32>>(2_f, 3_f));
2160 auto* vec3_f16 = Call<vec3<Infer>>(1_h, Call<vec2<f16>>(2_h, 3_h));
Zhaoming Jiang60588822022-06-28 14:03:36 +00002161 WrapInFunction(vec3_bool, vec3_i32, vec3_u32, vec3_f32, vec3_f16);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002162
dan sinclair41e4d9a2022-05-01 14:40:55 +00002163 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002164
dan sinclair0e780da2022-12-08 22:21:24 +00002165 ASSERT_TRUE(TypeOf(vec3_bool)->Is<type::Vector>());
2166 ASSERT_TRUE(TypeOf(vec3_i32)->Is<type::Vector>());
2167 ASSERT_TRUE(TypeOf(vec3_u32)->Is<type::Vector>());
2168 ASSERT_TRUE(TypeOf(vec3_f32)->Is<type::Vector>());
2169 ASSERT_TRUE(TypeOf(vec3_f16)->Is<type::Vector>());
2170 EXPECT_TRUE(TypeOf(vec3_bool)->As<type::Vector>()->type()->Is<type::Bool>());
2171 EXPECT_TRUE(TypeOf(vec3_i32)->As<type::Vector>()->type()->Is<type::I32>());
2172 EXPECT_TRUE(TypeOf(vec3_u32)->As<type::Vector>()->type()->Is<type::U32>());
2173 EXPECT_TRUE(TypeOf(vec3_f32)->As<type::Vector>()->type()->Is<type::F32>());
2174 EXPECT_TRUE(TypeOf(vec3_f16)->As<type::Vector>()->type()->Is<type::F16>());
2175 EXPECT_EQ(TypeOf(vec3_bool)->As<type::Vector>()->Width(), 3u);
2176 EXPECT_EQ(TypeOf(vec3_i32)->As<type::Vector>()->Width(), 3u);
2177 EXPECT_EQ(TypeOf(vec3_u32)->As<type::Vector>()->Width(), 3u);
2178 EXPECT_EQ(TypeOf(vec3_f32)->As<type::Vector>()->Width(), 3u);
2179 EXPECT_EQ(TypeOf(vec3_f16)->As<type::Vector>()->Width(), 3u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002180}
2181
Ben Clayton54a104e2023-02-22 20:04:40 +00002182TEST_F(ResolverValueConstructorValidationTest, InferVec4ElementTypeFromScalars) {
dan sinclaire4039c72023-02-17 21:58:59 +00002183 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002184
Ben Clayton66805b02023-06-14 22:00:01 +00002185 auto* vec4_bool = Call<vec4<Infer>>(true, false, true, false);
2186 auto* vec4_i32 = Call<vec4<Infer>>(1_i, 2_i, 3_i, 4_i);
2187 auto* vec4_u32 = Call<vec4<Infer>>(1_u, 2_u, 3_u, 4_u);
2188 auto* vec4_f32 = Call<vec4<Infer>>(1_f, 2_f, 3_f, 4_f);
2189 auto* vec4_f16 = Call<vec4<Infer>>(1_h, 2_h, 3_h, 4_h);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002190 WrapInFunction(vec4_bool, vec4_i32, vec4_u32, vec4_f32, vec4_f16);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002191
dan sinclair41e4d9a2022-05-01 14:40:55 +00002192 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002193
dan sinclair0e780da2022-12-08 22:21:24 +00002194 ASSERT_TRUE(TypeOf(vec4_bool)->Is<type::Vector>());
2195 ASSERT_TRUE(TypeOf(vec4_i32)->Is<type::Vector>());
2196 ASSERT_TRUE(TypeOf(vec4_u32)->Is<type::Vector>());
2197 ASSERT_TRUE(TypeOf(vec4_f32)->Is<type::Vector>());
2198 ASSERT_TRUE(TypeOf(vec4_f16)->Is<type::Vector>());
2199 EXPECT_TRUE(TypeOf(vec4_bool)->As<type::Vector>()->type()->Is<type::Bool>());
2200 EXPECT_TRUE(TypeOf(vec4_i32)->As<type::Vector>()->type()->Is<type::I32>());
2201 EXPECT_TRUE(TypeOf(vec4_u32)->As<type::Vector>()->type()->Is<type::U32>());
2202 EXPECT_TRUE(TypeOf(vec4_f32)->As<type::Vector>()->type()->Is<type::F32>());
2203 EXPECT_TRUE(TypeOf(vec4_f16)->As<type::Vector>()->type()->Is<type::F16>());
2204 EXPECT_EQ(TypeOf(vec4_bool)->As<type::Vector>()->Width(), 4u);
2205 EXPECT_EQ(TypeOf(vec4_i32)->As<type::Vector>()->Width(), 4u);
2206 EXPECT_EQ(TypeOf(vec4_u32)->As<type::Vector>()->Width(), 4u);
2207 EXPECT_EQ(TypeOf(vec4_f32)->As<type::Vector>()->Width(), 4u);
2208 EXPECT_EQ(TypeOf(vec4_f16)->As<type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002209}
2210
Ben Clayton54a104e2023-02-22 20:04:40 +00002211TEST_F(ResolverValueConstructorValidationTest, InferVec4ElementTypeFromVec4) {
dan sinclaire4039c72023-02-17 21:58:59 +00002212 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002213
Ben Clayton66805b02023-06-14 22:00:01 +00002214 auto* vec4_bool = Call<vec4<Infer>>(Call<vec4<bool>>(true, false, true, false));
2215 auto* vec4_i32 = Call<vec4<Infer>>(Call<vec4<i32>>(1_i, 2_i, 3_i, 4_i));
2216 auto* vec4_u32 = Call<vec4<Infer>>(Call<vec4<u32>>(1_u, 2_u, 3_u, 4_u));
2217 auto* vec4_f32 = Call<vec4<Infer>>(Call<vec4<f32>>(1_f, 2_f, 3_f, 4_f));
2218 auto* vec4_f16 = Call<vec4<Infer>>(Call<vec4<f16>>(1_h, 2_h, 3_h, 4_h));
Zhaoming Jiang60588822022-06-28 14:03:36 +00002219 WrapInFunction(vec4_bool, vec4_i32, vec4_u32, vec4_f32, vec4_f16);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002220
dan sinclair41e4d9a2022-05-01 14:40:55 +00002221 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002222
dan sinclair0e780da2022-12-08 22:21:24 +00002223 ASSERT_TRUE(TypeOf(vec4_bool)->Is<type::Vector>());
2224 ASSERT_TRUE(TypeOf(vec4_i32)->Is<type::Vector>());
2225 ASSERT_TRUE(TypeOf(vec4_u32)->Is<type::Vector>());
2226 ASSERT_TRUE(TypeOf(vec4_f32)->Is<type::Vector>());
2227 ASSERT_TRUE(TypeOf(vec4_f16)->Is<type::Vector>());
2228 EXPECT_TRUE(TypeOf(vec4_bool)->As<type::Vector>()->type()->Is<type::Bool>());
2229 EXPECT_TRUE(TypeOf(vec4_i32)->As<type::Vector>()->type()->Is<type::I32>());
2230 EXPECT_TRUE(TypeOf(vec4_u32)->As<type::Vector>()->type()->Is<type::U32>());
2231 EXPECT_TRUE(TypeOf(vec4_f32)->As<type::Vector>()->type()->Is<type::F32>());
2232 EXPECT_TRUE(TypeOf(vec4_f16)->As<type::Vector>()->type()->Is<type::F16>());
2233 EXPECT_EQ(TypeOf(vec4_bool)->As<type::Vector>()->Width(), 4u);
2234 EXPECT_EQ(TypeOf(vec4_i32)->As<type::Vector>()->Width(), 4u);
2235 EXPECT_EQ(TypeOf(vec4_u32)->As<type::Vector>()->Width(), 4u);
2236 EXPECT_EQ(TypeOf(vec4_f32)->As<type::Vector>()->Width(), 4u);
2237 EXPECT_EQ(TypeOf(vec4_f16)->As<type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002238}
2239
Ben Clayton54a104e2023-02-22 20:04:40 +00002240TEST_F(ResolverValueConstructorValidationTest, InferVec4ElementTypeFromScalarAndVec3) {
dan sinclaire4039c72023-02-17 21:58:59 +00002241 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002242
Ben Clayton66805b02023-06-14 22:00:01 +00002243 auto* vec4_bool = Call<vec4<Infer>>(true, Call<vec3<bool>>(false, true, false));
2244 auto* vec4_i32 = Call<vec4<Infer>>(1_i, Call<vec3<i32>>(2_i, 3_i, 4_i));
2245 auto* vec4_u32 = Call<vec4<Infer>>(1_u, Call<vec3<u32>>(2_u, 3_u, 4_u));
2246 auto* vec4_f32 = Call<vec4<Infer>>(1_f, Call<vec3<f32>>(2_f, 3_f, 4_f));
2247 auto* vec4_f16 = Call<vec4<Infer>>(1_h, Call<vec3<f16>>(2_h, 3_h, 4_h));
Zhaoming Jiang60588822022-06-28 14:03:36 +00002248 WrapInFunction(vec4_bool, vec4_i32, vec4_u32, vec4_f32, vec4_f16);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002249
dan sinclair41e4d9a2022-05-01 14:40:55 +00002250 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002251
dan sinclair0e780da2022-12-08 22:21:24 +00002252 ASSERT_TRUE(TypeOf(vec4_bool)->Is<type::Vector>());
2253 ASSERT_TRUE(TypeOf(vec4_i32)->Is<type::Vector>());
2254 ASSERT_TRUE(TypeOf(vec4_u32)->Is<type::Vector>());
2255 ASSERT_TRUE(TypeOf(vec4_f32)->Is<type::Vector>());
2256 ASSERT_TRUE(TypeOf(vec4_f16)->Is<type::Vector>());
2257 EXPECT_TRUE(TypeOf(vec4_bool)->As<type::Vector>()->type()->Is<type::Bool>());
2258 EXPECT_TRUE(TypeOf(vec4_i32)->As<type::Vector>()->type()->Is<type::I32>());
2259 EXPECT_TRUE(TypeOf(vec4_u32)->As<type::Vector>()->type()->Is<type::U32>());
2260 EXPECT_TRUE(TypeOf(vec4_f32)->As<type::Vector>()->type()->Is<type::F32>());
2261 EXPECT_TRUE(TypeOf(vec4_f16)->As<type::Vector>()->type()->Is<type::F16>());
2262 EXPECT_EQ(TypeOf(vec4_bool)->As<type::Vector>()->Width(), 4u);
2263 EXPECT_EQ(TypeOf(vec4_i32)->As<type::Vector>()->Width(), 4u);
2264 EXPECT_EQ(TypeOf(vec4_u32)->As<type::Vector>()->Width(), 4u);
2265 EXPECT_EQ(TypeOf(vec4_f32)->As<type::Vector>()->Width(), 4u);
2266 EXPECT_EQ(TypeOf(vec4_f16)->As<type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002267}
2268
Ben Clayton54a104e2023-02-22 20:04:40 +00002269TEST_F(ResolverValueConstructorValidationTest, InferVec4ElementTypeFromVec2AndVec2) {
dan sinclaire4039c72023-02-17 21:58:59 +00002270 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002271
Ben Clayton66805b02023-06-14 22:00:01 +00002272 auto* vec4_bool =
2273 Call<vec4<Infer>>(Call<vec2<bool>>(true, false), Call<vec2<bool>>(true, false));
2274 auto* vec4_i32 = Call<vec4<Infer>>(Call<vec2<i32>>(1_i, 2_i), Call<vec2<i32>>(3_i, 4_i));
2275 auto* vec4_u32 = Call<vec4<Infer>>(Call<vec2<u32>>(1_u, 2_u), Call<vec2<u32>>(3_u, 4_u));
2276 auto* vec4_f32 = Call<vec4<Infer>>(Call<vec2<f32>>(1_f, 2_f), Call<vec2<f32>>(3_f, 4_f));
2277 auto* vec4_f16 = Call<vec4<Infer>>(Call<vec2<f16>>(1_h, 2_h), Call<vec2<f16>>(3_h, 4_h));
Zhaoming Jiang60588822022-06-28 14:03:36 +00002278 WrapInFunction(vec4_bool, vec4_i32, vec4_u32, vec4_f32, vec4_f16);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002279
dan sinclair41e4d9a2022-05-01 14:40:55 +00002280 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002281
dan sinclair0e780da2022-12-08 22:21:24 +00002282 ASSERT_TRUE(TypeOf(vec4_bool)->Is<type::Vector>());
2283 ASSERT_TRUE(TypeOf(vec4_i32)->Is<type::Vector>());
2284 ASSERT_TRUE(TypeOf(vec4_u32)->Is<type::Vector>());
2285 ASSERT_TRUE(TypeOf(vec4_f32)->Is<type::Vector>());
2286 ASSERT_TRUE(TypeOf(vec4_f16)->Is<type::Vector>());
2287 EXPECT_TRUE(TypeOf(vec4_bool)->As<type::Vector>()->type()->Is<type::Bool>());
2288 EXPECT_TRUE(TypeOf(vec4_i32)->As<type::Vector>()->type()->Is<type::I32>());
2289 EXPECT_TRUE(TypeOf(vec4_u32)->As<type::Vector>()->type()->Is<type::U32>());
2290 EXPECT_TRUE(TypeOf(vec4_f32)->As<type::Vector>()->type()->Is<type::F32>());
2291 EXPECT_TRUE(TypeOf(vec4_f16)->As<type::Vector>()->type()->Is<type::F16>());
2292 EXPECT_EQ(TypeOf(vec4_bool)->As<type::Vector>()->Width(), 4u);
2293 EXPECT_EQ(TypeOf(vec4_i32)->As<type::Vector>()->Width(), 4u);
2294 EXPECT_EQ(TypeOf(vec4_u32)->As<type::Vector>()->Width(), 4u);
2295 EXPECT_EQ(TypeOf(vec4_f32)->As<type::Vector>()->Width(), 4u);
2296 EXPECT_EQ(TypeOf(vec4_f16)->As<type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002297}
2298
Ben Claytonde42feb2023-04-21 12:19:49 +00002299TEST_F(ResolverValueConstructorValidationTest, InferVecNoArgs) {
Ben Clayton66805b02023-06-14 22:00:01 +00002300 auto* v2 = Call<vec2<Infer>>();
2301 auto* v3 = Call<vec3<Infer>>();
2302 auto* v4 = Call<vec4<Infer>>();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002303
Ben Claytonde42feb2023-04-21 12:19:49 +00002304 GlobalConst("v2", v2);
2305 GlobalConst("v3", v3);
2306 GlobalConst("v4", v4);
2307
2308 ASSERT_TRUE(r()->Resolve()) << r()->error();
2309
2310 ASSERT_TRUE(TypeOf(v2)->Is<type::Vector>());
2311 ASSERT_TRUE(TypeOf(v3)->Is<type::Vector>());
2312 ASSERT_TRUE(TypeOf(v4)->Is<type::Vector>());
2313 EXPECT_TRUE(TypeOf(v2)->As<type::Vector>()->type()->Is<type::AbstractInt>());
2314 EXPECT_TRUE(TypeOf(v3)->As<type::Vector>()->type()->Is<type::AbstractInt>());
2315 EXPECT_TRUE(TypeOf(v4)->As<type::Vector>()->type()->Is<type::AbstractInt>());
2316 EXPECT_EQ(TypeOf(v2)->As<type::Vector>()->Width(), 2u);
2317 EXPECT_EQ(TypeOf(v3)->As<type::Vector>()->Width(), 3u);
2318 EXPECT_EQ(TypeOf(v4)->As<type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002319}
2320
Ben Clayton54a104e2023-02-22 20:04:40 +00002321TEST_F(ResolverValueConstructorValidationTest, CannotInferVec2ElementTypeFromScalarsMismatch) {
Ben Clayton971318f2023-02-14 13:52:43 +00002322 WrapInFunction(Call(Source{{1, 1}}, "vec2", //
Ben Clayton01ac21c2023-02-07 16:14:25 +00002323 Expr(Source{{1, 2}}, 1_i), //
2324 Expr(Source{{1, 3}}, 2_u)));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002325
dan sinclair41e4d9a2022-05-01 14:40:55 +00002326 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00002327 EXPECT_THAT(r()->error(), HasSubstr("1:1 error: no matching constructor for vec2(i32, u32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002328}
2329
Ben Clayton54a104e2023-02-22 20:04:40 +00002330TEST_F(ResolverValueConstructorValidationTest, CannotInferVec3ElementTypeFromScalarsMismatch) {
Ben Clayton971318f2023-02-14 13:52:43 +00002331 WrapInFunction(Call(Source{{1, 1}}, "vec3", //
Ben Clayton01ac21c2023-02-07 16:14:25 +00002332 Expr(Source{{1, 2}}, 1_i), //
2333 Expr(Source{{1, 3}}, 2_u), //
2334 Expr(Source{{1, 4}}, 3_i)));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002335
dan sinclair41e4d9a2022-05-01 14:40:55 +00002336 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00002337 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00002338 HasSubstr("1:1 error: no matching constructor for vec3(i32, u32, i32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002339}
2340
Ben Clayton54a104e2023-02-22 20:04:40 +00002341TEST_F(ResolverValueConstructorValidationTest,
2342 CannotInferVec3ElementTypeFromScalarAndVec2Mismatch) {
Ben Clayton971318f2023-02-14 13:52:43 +00002343 WrapInFunction(Call(Source{{1, 1}}, "vec3", //
Ben Clayton01ac21c2023-02-07 16:14:25 +00002344 Expr(Source{{1, 2}}, 1_i), //
2345 Call(Source{{1, 3}}, ty.vec2<f32>(), 2_f, 3_f)));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002346
dan sinclair41e4d9a2022-05-01 14:40:55 +00002347 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00002348 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00002349 HasSubstr("1:1 error: no matching constructor for vec3(i32, vec2<f32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002350}
2351
Ben Clayton54a104e2023-02-22 20:04:40 +00002352TEST_F(ResolverValueConstructorValidationTest, CannotInferVec4ElementTypeFromScalarsMismatch) {
Ben Clayton971318f2023-02-14 13:52:43 +00002353 WrapInFunction(Call(Source{{1, 1}}, "vec4", //
Ben Clayton01ac21c2023-02-07 16:14:25 +00002354 Expr(Source{{1, 2}}, 1_i), //
2355 Expr(Source{{1, 3}}, 2_i), //
2356 Expr(Source{{1, 4}}, 3_f), //
2357 Expr(Source{{1, 5}}, 4_i)));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002358
dan sinclair41e4d9a2022-05-01 14:40:55 +00002359 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00002360 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00002361 HasSubstr("1:1 error: no matching constructor for vec4(i32, i32, f32, i32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002362}
2363
Ben Clayton54a104e2023-02-22 20:04:40 +00002364TEST_F(ResolverValueConstructorValidationTest,
2365 CannotInferVec4ElementTypeFromScalarAndVec3Mismatch) {
Ben Clayton971318f2023-02-14 13:52:43 +00002366 WrapInFunction(Call(Source{{1, 1}}, "vec4", //
Ben Clayton01ac21c2023-02-07 16:14:25 +00002367 Expr(Source{{1, 2}}, 1_i), //
2368 Call(Source{{1, 3}}, ty.vec3<u32>(), 2_u, 3_u, 4_u)));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002369
dan sinclair41e4d9a2022-05-01 14:40:55 +00002370 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00002371 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00002372 HasSubstr("1:1 error: no matching constructor for vec4(i32, vec3<u32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002373}
2374
Ben Clayton54a104e2023-02-22 20:04:40 +00002375TEST_F(ResolverValueConstructorValidationTest, CannotInferVec4ElementTypeFromVec2AndVec2Mismatch) {
Ben Clayton971318f2023-02-14 13:52:43 +00002376 WrapInFunction(Call(Source{{1, 1}}, "vec4", //
Ben Clayton01ac21c2023-02-07 16:14:25 +00002377 Call(Source{{1, 2}}, ty.vec2<i32>(), 3_i, 4_i), //
2378 Call(Source{{1, 3}}, ty.vec2<u32>(), 3_u, 4_u)));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002379
dan sinclair41e4d9a2022-05-01 14:40:55 +00002380 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00002381 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00002382 HasSubstr("1:1 error: no matching constructor for vec4(vec2<i32>, vec2<u32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002383}
2384
Ben Clayton54a104e2023-02-22 20:04:40 +00002385} // namespace VectorConstructor
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002386
Ben Clayton54a104e2023-02-22 20:04:40 +00002387namespace MatrixConstructor {
Zhaoming Jiang60588822022-06-28 14:03:36 +00002388
2389struct MatrixParams {
2390 using name_func_ptr = std::string (*)();
2391
dan sinclair41e4d9a2022-05-01 14:40:55 +00002392 uint32_t rows;
2393 uint32_t columns;
Zhaoming Jiang60588822022-06-28 14:03:36 +00002394 name_func_ptr get_element_type_name;
2395 builder::ast_type_func_ptr create_element_ast_type;
Antonio Maioranob6d524382022-08-31 22:59:08 +00002396 builder::ast_expr_from_double_func_ptr create_element_ast_value;
Zhaoming Jiang60588822022-06-28 14:03:36 +00002397 builder::ast_type_func_ptr create_column_ast_type;
2398 builder::ast_type_func_ptr create_mat_ast_type;
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002399};
2400
Zhaoming Jiang60588822022-06-28 14:03:36 +00002401template <typename T, uint32_t R, uint32_t C>
2402constexpr MatrixParams MatrixParamsFor() {
2403 return MatrixParams{
2404 R,
2405 C,
2406 DataType<T>::Name,
2407 DataType<T>::AST,
Antonio Maioranob6d524382022-08-31 22:59:08 +00002408 DataType<T>::ExprFromDouble,
Ben Clayton66805b02023-06-14 22:00:01 +00002409 DataType<vec<R, T>>::AST,
2410 DataType<mat<C, R, T>>::AST,
Zhaoming Jiang60588822022-06-28 14:03:36 +00002411 };
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002412}
2413
Zhaoming Jiang60588822022-06-28 14:03:36 +00002414static std::string MatrixStr(const MatrixParams& param) {
2415 return "mat" + std::to_string(param.columns) + "x" + std::to_string(param.rows) + "<" +
2416 param.get_element_type_name() + ">";
2417}
2418
Ben Clayton54a104e2023-02-22 20:04:40 +00002419using MatrixConstructorTest = ResolverTestWithParam<MatrixParams>;
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002420
Ben Clayton54a104e2023-02-22 20:04:40 +00002421TEST_P(MatrixConstructorTest, ColumnConstructor_Error_TooFewArguments) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002422 // matNxM<f32>(vecM<f32>(), ...); with N - 1 arguments
Zhaoming Jiang60588822022-06-28 14:03:36 +00002423 // matNxM<f16>(vecM<f16>(), ...); with N - 1 arguments
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002424
dan sinclair41e4d9a2022-05-01 14:40:55 +00002425 const auto param = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002426
dan sinclaire4039c72023-02-17 21:58:59 +00002427 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002428
2429 const std::string element_type_name = param.get_element_type_name();
dan sinclairb23cda42023-02-28 17:31:54 +00002430 utils::StringStream args_tys;
Ben Clayton783b1692022-08-02 17:03:35 +00002431 utils::Vector<const ast::Expression*, 8> args;
Ben Clayton6ae608c2022-05-16 20:54:42 +00002432 for (uint32_t i = 0; i < param.columns - 1; i++) {
Ben Clayton971318f2023-02-14 13:52:43 +00002433 ast::Type vec_type = param.create_column_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002434 args.Push(Call(vec_type));
Ben Clayton6ae608c2022-05-16 20:54:42 +00002435 if (i > 0) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002436 args_tys << ", ";
2437 }
Zhaoming Jiang60588822022-06-28 14:03:36 +00002438 args_tys << "vec" << param.rows << "<" + element_type_name + ">";
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002439 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002440
Ben Clayton971318f2023-02-14 13:52:43 +00002441 ast::Type matrix_type = param.create_mat_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002442 auto* tc = Call(Source{{12, 34}}, matrix_type, std::move(args));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002443 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002444
dan sinclair41e4d9a2022-05-01 14:40:55 +00002445 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00002446 EXPECT_THAT(r()->error(), HasSubstr("12:34 error: no matching constructor for " +
Ben Clayton3b5edf12022-05-16 21:14:11 +00002447 MatrixStr(param) + "(" + args_tys.str() + ")"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002448}
2449
Ben Clayton54a104e2023-02-22 20:04:40 +00002450TEST_P(MatrixConstructorTest, ElementConstructor_Error_TooFewArguments) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002451 // matNxM<f32>(f32,...,f32); with N*M - 1 arguments
Zhaoming Jiang60588822022-06-28 14:03:36 +00002452 // matNxM<f16>(f16,...,f16); with N*M - 1 arguments
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002453
dan sinclair41e4d9a2022-05-01 14:40:55 +00002454 const auto param = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002455
dan sinclaire4039c72023-02-17 21:58:59 +00002456 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002457
2458 const std::string element_type_name = param.get_element_type_name();
dan sinclairb23cda42023-02-28 17:31:54 +00002459 utils::StringStream args_tys;
Ben Clayton783b1692022-08-02 17:03:35 +00002460 utils::Vector<const ast::Expression*, 8> args;
Ben Clayton6ae608c2022-05-16 20:54:42 +00002461 for (uint32_t i = 0; i < param.columns * param.rows - 1; i++) {
Ben Clayton01ac21c2023-02-07 16:14:25 +00002462 args.Push(Call(param.create_element_ast_type(*this)));
Ben Clayton6ae608c2022-05-16 20:54:42 +00002463 if (i > 0) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002464 args_tys << ", ";
2465 }
Zhaoming Jiang60588822022-06-28 14:03:36 +00002466 args_tys << element_type_name;
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002467 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002468
Ben Clayton971318f2023-02-14 13:52:43 +00002469 ast::Type matrix_type = param.create_mat_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002470 auto* tc = Call(Source{{12, 34}}, matrix_type, std::move(args));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002471 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002472
dan sinclair41e4d9a2022-05-01 14:40:55 +00002473 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00002474 EXPECT_THAT(r()->error(), HasSubstr("12:34 error: no matching constructor for " +
Ben Clayton3b5edf12022-05-16 21:14:11 +00002475 MatrixStr(param) + "(" + args_tys.str() + ")"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002476}
2477
Ben Clayton54a104e2023-02-22 20:04:40 +00002478TEST_P(MatrixConstructorTest, ColumnConstructor_Error_TooManyArguments) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002479 // matNxM<f32>(vecM<f32>(), ...); with N + 1 arguments
Zhaoming Jiang60588822022-06-28 14:03:36 +00002480 // matNxM<f16>(vecM<f16>(), ...); with N + 1 arguments
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002481
dan sinclair41e4d9a2022-05-01 14:40:55 +00002482 const auto param = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002483
dan sinclaire4039c72023-02-17 21:58:59 +00002484 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002485
2486 const std::string element_type_name = param.get_element_type_name();
dan sinclairb23cda42023-02-28 17:31:54 +00002487 utils::StringStream args_tys;
Ben Clayton783b1692022-08-02 17:03:35 +00002488 utils::Vector<const ast::Expression*, 8> args;
Ben Clayton6ae608c2022-05-16 20:54:42 +00002489 for (uint32_t i = 0; i < param.columns + 1; i++) {
Ben Clayton971318f2023-02-14 13:52:43 +00002490 ast::Type vec_type = param.create_column_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002491 args.Push(Call(vec_type));
Ben Clayton6ae608c2022-05-16 20:54:42 +00002492 if (i > 0) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002493 args_tys << ", ";
2494 }
Zhaoming Jiang60588822022-06-28 14:03:36 +00002495 args_tys << "vec" << param.rows << "<" + element_type_name + ">";
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002496 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002497
Ben Clayton971318f2023-02-14 13:52:43 +00002498 ast::Type matrix_type = param.create_mat_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002499 auto* tc = Call(Source{{12, 34}}, matrix_type, std::move(args));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002500 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002501
dan sinclair41e4d9a2022-05-01 14:40:55 +00002502 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00002503 EXPECT_THAT(r()->error(), HasSubstr("12:34 error: no matching constructor for " +
Ben Clayton3b5edf12022-05-16 21:14:11 +00002504 MatrixStr(param) + "(" + args_tys.str() + ")"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002505}
2506
Ben Clayton54a104e2023-02-22 20:04:40 +00002507TEST_P(MatrixConstructorTest, ElementConstructor_Error_TooManyArguments) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002508 // matNxM<f32>(f32,...,f32); with N*M + 1 arguments
Zhaoming Jiang60588822022-06-28 14:03:36 +00002509 // matNxM<f16>(f16,...,f16); with N*M + 1 arguments
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002510
dan sinclair41e4d9a2022-05-01 14:40:55 +00002511 const auto param = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002512
dan sinclaire4039c72023-02-17 21:58:59 +00002513 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002514
2515 const std::string element_type_name = param.get_element_type_name();
dan sinclairb23cda42023-02-28 17:31:54 +00002516 utils::StringStream args_tys;
Ben Clayton783b1692022-08-02 17:03:35 +00002517 utils::Vector<const ast::Expression*, 8> args;
Ben Clayton6ae608c2022-05-16 20:54:42 +00002518 for (uint32_t i = 0; i < param.columns * param.rows + 1; i++) {
Ben Clayton01ac21c2023-02-07 16:14:25 +00002519 args.Push(Call(param.create_element_ast_type(*this)));
Ben Clayton6ae608c2022-05-16 20:54:42 +00002520 if (i > 0) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002521 args_tys << ", ";
2522 }
Zhaoming Jiang60588822022-06-28 14:03:36 +00002523 args_tys << element_type_name;
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002524 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002525
Ben Clayton971318f2023-02-14 13:52:43 +00002526 ast::Type matrix_type = param.create_mat_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002527 auto* tc = Call(Source{{12, 34}}, matrix_type, std::move(args));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002528 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002529
dan sinclair41e4d9a2022-05-01 14:40:55 +00002530 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00002531 EXPECT_THAT(r()->error(), HasSubstr("12:34 error: no matching constructor for " +
Ben Clayton3b5edf12022-05-16 21:14:11 +00002532 MatrixStr(param) + "(" + args_tys.str() + ")"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002533}
2534
Ben Clayton54a104e2023-02-22 20:04:40 +00002535TEST_P(MatrixConstructorTest, ColumnConstructor_Error_InvalidArgumentType) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002536 // matNxM<f32>(vec<u32>, vec<u32>, ...); N arguments
Zhaoming Jiang60588822022-06-28 14:03:36 +00002537 // matNxM<f16>(vec<u32>, vec<u32>, ...); N arguments
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002538
dan sinclair41e4d9a2022-05-01 14:40:55 +00002539 const auto param = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002540
dan sinclaire4039c72023-02-17 21:58:59 +00002541 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002542
dan sinclairb23cda42023-02-28 17:31:54 +00002543 utils::StringStream args_tys;
Ben Clayton783b1692022-08-02 17:03:35 +00002544 utils::Vector<const ast::Expression*, 8> args;
Ben Clayton6ae608c2022-05-16 20:54:42 +00002545 for (uint32_t i = 0; i < param.columns; i++) {
Ben Clayton971318f2023-02-14 13:52:43 +00002546 auto vec_type = ty.vec<u32>(param.rows);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002547 args.Push(Call(vec_type));
Ben Clayton6ae608c2022-05-16 20:54:42 +00002548 if (i > 0) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002549 args_tys << ", ";
2550 }
2551 args_tys << "vec" << param.rows << "<u32>";
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002552 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002553
Ben Clayton971318f2023-02-14 13:52:43 +00002554 ast::Type matrix_type = param.create_mat_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002555 auto* tc = Call(Source{{12, 34}}, matrix_type, std::move(args));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002556 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002557
dan sinclair41e4d9a2022-05-01 14:40:55 +00002558 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00002559 EXPECT_THAT(r()->error(), HasSubstr("12:34 error: no matching constructor for " +
Ben Clayton3b5edf12022-05-16 21:14:11 +00002560 MatrixStr(param) + "(" + args_tys.str() + ")"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002561}
2562
Ben Clayton54a104e2023-02-22 20:04:40 +00002563TEST_P(MatrixConstructorTest, ElementConstructor_Error_InvalidArgumentType) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002564 // matNxM<f32>(u32, u32, ...); N*M arguments
Zhaoming Jiang60588822022-06-28 14:03:36 +00002565 // matNxM<f16>(u32, u32, ...); N*M arguments
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002566
dan sinclair41e4d9a2022-05-01 14:40:55 +00002567 const auto param = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002568
dan sinclaire4039c72023-02-17 21:58:59 +00002569 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002570
dan sinclairb23cda42023-02-28 17:31:54 +00002571 utils::StringStream args_tys;
Ben Clayton783b1692022-08-02 17:03:35 +00002572 utils::Vector<const ast::Expression*, 8> args;
Ben Clayton6ae608c2022-05-16 20:54:42 +00002573 for (uint32_t i = 0; i < param.columns; i++) {
Ben Clayton783b1692022-08-02 17:03:35 +00002574 args.Push(Expr(1_u));
Ben Clayton6ae608c2022-05-16 20:54:42 +00002575 if (i > 0) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002576 args_tys << ", ";
2577 }
2578 args_tys << "u32";
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002579 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002580
Ben Clayton971318f2023-02-14 13:52:43 +00002581 ast::Type matrix_type = param.create_mat_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002582 auto* tc = Call(Source{{12, 34}}, matrix_type, std::move(args));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002583 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002584
dan sinclair41e4d9a2022-05-01 14:40:55 +00002585 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00002586 EXPECT_THAT(r()->error(), HasSubstr("12:34 error: no matching constructor for " +
Ben Clayton3b5edf12022-05-16 21:14:11 +00002587 MatrixStr(param) + "(" + args_tys.str() + ")"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002588}
2589
Ben Clayton54a104e2023-02-22 20:04:40 +00002590TEST_P(MatrixConstructorTest, ColumnConstructor_Error_TooFewRowsInVectorArgument) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002591 // matNxM<f32>(vecM<f32>(),...,vecM-1<f32>());
Zhaoming Jiang60588822022-06-28 14:03:36 +00002592 // matNxM<f16>(vecM<f16>(),...,vecM-1<f32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002593
dan sinclair41e4d9a2022-05-01 14:40:55 +00002594 const auto param = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002595
dan sinclair41e4d9a2022-05-01 14:40:55 +00002596 // Skip the test if parameters would have resulted in an invalid vec1 type.
2597 if (param.rows == 2) {
2598 return;
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002599 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002600
dan sinclaire4039c72023-02-17 21:58:59 +00002601 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002602
2603 const std::string element_type_name = param.get_element_type_name();
dan sinclairb23cda42023-02-28 17:31:54 +00002604 utils::StringStream args_tys;
Ben Clayton783b1692022-08-02 17:03:35 +00002605 utils::Vector<const ast::Expression*, 8> args;
Ben Clayton6ae608c2022-05-16 20:54:42 +00002606 for (uint32_t i = 0; i < param.columns; i++) {
Ben Clayton971318f2023-02-14 13:52:43 +00002607 ast::Type valid_vec_type = param.create_column_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002608 args.Push(Call(valid_vec_type));
Ben Clayton6ae608c2022-05-16 20:54:42 +00002609 if (i > 0) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002610 args_tys << ", ";
2611 }
Zhaoming Jiang60588822022-06-28 14:03:36 +00002612 args_tys << "vec" << param.rows << "<" + element_type_name + ">";
dan sinclair41e4d9a2022-05-01 14:40:55 +00002613 }
2614 const size_t kInvalidLoc = 2 * (param.columns - 1);
Ben Clayton971318f2023-02-14 13:52:43 +00002615 auto invalid_vec_type = ty.vec(param.create_element_ast_type(*this), param.rows - 1);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002616 args.Push(Call(Source{{12, kInvalidLoc}}, invalid_vec_type));
Zhaoming Jiang60588822022-06-28 14:03:36 +00002617 args_tys << ", vec" << (param.rows - 1) << "<" + element_type_name + ">";
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002618
Ben Clayton971318f2023-02-14 13:52:43 +00002619 ast::Type matrix_type = param.create_mat_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002620 auto* tc = Call(Source{{12, 34}}, matrix_type, std::move(args));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002621 WrapInFunction(tc);
2622
2623 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00002624 EXPECT_THAT(r()->error(), HasSubstr("12:34 error: no matching constructor for " +
Ben Clayton3b5edf12022-05-16 21:14:11 +00002625 MatrixStr(param) + "(" + args_tys.str() + ")"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002626}
2627
Ben Clayton54a104e2023-02-22 20:04:40 +00002628TEST_P(MatrixConstructorTest, ColumnConstructor_Error_TooManyRowsInVectorArgument) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002629 // matNxM<f32>(vecM<f32>(),...,vecM+1<f32>());
Zhaoming Jiang60588822022-06-28 14:03:36 +00002630 // matNxM<f16>(vecM<f16>(),...,vecM+1<f16>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002631
dan sinclair41e4d9a2022-05-01 14:40:55 +00002632 const auto param = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002633
dan sinclair41e4d9a2022-05-01 14:40:55 +00002634 // Skip the test if parameters would have resulted in an invalid vec5 type.
2635 if (param.rows == 4) {
2636 return;
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002637 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002638
dan sinclaire4039c72023-02-17 21:58:59 +00002639 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002640
2641 const std::string element_type_name = param.get_element_type_name();
dan sinclairb23cda42023-02-28 17:31:54 +00002642 utils::StringStream args_tys;
Ben Clayton783b1692022-08-02 17:03:35 +00002643 utils::Vector<const ast::Expression*, 8> args;
Ben Clayton6ae608c2022-05-16 20:54:42 +00002644 for (uint32_t i = 0; i < param.columns; i++) {
Ben Clayton971318f2023-02-14 13:52:43 +00002645 ast::Type valid_vec_type = param.create_column_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002646 args.Push(Call(valid_vec_type));
Ben Clayton6ae608c2022-05-16 20:54:42 +00002647 if (i > 0) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002648 args_tys << ", ";
2649 }
Zhaoming Jiang60588822022-06-28 14:03:36 +00002650 args_tys << "vec" << param.rows << "<" + element_type_name + ">";
dan sinclair41e4d9a2022-05-01 14:40:55 +00002651 }
Ben Clayton971318f2023-02-14 13:52:43 +00002652 auto invalid_vec_type = ty.vec(param.create_element_ast_type(*this), param.rows + 1);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002653 args.Push(Call(invalid_vec_type));
Zhaoming Jiang60588822022-06-28 14:03:36 +00002654 args_tys << ", vec" << (param.rows + 1) << "<" + element_type_name + ">";
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002655
Ben Clayton971318f2023-02-14 13:52:43 +00002656 ast::Type matrix_type = param.create_mat_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002657 auto* tc = Call(Source{{12, 34}}, matrix_type, std::move(args));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002658 WrapInFunction(tc);
2659
2660 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00002661 EXPECT_THAT(r()->error(), HasSubstr("12:34 error: no matching constructor for " +
Ben Clayton3b5edf12022-05-16 21:14:11 +00002662 MatrixStr(param) + "(" + args_tys.str() + ")"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002663}
2664
Ben Clayton54a104e2023-02-22 20:04:40 +00002665TEST_P(MatrixConstructorTest, ZeroValue_Success) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002666 // matNxM<f32>();
Zhaoming Jiang60588822022-06-28 14:03:36 +00002667 // matNxM<f16>();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002668
dan sinclair41e4d9a2022-05-01 14:40:55 +00002669 const auto param = GetParam();
Zhaoming Jiang60588822022-06-28 14:03:36 +00002670
dan sinclaire4039c72023-02-17 21:58:59 +00002671 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002672
Ben Clayton971318f2023-02-14 13:52:43 +00002673 ast::Type matrix_type = param.create_mat_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002674 auto* tc = Call(Source{{12, 40}}, matrix_type);
dan sinclair41e4d9a2022-05-01 14:40:55 +00002675 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002676
dan sinclair41e4d9a2022-05-01 14:40:55 +00002677 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002678}
2679
Ben Clayton54a104e2023-02-22 20:04:40 +00002680TEST_P(MatrixConstructorTest, WithColumns_Success) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002681 // matNxM<f32>(vecM<f32>(), ...); with N arguments
Zhaoming Jiang60588822022-06-28 14:03:36 +00002682 // matNxM<f16>(vecM<f16>(), ...); with N arguments
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002683
dan sinclair41e4d9a2022-05-01 14:40:55 +00002684 const auto param = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002685
dan sinclaire4039c72023-02-17 21:58:59 +00002686 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002687
Ben Clayton783b1692022-08-02 17:03:35 +00002688 utils::Vector<const ast::Expression*, 4> args;
Ben Clayton6ae608c2022-05-16 20:54:42 +00002689 for (uint32_t i = 0; i < param.columns; i++) {
Ben Clayton971318f2023-02-14 13:52:43 +00002690 ast::Type vec_type = param.create_column_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002691 args.Push(Call(vec_type));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002692 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002693
Ben Clayton971318f2023-02-14 13:52:43 +00002694 ast::Type matrix_type = param.create_mat_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002695 auto* tc = Call(matrix_type, std::move(args));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002696 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002697
dan sinclair41e4d9a2022-05-01 14:40:55 +00002698 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002699}
2700
Ben Clayton54a104e2023-02-22 20:04:40 +00002701TEST_P(MatrixConstructorTest, WithElements_Success) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002702 // matNxM<f32>(f32,...,f32); with N*M arguments
Zhaoming Jiang60588822022-06-28 14:03:36 +00002703 // matNxM<f16>(f16,...,f16); with N*M arguments
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002704
dan sinclair41e4d9a2022-05-01 14:40:55 +00002705 const auto param = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002706
dan sinclaire4039c72023-02-17 21:58:59 +00002707 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002708
Ben Clayton783b1692022-08-02 17:03:35 +00002709 utils::Vector<const ast::Expression*, 16> args;
Ben Clayton6ae608c2022-05-16 20:54:42 +00002710 for (uint32_t i = 0; i < param.columns * param.rows; i++) {
Ben Clayton01ac21c2023-02-07 16:14:25 +00002711 args.Push(Call(param.create_element_ast_type(*this)));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002712 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002713
Ben Clayton971318f2023-02-14 13:52:43 +00002714 ast::Type matrix_type = param.create_mat_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002715 auto* tc = Call(matrix_type, std::move(args));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002716 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002717
dan sinclair41e4d9a2022-05-01 14:40:55 +00002718 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002719}
2720
Ben Clayton54a104e2023-02-22 20:04:40 +00002721TEST_P(MatrixConstructorTest, ElementTypeAlias_Error) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002722 // matNxM<Float32>(vecM<u32>(), ...); with N arguments
Zhaoming Jiang60588822022-06-28 14:03:36 +00002723 // matNxM<Float16>(vecM<u32>(), ...); with N arguments
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002724
dan sinclair41e4d9a2022-05-01 14:40:55 +00002725 const auto param = GetParam();
Zhaoming Jiang60588822022-06-28 14:03:36 +00002726
dan sinclaire4039c72023-02-17 21:58:59 +00002727 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002728
2729 auto* elem_type_alias = Alias("ElemType", param.create_element_ast_type(*this));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002730
dan sinclairb23cda42023-02-28 17:31:54 +00002731 utils::StringStream args_tys;
Ben Clayton783b1692022-08-02 17:03:35 +00002732 utils::Vector<const ast::Expression*, 4> args;
Ben Clayton6ae608c2022-05-16 20:54:42 +00002733 for (uint32_t i = 0; i < param.columns; i++) {
Ben Clayton971318f2023-02-14 13:52:43 +00002734 auto vec_type = ty.vec(ty.u32(), param.rows);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002735 args.Push(Call(vec_type));
Ben Clayton6ae608c2022-05-16 20:54:42 +00002736 if (i > 0) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002737 args_tys << ", ";
2738 }
2739 args_tys << "vec" << param.rows << "<u32>";
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002740 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002741
Ben Clayton971318f2023-02-14 13:52:43 +00002742 auto matrix_type = ty.mat(ty.Of(elem_type_alias), param.columns, param.rows);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002743 auto* tc = Call(Source{{12, 34}}, matrix_type, std::move(args));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002744 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002745
dan sinclair41e4d9a2022-05-01 14:40:55 +00002746 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00002747 EXPECT_THAT(r()->error(), HasSubstr("12:34 error: no matching constructor for " +
Ben Clayton3b5edf12022-05-16 21:14:11 +00002748 MatrixStr(param) + "(" + args_tys.str() + ")"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002749}
2750
Ben Clayton54a104e2023-02-22 20:04:40 +00002751TEST_P(MatrixConstructorTest, ElementTypeAlias_Success) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002752 // matNxM<Float32>(vecM<f32>(), ...); with N arguments
Zhaoming Jiang60588822022-06-28 14:03:36 +00002753 // matNxM<Float16>(vecM<f16>(), ...); with N arguments
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002754
dan sinclair41e4d9a2022-05-01 14:40:55 +00002755 const auto param = GetParam();
Zhaoming Jiang60588822022-06-28 14:03:36 +00002756
dan sinclaire4039c72023-02-17 21:58:59 +00002757 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002758
2759 auto* elem_type_alias = Alias("ElemType", param.create_element_ast_type(*this));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002760
Ben Clayton783b1692022-08-02 17:03:35 +00002761 utils::Vector<const ast::Expression*, 8> args;
Ben Clayton6ae608c2022-05-16 20:54:42 +00002762 for (uint32_t i = 0; i < param.columns; i++) {
Ben Clayton971318f2023-02-14 13:52:43 +00002763 ast::Type vec_type = param.create_column_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002764 args.Push(Call(vec_type));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002765 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002766
Ben Clayton971318f2023-02-14 13:52:43 +00002767 auto matrix_type = ty.mat(ty.Of(elem_type_alias), param.columns, param.rows);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002768 auto* tc = Call(Source{}, matrix_type, std::move(args));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002769 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002770
dan sinclair41e4d9a2022-05-01 14:40:55 +00002771 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002772}
2773
Ben Clayton54a104e2023-02-22 20:04:40 +00002774TEST_F(ResolverValueConstructorValidationTest, MatrixConstructor_ArgumentTypeAlias_Error) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002775 auto* alias = Alias("VectorUnsigned2", ty.vec2<u32>());
Ben Clayton66805b02023-06-14 22:00:01 +00002776 auto* tc = Call(Source{{12, 34}}, ty.mat2x2<f32>(), Call(ty.Of(alias)), Call<vec2<f32>>());
dan sinclair41e4d9a2022-05-01 14:40:55 +00002777 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002778
dan sinclair41e4d9a2022-05-01 14:40:55 +00002779 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00002780 EXPECT_THAT(
2781 r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00002782 HasSubstr("12:34 error: no matching constructor for mat2x2<f32>(vec2<u32>, vec2<f32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002783}
2784
Ben Clayton54a104e2023-02-22 20:04:40 +00002785TEST_P(MatrixConstructorTest, ArgumentTypeAlias_Success) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002786 const auto param = GetParam();
Zhaoming Jiang60588822022-06-28 14:03:36 +00002787
dan sinclaire4039c72023-02-17 21:58:59 +00002788 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002789
Ben Clayton971318f2023-02-14 13:52:43 +00002790 ast::Type matrix_type = param.create_mat_ast_type(*this);
2791 ast::Type vec_type = param.create_column_ast_type(*this);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002792 auto* vec_alias = Alias("ColVectorAlias", vec_type);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002793
Ben Clayton783b1692022-08-02 17:03:35 +00002794 utils::Vector<const ast::Expression*, 4> args;
Ben Clayton6ae608c2022-05-16 20:54:42 +00002795 for (uint32_t i = 0; i < param.columns; i++) {
Ben Clayton01ac21c2023-02-07 16:14:25 +00002796 args.Push(Call(ty.Of(vec_alias)));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002797 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002798
Ben Clayton01ac21c2023-02-07 16:14:25 +00002799 auto* tc = Call(Source{}, matrix_type, std::move(args));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002800 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002801
dan sinclair41e4d9a2022-05-01 14:40:55 +00002802 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002803}
2804
Ben Clayton54a104e2023-02-22 20:04:40 +00002805TEST_P(MatrixConstructorTest, ArgumentElementTypeAlias_Error) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002806 const auto param = GetParam();
Zhaoming Jiang60588822022-06-28 14:03:36 +00002807
dan sinclaire4039c72023-02-17 21:58:59 +00002808 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002809
Ben Clayton971318f2023-02-14 13:52:43 +00002810 ast::Type matrix_type = param.create_mat_ast_type(*this);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002811 auto* u32_type_alias = Alias("UnsignedInt", ty.u32());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002812
dan sinclairb23cda42023-02-28 17:31:54 +00002813 utils::StringStream args_tys;
Ben Clayton783b1692022-08-02 17:03:35 +00002814 utils::Vector<const ast::Expression*, 4> args;
Ben Clayton6ae608c2022-05-16 20:54:42 +00002815 for (uint32_t i = 0; i < param.columns; i++) {
Ben Clayton971318f2023-02-14 13:52:43 +00002816 auto vec_type = ty.vec(ty.Of(u32_type_alias), param.rows);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002817 args.Push(Call(vec_type));
Ben Clayton6ae608c2022-05-16 20:54:42 +00002818 if (i > 0) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002819 args_tys << ", ";
2820 }
2821 args_tys << "vec" << param.rows << "<u32>";
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002822 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002823
Ben Clayton01ac21c2023-02-07 16:14:25 +00002824 auto* tc = Call(Source{{12, 34}}, matrix_type, std::move(args));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002825 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002826
dan sinclair41e4d9a2022-05-01 14:40:55 +00002827 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00002828 EXPECT_THAT(r()->error(), HasSubstr("12:34 error: no matching constructor for " +
Ben Clayton3b5edf12022-05-16 21:14:11 +00002829 MatrixStr(param) + "(" + args_tys.str() + ")"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002830}
2831
Ben Clayton54a104e2023-02-22 20:04:40 +00002832TEST_P(MatrixConstructorTest, ArgumentElementTypeAlias_Success) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002833 const auto param = GetParam();
Zhaoming Jiang60588822022-06-28 14:03:36 +00002834
dan sinclaire4039c72023-02-17 21:58:59 +00002835 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002836
2837 auto* elem_type_alias = Alias("ElemType", param.create_element_ast_type(*this));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002838
Ben Clayton783b1692022-08-02 17:03:35 +00002839 utils::Vector<const ast::Expression*, 4> args;
Ben Clayton6ae608c2022-05-16 20:54:42 +00002840 for (uint32_t i = 0; i < param.columns; i++) {
Ben Clayton971318f2023-02-14 13:52:43 +00002841 auto vec_type = ty.vec(ty.Of(elem_type_alias), param.rows);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002842 args.Push(Call(vec_type));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002843 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002844
Ben Clayton971318f2023-02-14 13:52:43 +00002845 ast::Type matrix_type = param.create_mat_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002846 auto* tc = Call(Source{}, matrix_type, std::move(args));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002847 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002848
dan sinclair41e4d9a2022-05-01 14:40:55 +00002849 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002850}
2851
Ben Clayton54a104e2023-02-22 20:04:40 +00002852TEST_P(MatrixConstructorTest, InferElementTypeFromVectors) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002853 const auto param = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002854
dan sinclaire4039c72023-02-17 21:58:59 +00002855 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002856
Ben Clayton783b1692022-08-02 17:03:35 +00002857 utils::Vector<const ast::Expression*, 8> args;
Ben Clayton6ae608c2022-05-16 20:54:42 +00002858 for (uint32_t i = 0; i < param.columns; i++) {
Ben Clayton01ac21c2023-02-07 16:14:25 +00002859 args.Push(Call(param.create_column_ast_type(*this)));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002860 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002861
Ben Clayton971318f2023-02-14 13:52:43 +00002862 auto matrix_type = ty.mat<Infer>(param.columns, param.rows);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002863 auto* tc = Call(Source{}, matrix_type, std::move(args));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002864 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002865
dan sinclair41e4d9a2022-05-01 14:40:55 +00002866 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002867}
2868
Ben Clayton54a104e2023-02-22 20:04:40 +00002869TEST_P(MatrixConstructorTest, InferElementTypeFromScalars) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002870 const auto param = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002871
dan sinclaire4039c72023-02-17 21:58:59 +00002872 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002873
Ben Clayton783b1692022-08-02 17:03:35 +00002874 utils::Vector<const ast::Expression*, 8> args;
dan sinclair41e4d9a2022-05-01 14:40:55 +00002875 for (uint32_t i = 0; i < param.rows * param.columns; i++) {
Ben Clayton783b1692022-08-02 17:03:35 +00002876 args.Push(param.create_element_ast_value(*this, static_cast<double>(i)));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002877 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002878
Ben Clayton971318f2023-02-14 13:52:43 +00002879 auto matrix_type = ty.mat<Infer>(param.columns, param.rows);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002880 WrapInFunction(Call(Source{{12, 34}}, matrix_type, std::move(args)));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002881
dan sinclair41e4d9a2022-05-01 14:40:55 +00002882 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002883}
2884
Ben Clayton54a104e2023-02-22 20:04:40 +00002885TEST_P(MatrixConstructorTest, CannotInferElementTypeFromVectors_Mismatch) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002886 const auto param = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002887
dan sinclaire4039c72023-02-17 21:58:59 +00002888 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002889
dan sinclairb23cda42023-02-28 17:31:54 +00002890 utils::StringStream err;
Ben Clayton54a104e2023-02-22 20:04:40 +00002891 err << "12:34 error: no matching constructor for mat" << param.columns << "x" << param.rows
Ben Clayton6ae608c2022-05-16 20:54:42 +00002892 << "(";
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002893
Ben Clayton783b1692022-08-02 17:03:35 +00002894 utils::Vector<const ast::Expression*, 8> args;
dan sinclair41e4d9a2022-05-01 14:40:55 +00002895 for (uint32_t i = 0; i < param.columns; i++) {
Ben Clayton6ae608c2022-05-16 20:54:42 +00002896 if (i > 0) {
2897 err << ", ";
2898 }
dan sinclair41e4d9a2022-05-01 14:40:55 +00002899 if (i == 1) {
2900 // Odd one out
Ben Clayton01ac21c2023-02-07 16:14:25 +00002901 args.Push(Call(ty.vec<i32>(param.rows)));
Ben Clayton6ae608c2022-05-16 20:54:42 +00002902 err << "vec" << param.rows << "<i32>";
dan sinclair41e4d9a2022-05-01 14:40:55 +00002903 } else {
Ben Clayton01ac21c2023-02-07 16:14:25 +00002904 args.Push(Call(param.create_column_ast_type(*this)));
Zhaoming Jiang60588822022-06-28 14:03:36 +00002905 err << "vec" << param.rows << "<" + param.get_element_type_name() + ">";
dan sinclair41e4d9a2022-05-01 14:40:55 +00002906 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002907 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002908
Ben Clayton971318f2023-02-14 13:52:43 +00002909 auto matrix_type = ty.mat<Infer>(param.columns, param.rows);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002910 WrapInFunction(Call(Source{{12, 34}}, matrix_type, std::move(args)));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002911
dan sinclair41e4d9a2022-05-01 14:40:55 +00002912 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00002913 EXPECT_THAT(r()->error(), HasSubstr(err.str()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002914}
2915
Ben Clayton54a104e2023-02-22 20:04:40 +00002916TEST_P(MatrixConstructorTest, CannotInferElementTypeFromScalars_Mismatch) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002917 const auto param = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002918
dan sinclaire4039c72023-02-17 21:58:59 +00002919 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002920
dan sinclairb23cda42023-02-28 17:31:54 +00002921 utils::StringStream err;
Ben Clayton54a104e2023-02-22 20:04:40 +00002922 err << "12:34 error: no matching constructor for mat" << param.columns << "x" << param.rows
Ben Clayton6ae608c2022-05-16 20:54:42 +00002923 << "(";
2924
Ben Clayton783b1692022-08-02 17:03:35 +00002925 utils::Vector<const ast::Expression*, 16> args;
dan sinclair41e4d9a2022-05-01 14:40:55 +00002926 for (uint32_t i = 0; i < param.rows * param.columns; i++) {
Ben Clayton6ae608c2022-05-16 20:54:42 +00002927 if (i > 0) {
2928 err << ", ";
2929 }
dan sinclair41e4d9a2022-05-01 14:40:55 +00002930 if (i == 3) {
Ben Clayton783b1692022-08-02 17:03:35 +00002931 args.Push(Expr(static_cast<i32>(i))); // The odd one out
Ben Clayton6ae608c2022-05-16 20:54:42 +00002932 err << "i32";
dan sinclair41e4d9a2022-05-01 14:40:55 +00002933 } else {
Ben Clayton783b1692022-08-02 17:03:35 +00002934 args.Push(param.create_element_ast_value(*this, static_cast<double>(i)));
Zhaoming Jiang60588822022-06-28 14:03:36 +00002935 err << param.get_element_type_name();
dan sinclair41e4d9a2022-05-01 14:40:55 +00002936 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002937 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002938
Ben Clayton6ae608c2022-05-16 20:54:42 +00002939 err << ")";
2940
Ben Clayton971318f2023-02-14 13:52:43 +00002941 auto matrix_type = ty.mat<Infer>(param.columns, param.rows);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002942 WrapInFunction(Call(Source{{12, 34}}, matrix_type, std::move(args)));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002943
dan sinclair41e4d9a2022-05-01 14:40:55 +00002944 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00002945 EXPECT_THAT(r()->error(), HasSubstr(err.str()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002946}
2947
Ben Clayton54a104e2023-02-22 20:04:40 +00002948INSTANTIATE_TEST_SUITE_P(ResolverValueConstructorValidationTest,
2949 MatrixConstructorTest,
Zhaoming Jiang60588822022-06-28 14:03:36 +00002950 testing::Values(MatrixParamsFor<f32, 2, 2>(),
2951 MatrixParamsFor<f32, 3, 2>(),
2952 MatrixParamsFor<f32, 4, 2>(),
2953 MatrixParamsFor<f32, 2, 3>(),
2954 MatrixParamsFor<f32, 3, 3>(),
2955 MatrixParamsFor<f32, 4, 3>(),
2956 MatrixParamsFor<f32, 2, 4>(),
2957 MatrixParamsFor<f32, 3, 4>(),
2958 MatrixParamsFor<f32, 4, 4>(),
2959 MatrixParamsFor<f16, 2, 2>(),
2960 MatrixParamsFor<f16, 3, 2>(),
2961 MatrixParamsFor<f16, 4, 2>(),
2962 MatrixParamsFor<f16, 2, 3>(),
2963 MatrixParamsFor<f16, 3, 3>(),
2964 MatrixParamsFor<f16, 4, 3>(),
2965 MatrixParamsFor<f16, 2, 4>(),
2966 MatrixParamsFor<f16, 3, 4>(),
2967 MatrixParamsFor<f16, 4, 4>()));
Ben Clayton54a104e2023-02-22 20:04:40 +00002968} // namespace MatrixConstructor
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002969
Ben Clayton54a104e2023-02-22 20:04:40 +00002970namespace StructConstructor {
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002971using builder::CreatePtrs;
2972using builder::CreatePtrsFor;
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002973
2974constexpr CreatePtrs all_types[] = {
2975 CreatePtrsFor<bool>(), //
2976 CreatePtrsFor<u32>(), //
2977 CreatePtrsFor<i32>(), //
2978 CreatePtrsFor<f32>(), //
Zhaoming Jiang60588822022-06-28 14:03:36 +00002979 CreatePtrsFor<f16>(), //
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002980 CreatePtrsFor<vec4<bool>>(), //
2981 CreatePtrsFor<vec2<i32>>(), //
2982 CreatePtrsFor<vec3<u32>>(), //
2983 CreatePtrsFor<vec4<f32>>(), //
Zhaoming Jiang60588822022-06-28 14:03:36 +00002984 CreatePtrsFor<vec4<f16>>(), //
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002985 CreatePtrsFor<mat2x2<f32>>(), //
2986 CreatePtrsFor<mat3x3<f32>>(), //
Zhaoming Jiang60588822022-06-28 14:03:36 +00002987 CreatePtrsFor<mat4x4<f32>>(), //
2988 CreatePtrsFor<mat2x2<f16>>(), //
2989 CreatePtrsFor<mat3x3<f16>>(), //
2990 CreatePtrsFor<mat4x4<f16>>() //
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002991};
2992
2993auto number_of_members = testing::Values(2u, 32u, 64u);
2994
Ben Clayton54a104e2023-02-22 20:04:40 +00002995using StructConstructorInputsTest =
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002996 ResolverTestWithParam<std::tuple<CreatePtrs, // struct member type
2997 uint32_t>>; // number of struct members
Ben Clayton54a104e2023-02-22 20:04:40 +00002998TEST_P(StructConstructorInputsTest, TooFew) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002999 auto& param = GetParam();
3000 auto& str_params = std::get<0>(param);
3001 uint32_t N = std::get<1>(param);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003002
dan sinclaire4039c72023-02-17 21:58:59 +00003003 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00003004
Ben Clayton783b1692022-08-02 17:03:35 +00003005 utils::Vector<const ast::StructMember*, 16> members;
3006 utils::Vector<const ast::Expression*, 16> values;
dan sinclair41e4d9a2022-05-01 14:40:55 +00003007 for (uint32_t i = 0; i < N; i++) {
Ben Clayton971318f2023-02-14 13:52:43 +00003008 ast::Type struct_type = str_params.ast(*this);
Ben Clayton783b1692022-08-02 17:03:35 +00003009 members.Push(Member("member_" + std::to_string(i), struct_type));
dan sinclair41e4d9a2022-05-01 14:40:55 +00003010 if (i < N - 1) {
Antonio Maioranob6d524382022-08-31 22:59:08 +00003011 auto* ctor_value_expr = str_params.expr_from_double(*this, 0);
Ben Clayton783b1692022-08-02 17:03:35 +00003012 values.Push(ctor_value_expr);
dan sinclair41e4d9a2022-05-01 14:40:55 +00003013 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003014 }
dan sinclair41e4d9a2022-05-01 14:40:55 +00003015 auto* s = Structure("s", members);
Ben Clayton01ac21c2023-02-07 16:14:25 +00003016 auto* tc = Call(Source{{12, 34}}, ty.Of(s), values);
dan sinclair41e4d9a2022-05-01 14:40:55 +00003017 WrapInFunction(tc);
3018 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00003019 EXPECT_EQ(r()->error(), "12:34 error: structure constructor has too few inputs: expected " +
dan sinclair41e4d9a2022-05-01 14:40:55 +00003020 std::to_string(N) + ", found " + std::to_string(N - 1));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003021}
3022
Ben Clayton54a104e2023-02-22 20:04:40 +00003023TEST_P(StructConstructorInputsTest, TooMany) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003024 auto& param = GetParam();
3025 auto& str_params = std::get<0>(param);
3026 uint32_t N = std::get<1>(param);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003027
dan sinclaire4039c72023-02-17 21:58:59 +00003028 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00003029
Ben Clayton783b1692022-08-02 17:03:35 +00003030 utils::Vector<const ast::StructMember*, 16> members;
3031 utils::Vector<const ast::Expression*, 8> values;
dan sinclair41e4d9a2022-05-01 14:40:55 +00003032 for (uint32_t i = 0; i < N + 1; i++) {
3033 if (i < N) {
Ben Clayton971318f2023-02-14 13:52:43 +00003034 ast::Type struct_type = str_params.ast(*this);
Ben Clayton783b1692022-08-02 17:03:35 +00003035 members.Push(Member("member_" + std::to_string(i), struct_type));
dan sinclair41e4d9a2022-05-01 14:40:55 +00003036 }
Antonio Maioranob6d524382022-08-31 22:59:08 +00003037 auto* ctor_value_expr = str_params.expr_from_double(*this, 0);
Ben Clayton783b1692022-08-02 17:03:35 +00003038 values.Push(ctor_value_expr);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003039 }
dan sinclair41e4d9a2022-05-01 14:40:55 +00003040 auto* s = Structure("s", members);
Ben Clayton01ac21c2023-02-07 16:14:25 +00003041 auto* tc = Call(Source{{12, 34}}, ty.Of(s), values);
dan sinclair41e4d9a2022-05-01 14:40:55 +00003042 WrapInFunction(tc);
3043 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00003044 EXPECT_EQ(r()->error(), "12:34 error: structure constructor has too many inputs: expected " +
dan sinclair41e4d9a2022-05-01 14:40:55 +00003045 std::to_string(N) + ", found " + std::to_string(N + 1));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003046}
3047
Ben Clayton54a104e2023-02-22 20:04:40 +00003048INSTANTIATE_TEST_SUITE_P(ResolverValueConstructorValidationTest,
3049 StructConstructorInputsTest,
dan sinclair41e4d9a2022-05-01 14:40:55 +00003050 testing::Combine(testing::ValuesIn(all_types), number_of_members));
Ben Clayton54a104e2023-02-22 20:04:40 +00003051using StructConstructorTypeTest =
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003052 ResolverTestWithParam<std::tuple<CreatePtrs, // struct member type
Ben Clayton54a104e2023-02-22 20:04:40 +00003053 CreatePtrs, // constructor value type
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003054 uint32_t>>; // number of struct members
Ben Clayton54a104e2023-02-22 20:04:40 +00003055TEST_P(StructConstructorTypeTest, AllTypes) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003056 auto& param = GetParam();
3057 auto& str_params = std::get<0>(param);
3058 auto& ctor_params = std::get<1>(param);
3059 uint32_t N = std::get<2>(param);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003060
dan sinclaire4039c72023-02-17 21:58:59 +00003061 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00003062
dan sinclair41e4d9a2022-05-01 14:40:55 +00003063 if (str_params.ast == ctor_params.ast) {
3064 return;
3065 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003066
Ben Clayton783b1692022-08-02 17:03:35 +00003067 utils::Vector<const ast::StructMember*, 16> members;
3068 utils::Vector<const ast::Expression*, 8> values;
Ben Clayton54a104e2023-02-22 20:04:40 +00003069 // make the last value of the constructor to have a different type
3070 uint32_t constructor_value_with_different_type = N - 1;
dan sinclair41e4d9a2022-05-01 14:40:55 +00003071 for (uint32_t i = 0; i < N; i++) {
Ben Clayton971318f2023-02-14 13:52:43 +00003072 ast::Type struct_type = str_params.ast(*this);
Ben Clayton783b1692022-08-02 17:03:35 +00003073 members.Push(Member("member_" + std::to_string(i), struct_type));
Ben Clayton54a104e2023-02-22 20:04:40 +00003074 auto* ctor_value_expr = (i == constructor_value_with_different_type)
Antonio Maioranob6d524382022-08-31 22:59:08 +00003075 ? ctor_params.expr_from_double(*this, 0)
3076 : str_params.expr_from_double(*this, 0);
Ben Clayton783b1692022-08-02 17:03:35 +00003077 values.Push(ctor_value_expr);
dan sinclair41e4d9a2022-05-01 14:40:55 +00003078 }
3079 auto* s = Structure("s", members);
Ben Clayton01ac21c2023-02-07 16:14:25 +00003080 auto* tc = Call(ty.Of(s), values);
dan sinclair41e4d9a2022-05-01 14:40:55 +00003081 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003082
dan sinclairb23cda42023-02-28 17:31:54 +00003083 utils::StringStream err;
Ben Clayton54a104e2023-02-22 20:04:40 +00003084 err << "error: type in structure constructor does not match struct member ";
Ben Clayton971318f2023-02-14 13:52:43 +00003085 err << "type: expected '" << str_params.name() << "', found '" << ctor_params.name() << "'";
dan sinclair41e4d9a2022-05-01 14:40:55 +00003086 EXPECT_FALSE(r()->Resolve());
3087 EXPECT_EQ(r()->error(), err.str());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003088}
3089
Ben Clayton54a104e2023-02-22 20:04:40 +00003090INSTANTIATE_TEST_SUITE_P(ResolverValueConstructorValidationTest,
3091 StructConstructorTypeTest,
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003092 testing::Combine(testing::ValuesIn(all_types),
3093 testing::ValuesIn(all_types),
3094 number_of_members));
3095
Ben Clayton54a104e2023-02-22 20:04:40 +00003096TEST_F(ResolverValueConstructorValidationTest, Struct_Nested) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003097 auto* inner_m = Member("m", ty.i32());
Ben Clayton783b1692022-08-02 17:03:35 +00003098 auto* inner_s = Structure("inner_s", utils::Vector{inner_m});
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003099
dan sinclair41e4d9a2022-05-01 14:40:55 +00003100 auto* m0 = Member("m0", ty.i32());
3101 auto* m1 = Member("m1", ty.Of(inner_s));
3102 auto* m2 = Member("m2", ty.i32());
Ben Clayton783b1692022-08-02 17:03:35 +00003103 auto* s = Structure("s", utils::Vector{m0, m1, m2});
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003104
Ben Clayton01ac21c2023-02-07 16:14:25 +00003105 auto* tc = Call(Source{{12, 34}}, ty.Of(s), 1_i, 1_i, 1_i);
dan sinclair41e4d9a2022-05-01 14:40:55 +00003106 WrapInFunction(tc);
3107 EXPECT_FALSE(r()->Resolve());
3108 EXPECT_EQ(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00003109 "error: type in structure constructor does not match struct member "
dan sinclair41e4d9a2022-05-01 14:40:55 +00003110 "type: expected 'inner_s', found 'i32'");
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003111}
3112
Ben Clayton54a104e2023-02-22 20:04:40 +00003113TEST_F(ResolverValueConstructorValidationTest, Struct) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003114 auto* m = Member("m", ty.i32());
Ben Clayton783b1692022-08-02 17:03:35 +00003115 auto* s = Structure("MyInputs", utils::Vector{m});
Ben Clayton01ac21c2023-02-07 16:14:25 +00003116 auto* tc = Call(Source{{12, 34}}, ty.Of(s));
dan sinclair41e4d9a2022-05-01 14:40:55 +00003117 WrapInFunction(tc);
3118 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003119}
3120
Ben Clayton54a104e2023-02-22 20:04:40 +00003121TEST_F(ResolverValueConstructorValidationTest, Struct_Empty) {
Ben Clayton783b1692022-08-02 17:03:35 +00003122 auto* str = Structure("S", utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +00003123 Member("a", ty.i32()),
3124 Member("b", ty.f32()),
3125 Member("c", ty.vec3<i32>()),
3126 });
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003127
Ben Clayton01ac21c2023-02-07 16:14:25 +00003128 WrapInFunction(Call(ty.Of(str)));
dan sinclair41e4d9a2022-05-01 14:40:55 +00003129 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003130}
Ben Clayton54a104e2023-02-22 20:04:40 +00003131} // namespace StructConstructor
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003132
Ben Clayton54a104e2023-02-22 20:04:40 +00003133TEST_F(ResolverValueConstructorValidationTest, NonConstructibleType_Atomic) {
Ben Clayton01ac21c2023-02-07 16:14:25 +00003134 WrapInFunction(Assign(Phony(), Call(Source{{12, 34}}, ty.atomic(ty.i32()))));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003135
dan sinclair41e4d9a2022-05-01 14:40:55 +00003136 EXPECT_FALSE(r()->Resolve());
3137 EXPECT_EQ(r()->error(), "12:34 error: type is not constructible");
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003138}
3139
Ben Clayton54a104e2023-02-22 20:04:40 +00003140TEST_F(ResolverValueConstructorValidationTest, NonConstructibleType_AtomicArray) {
Ben Clayton01ac21c2023-02-07 16:14:25 +00003141 WrapInFunction(Assign(Phony(), Call(Source{{12, 34}}, ty.array(ty.atomic(ty.i32()), 4_i))));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003142
dan sinclair41e4d9a2022-05-01 14:40:55 +00003143 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00003144 EXPECT_EQ(r()->error(), "12:34 error: array constructor has non-constructible element type");
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003145}
3146
Ben Clayton54a104e2023-02-22 20:04:40 +00003147TEST_F(ResolverValueConstructorValidationTest, NonConstructibleType_AtomicStructMember) {
Ben Clayton783b1692022-08-02 17:03:35 +00003148 auto* str = Structure("S", utils::Vector{Member("a", ty.atomic(ty.i32()))});
Ben Clayton01ac21c2023-02-07 16:14:25 +00003149 WrapInFunction(Assign(Phony(), Call(Source{{12, 34}}, ty.Of(str))));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003150
dan sinclair41e4d9a2022-05-01 14:40:55 +00003151 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00003152 EXPECT_EQ(r()->error(), "12:34 error: structure constructor has non-constructible type");
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003153}
3154
Ben Clayton54a104e2023-02-22 20:04:40 +00003155TEST_F(ResolverValueConstructorValidationTest, NonConstructibleType_Sampler) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003156 WrapInFunction(
Ben Clayton01ac21c2023-02-07 16:14:25 +00003157 Assign(Phony(), Call(Source{{12, 34}}, ty.sampler(type::SamplerKind::kSampler))));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003158
dan sinclair41e4d9a2022-05-01 14:40:55 +00003159 EXPECT_FALSE(r()->Resolve());
3160 EXPECT_EQ(r()->error(), "12:34 error: type is not constructible");
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003161}
3162
Ben Clayton54a104e2023-02-22 20:04:40 +00003163TEST_F(ResolverValueConstructorValidationTest, BuilinTypeConstructorAsStatement) {
Ben Clayton66805b02023-06-14 22:00:01 +00003164 WrapInFunction(CallStmt(Call<vec2<f32>>(Source{{12, 34}}, 1_f, 2_f)));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003165
dan sinclair41e4d9a2022-05-01 14:40:55 +00003166 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00003167 EXPECT_EQ(r()->error(), "12:34 error: value constructor evaluated but not used");
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003168}
3169
Ben Clayton54a104e2023-02-22 20:04:40 +00003170TEST_F(ResolverValueConstructorValidationTest, StructConstructorAsStatement) {
Ben Claytoneb30a0d2023-02-09 23:19:42 +00003171 Structure("S", utils::Vector{Member("m", ty.i32())});
3172 WrapInFunction(CallStmt(Call(Source{{12, 34}}, "S", 1_a)));
3173
3174 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00003175 EXPECT_EQ(r()->error(), "12:34 error: value constructor evaluated but not used");
Ben Claytoneb30a0d2023-02-09 23:19:42 +00003176}
3177
Ben Clayton54a104e2023-02-22 20:04:40 +00003178TEST_F(ResolverValueConstructorValidationTest, AliasConstructorAsStatement) {
Ben Claytoneb30a0d2023-02-09 23:19:42 +00003179 Alias("A", ty.i32());
3180 WrapInFunction(CallStmt(Call(Source{{12, 34}}, "A", 1_i)));
3181
3182 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00003183 EXPECT_EQ(r()->error(), "12:34 error: value constructor evaluated but not used");
Ben Claytoneb30a0d2023-02-09 23:19:42 +00003184}
3185
Ben Clayton54a104e2023-02-22 20:04:40 +00003186TEST_F(ResolverValueConstructorValidationTest, BuilinTypeConversionAsStatement) {
Ben Clayton01ac21c2023-02-07 16:14:25 +00003187 WrapInFunction(CallStmt(Call(Source{{12, 34}}, ty.f32(), 1_i)));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003188
dan sinclair41e4d9a2022-05-01 14:40:55 +00003189 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00003190 EXPECT_EQ(r()->error(), "12:34 error: value conversion evaluated but not used");
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003191}
3192
Ben Clayton54a104e2023-02-22 20:04:40 +00003193TEST_F(ResolverValueConstructorValidationTest, AliasConversionAsStatement) {
Ben Claytoneb30a0d2023-02-09 23:19:42 +00003194 Alias("A", ty.i32());
3195 WrapInFunction(CallStmt(Call(Source{{12, 34}}, "A", 1_f)));
3196
3197 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00003198 EXPECT_EQ(r()->error(), "12:34 error: value conversion evaluated but not used");
Ben Claytoneb30a0d2023-02-09 23:19:42 +00003199}
3200
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003201} // namespace
dan sinclaird2093792022-04-07 17:45:45 +00003202} // namespace tint::resolver