blob: 7e4b2da21c0d1d37c814d5242241537eed081996 [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"
Ben Claytond368f2c2023-08-01 00:37:35 +000017#include "src/tint/lang/wgsl/resolver/resolver_helper_test.h"
dan sinclaird3b13692023-07-20 01:14:15 +000018#include "src/tint/lang/wgsl/sem/value_constructor.h"
19#include "src/tint/lang/wgsl/sem/value_conversion.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 Claytoncd52f382023-08-07 13:11:08 +000025using namespace tint::core::fluent_types; // NOLINT
dan sinclairce6dffe2023-08-14 21:01:40 +000026using namespace tint::core::number_suffixes; // NOLINT
Ben Clayton66805b02023-06-14 22:00:01 +000027
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 sinclaircedcdf32023-08-10 02:39:48 +000064 ASSERT_TRUE(TypeOf(a_ident)->Is<core::type::Reference>());
65 EXPECT_TRUE(TypeOf(a_ident)->As<core::type::Reference>()->StoreType()->Is<core::type::I32>());
66 EXPECT_EQ(TypeOf(a_ident)->As<core::type::Reference>()->AddressSpace(),
Ben Claytoncd52f382023-08-07 13:11:08 +000067 core::AddressSpace::kFunction);
dan sinclaircedcdf32023-08-10 02:39:48 +000068 ASSERT_TRUE(TypeOf(b_ident)->Is<core::type::Reference>());
69 EXPECT_TRUE(TypeOf(b_ident)->As<core::type::Reference>()->StoreType()->Is<core::type::I32>());
70 EXPECT_EQ(TypeOf(b_ident)->As<core::type::Reference>()->AddressSpace(),
Ben Claytoncd52f382023-08-07 13:11:08 +000071 core::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
Ben Claytoncd52f382023-08-07 13:11:08 +000082 Enable(core::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 sinclaircedcdf32023-08-10 02:39:48 +000094 auto* expected = create<core::type::Reference>(
Ben Claytoncd52f382023-08-07 13:11:08 +000095 core::AddressSpace::kFunction, params.create_rhs_sem_type(*this), core::Access::kReadWrite);
dan sinclair41e4d9a2022-05-01 14:40:55 +000096 ASSERT_EQ(got, expected) << "got: " << FriendlyName(got) << "\n"
97 << "expected: " << FriendlyName(expected) << "\n";
Ryan Harrisondbc13af2022-02-21 15:19:07 +000098}
99
Ben Clayton54a104e2023-02-22 20:04:40 +0000100static constexpr Params from_constructor_expression_cases[] = {
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000101 ParamsFor<bool>(),
102 ParamsFor<i32>(),
103 ParamsFor<u32>(),
104 ParamsFor<f32>(),
Zhaoming Jiang60588822022-06-28 14:03:36 +0000105 ParamsFor<f16>(),
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000106 ParamsFor<vec3<i32>>(),
107 ParamsFor<vec3<u32>>(),
108 ParamsFor<vec3<f32>>(),
Zhaoming Jiang60588822022-06-28 14:03:36 +0000109 ParamsFor<vec3<f16>>(),
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000110 ParamsFor<mat3x3<f32>>(),
Zhaoming Jiang60588822022-06-28 14:03:36 +0000111 ParamsFor<mat3x3<f16>>(),
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000112 ParamsFor<alias<bool>>(),
113 ParamsFor<alias<i32>>(),
114 ParamsFor<alias<u32>>(),
115 ParamsFor<alias<f32>>(),
Zhaoming Jiang60588822022-06-28 14:03:36 +0000116 ParamsFor<alias<f16>>(),
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000117 ParamsFor<alias<vec3<i32>>>(),
118 ParamsFor<alias<vec3<u32>>>(),
119 ParamsFor<alias<vec3<f32>>>(),
Zhaoming Jiang60588822022-06-28 14:03:36 +0000120 ParamsFor<alias<vec3<f16>>>(),
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000121 ParamsFor<alias<mat3x3<f32>>>(),
Zhaoming Jiang60588822022-06-28 14:03:36 +0000122 ParamsFor<alias<mat3x3<f16>>>(),
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000123};
Ben Clayton54a104e2023-02-22 20:04:40 +0000124INSTANTIATE_TEST_SUITE_P(ResolverValueConstructorValidationTest,
125 InferTypeTest_FromConstructorExpression,
126 testing::ValuesIn(from_constructor_expression_cases));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000127
128using InferTypeTest_FromArithmeticExpression = ResolverTestWithParam<Params>;
129TEST_P(InferTypeTest_FromArithmeticExpression, All) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000130 // e.g. for vec3<f32>
131 // {
132 // var a = vec3<f32>(2.0, 2.0, 2.0) * 3.0;
133 // }
134 auto& params = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000135
dan sinclair41e4d9a2022-05-01 14:40:55 +0000136 auto* arith_lhs_expr = params.create_rhs_ast_value(*this, 2);
137 auto* arith_rhs_expr = params.create_rhs_ast_value(*this, 3);
dan sinclair6e77b472022-10-20 13:38:28 +0000138 auto* initializer_expr = Mul(arith_lhs_expr, arith_rhs_expr);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000139
dan sinclair6e77b472022-10-20 13:38:28 +0000140 auto* a = Var("a", initializer_expr);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000141 // Self-assign 'a' to force the expression to be resolved so we can test its
142 // type below
143 auto* a_ident = Expr("a");
144 WrapInFunction(Decl(a), Assign(a_ident, "a"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000145
dan sinclair41e4d9a2022-05-01 14:40:55 +0000146 ASSERT_TRUE(r()->Resolve()) << r()->error();
147 auto* got = TypeOf(a_ident);
dan sinclaircedcdf32023-08-10 02:39:48 +0000148 auto* expected = create<core::type::Reference>(
Ben Claytoncd52f382023-08-07 13:11:08 +0000149 core::AddressSpace::kFunction, params.create_rhs_sem_type(*this), core::Access::kReadWrite);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000150 ASSERT_EQ(got, expected) << "got: " << FriendlyName(got) << "\n"
151 << "expected: " << FriendlyName(expected) << "\n";
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000152}
153static constexpr Params from_arithmetic_expression_cases[] = {
Ben Clayton6ae608c2022-05-16 20:54:42 +0000154 ParamsFor<i32>(),
155 ParamsFor<u32>(),
156 ParamsFor<f32>(),
157 ParamsFor<vec3<f32>>(),
158 ParamsFor<mat3x3<f32>>(),
159 ParamsFor<alias<i32>>(),
160 ParamsFor<alias<u32>>(),
161 ParamsFor<alias<f32>>(),
162 ParamsFor<alias<vec3<f32>>>(),
163 ParamsFor<alias<mat3x3<f32>>>(),
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000164};
Ben Clayton54a104e2023-02-22 20:04:40 +0000165INSTANTIATE_TEST_SUITE_P(ResolverValueConstructorValidationTest,
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000166 InferTypeTest_FromArithmeticExpression,
167 testing::ValuesIn(from_arithmetic_expression_cases));
168
169using InferTypeTest_FromCallExpression = ResolverTestWithParam<Params>;
170TEST_P(InferTypeTest_FromCallExpression, All) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000171 // e.g. for vec3<f32>
172 //
173 // fn foo() -> vec3<f32> {
174 // return vec3<f32>();
175 // }
176 //
177 // fn bar()
178 // {
179 // var a = foo();
180 // }
181 auto& params = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000182
Ben Claytoncd52f382023-08-07 13:11:08 +0000183 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +0000184
dan sinclairbae54e72023-07-28 15:01:54 +0000185 Func("foo", tint::Empty, params.create_rhs_ast_type(*this),
186 Vector{Return(Call(params.create_rhs_ast_type(*this)))}, {});
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000187
Ben Clayton58794ae2022-08-19 17:28:53 +0000188 auto* a = Var("a", Call("foo"));
dan sinclair41e4d9a2022-05-01 14:40:55 +0000189 // Self-assign 'a' to force the expression to be resolved so we can test its
190 // type below
191 auto* a_ident = Expr("a");
192 WrapInFunction(Decl(a), Assign(a_ident, "a"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000193
dan sinclair41e4d9a2022-05-01 14:40:55 +0000194 ASSERT_TRUE(r()->Resolve()) << r()->error();
195 auto* got = TypeOf(a_ident);
dan sinclaircedcdf32023-08-10 02:39:48 +0000196 auto* expected = create<core::type::Reference>(
Ben Claytoncd52f382023-08-07 13:11:08 +0000197 core::AddressSpace::kFunction, params.create_rhs_sem_type(*this), core::Access::kReadWrite);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000198 ASSERT_EQ(got, expected) << "got: " << FriendlyName(got) << "\n"
199 << "expected: " << FriendlyName(expected) << "\n";
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000200}
201static constexpr Params from_call_expression_cases[] = {
202 ParamsFor<bool>(),
203 ParamsFor<i32>(),
204 ParamsFor<u32>(),
205 ParamsFor<f32>(),
Zhaoming Jiang60588822022-06-28 14:03:36 +0000206 ParamsFor<f16>(),
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000207 ParamsFor<vec3<i32>>(),
208 ParamsFor<vec3<u32>>(),
209 ParamsFor<vec3<f32>>(),
Zhaoming Jiang60588822022-06-28 14:03:36 +0000210 ParamsFor<vec3<f16>>(),
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000211 ParamsFor<mat3x3<f32>>(),
Zhaoming Jiang60588822022-06-28 14:03:36 +0000212 ParamsFor<mat3x3<f16>>(),
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000213 ParamsFor<alias<bool>>(),
214 ParamsFor<alias<i32>>(),
215 ParamsFor<alias<u32>>(),
216 ParamsFor<alias<f32>>(),
Zhaoming Jiang60588822022-06-28 14:03:36 +0000217 ParamsFor<alias<f16>>(),
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000218 ParamsFor<alias<vec3<i32>>>(),
219 ParamsFor<alias<vec3<u32>>>(),
220 ParamsFor<alias<vec3<f32>>>(),
Zhaoming Jiang60588822022-06-28 14:03:36 +0000221 ParamsFor<alias<vec3<f16>>>(),
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000222 ParamsFor<alias<mat3x3<f32>>>(),
Zhaoming Jiang60588822022-06-28 14:03:36 +0000223 ParamsFor<alias<mat3x3<f16>>>(),
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000224};
Ben Clayton54a104e2023-02-22 20:04:40 +0000225INSTANTIATE_TEST_SUITE_P(ResolverValueConstructorValidationTest,
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000226 InferTypeTest_FromCallExpression,
227 testing::ValuesIn(from_call_expression_cases));
228
229} // namespace InferTypeTest
230
231namespace ConversionConstructTest {
232enum class Kind {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000233 Construct,
234 Conversion,
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000235};
236
237struct Params {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000238 Kind kind;
239 builder::ast_type_func_ptr lhs_type;
240 builder::ast_type_func_ptr rhs_type;
Antonio Maioranob6d524382022-08-31 22:59:08 +0000241 builder::ast_expr_from_double_func_ptr rhs_value_expr;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000242};
243
244template <typename LhsType, typename RhsType>
245constexpr Params ParamsFor(Kind kind) {
Antonio Maioranob6d524382022-08-31 22:59:08 +0000246 return Params{kind, DataType<LhsType>::AST, DataType<RhsType>::AST,
247 DataType<RhsType>::ExprFromDouble};
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000248}
249
250static constexpr Params valid_cases[] = {
Ben Clayton3b5edf12022-05-16 21:14:11 +0000251 // Identity
252 ParamsFor<bool, bool>(Kind::Construct), //
253 ParamsFor<i32, i32>(Kind::Construct), //
254 ParamsFor<u32, u32>(Kind::Construct), //
255 ParamsFor<f32, f32>(Kind::Construct), //
Zhaoming Jiang60588822022-06-28 14:03:36 +0000256 ParamsFor<f16, f16>(Kind::Construct), //
Ben Clayton3b5edf12022-05-16 21:14:11 +0000257 ParamsFor<vec3<bool>, vec3<bool>>(Kind::Construct), //
258 ParamsFor<vec3<i32>, vec3<i32>>(Kind::Construct), //
259 ParamsFor<vec3<u32>, vec3<u32>>(Kind::Construct), //
260 ParamsFor<vec3<f32>, vec3<f32>>(Kind::Construct), //
Zhaoming Jiang60588822022-06-28 14:03:36 +0000261 ParamsFor<vec3<f16>, vec3<f16>>(Kind::Construct), //
Ben Clayton3b5edf12022-05-16 21:14:11 +0000262 ParamsFor<mat3x3<f32>, mat3x3<f32>>(Kind::Construct), //
263 ParamsFor<mat2x3<f32>, mat2x3<f32>>(Kind::Construct), //
264 ParamsFor<mat3x2<f32>, mat3x2<f32>>(Kind::Construct), //
Zhaoming Jiang60588822022-06-28 14:03:36 +0000265 ParamsFor<mat3x3<f16>, mat3x3<f16>>(Kind::Construct), //
266 ParamsFor<mat2x3<f16>, mat2x3<f16>>(Kind::Construct), //
267 ParamsFor<mat3x2<f16>, mat3x2<f16>>(Kind::Construct), //
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000268
269 // Splat
270 ParamsFor<vec3<bool>, bool>(Kind::Construct), //
271 ParamsFor<vec3<i32>, i32>(Kind::Construct), //
272 ParamsFor<vec3<u32>, u32>(Kind::Construct), //
273 ParamsFor<vec3<f32>, f32>(Kind::Construct), //
Zhaoming Jiang60588822022-06-28 14:03:36 +0000274 ParamsFor<vec3<f16>, f16>(Kind::Construct), //
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000275
276 // Conversion
277 ParamsFor<bool, u32>(Kind::Conversion), //
278 ParamsFor<bool, i32>(Kind::Conversion), //
279 ParamsFor<bool, f32>(Kind::Conversion), //
Zhaoming Jiang60588822022-06-28 14:03:36 +0000280 ParamsFor<bool, f16>(Kind::Conversion), //
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000281
282 ParamsFor<i32, bool>(Kind::Conversion), //
283 ParamsFor<i32, u32>(Kind::Conversion), //
284 ParamsFor<i32, f32>(Kind::Conversion), //
Zhaoming Jiang60588822022-06-28 14:03:36 +0000285 ParamsFor<i32, f16>(Kind::Conversion), //
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000286
287 ParamsFor<u32, bool>(Kind::Conversion), //
288 ParamsFor<u32, i32>(Kind::Conversion), //
289 ParamsFor<u32, f32>(Kind::Conversion), //
Zhaoming Jiang60588822022-06-28 14:03:36 +0000290 ParamsFor<u32, f16>(Kind::Conversion), //
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000291
292 ParamsFor<f32, bool>(Kind::Conversion), //
293 ParamsFor<f32, u32>(Kind::Conversion), //
294 ParamsFor<f32, i32>(Kind::Conversion), //
Zhaoming Jiang60588822022-06-28 14:03:36 +0000295 ParamsFor<f32, f16>(Kind::Conversion), //
296
297 ParamsFor<f16, bool>(Kind::Conversion), //
298 ParamsFor<f16, u32>(Kind::Conversion), //
299 ParamsFor<f16, i32>(Kind::Conversion), //
300 ParamsFor<f16, f32>(Kind::Conversion), //
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000301
302 ParamsFor<vec3<bool>, vec3<u32>>(Kind::Conversion), //
303 ParamsFor<vec3<bool>, vec3<i32>>(Kind::Conversion), //
304 ParamsFor<vec3<bool>, vec3<f32>>(Kind::Conversion), //
Zhaoming Jiang60588822022-06-28 14:03:36 +0000305 ParamsFor<vec3<bool>, vec3<f16>>(Kind::Conversion), //
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000306
307 ParamsFor<vec3<i32>, vec3<bool>>(Kind::Conversion), //
308 ParamsFor<vec3<i32>, vec3<u32>>(Kind::Conversion), //
309 ParamsFor<vec3<i32>, vec3<f32>>(Kind::Conversion), //
Zhaoming Jiang60588822022-06-28 14:03:36 +0000310 ParamsFor<vec3<i32>, vec3<f16>>(Kind::Conversion), //
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000311
312 ParamsFor<vec3<u32>, vec3<bool>>(Kind::Conversion), //
313 ParamsFor<vec3<u32>, vec3<i32>>(Kind::Conversion), //
314 ParamsFor<vec3<u32>, vec3<f32>>(Kind::Conversion), //
Zhaoming Jiang60588822022-06-28 14:03:36 +0000315 ParamsFor<vec3<u32>, vec3<f16>>(Kind::Conversion), //
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000316
317 ParamsFor<vec3<f32>, vec3<bool>>(Kind::Conversion), //
318 ParamsFor<vec3<f32>, vec3<u32>>(Kind::Conversion), //
319 ParamsFor<vec3<f32>, vec3<i32>>(Kind::Conversion), //
Zhaoming Jiang60588822022-06-28 14:03:36 +0000320 ParamsFor<vec3<f32>, vec3<f16>>(Kind::Conversion), //
321
322 ParamsFor<vec3<f16>, vec3<bool>>(Kind::Conversion), //
323 ParamsFor<vec3<f16>, vec3<u32>>(Kind::Conversion), //
324 ParamsFor<vec3<f16>, vec3<i32>>(Kind::Conversion), //
325 ParamsFor<vec3<f16>, vec3<f32>>(Kind::Conversion), //
326
327 ParamsFor<mat3x3<f16>, mat3x3<f32>>(Kind::Conversion), //
328 ParamsFor<mat2x3<f16>, mat2x3<f32>>(Kind::Conversion), //
329 ParamsFor<mat3x2<f16>, mat3x2<f32>>(Kind::Conversion), //
330
331 ParamsFor<mat3x3<f32>, mat3x3<f16>>(Kind::Conversion), //
332 ParamsFor<mat2x3<f32>, mat2x3<f16>>(Kind::Conversion), //
333 ParamsFor<mat3x2<f32>, mat3x2<f16>>(Kind::Conversion), //
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000334};
335
Ben Clayton54a104e2023-02-22 20:04:40 +0000336using ConversionConstructorValidTest = ResolverTestWithParam<Params>;
337TEST_P(ConversionConstructorValidTest, All) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000338 auto& params = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000339
Ben Claytoncd52f382023-08-07 13:11:08 +0000340 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +0000341
dan sinclair41e4d9a2022-05-01 14:40:55 +0000342 // var a : <lhs_type1> = <lhs_type2>(<rhs_type>(<rhs_value_expr>));
Ben Clayton971318f2023-02-14 13:52:43 +0000343 auto lhs_type1 = params.lhs_type(*this);
344 auto lhs_type2 = params.lhs_type(*this);
345 auto rhs_type = params.rhs_type(*this);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000346 auto* rhs_value_expr = params.rhs_value_expr(*this, 0);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000347
dan sinclairbae54e72023-07-28 15:01:54 +0000348 StringStream ss;
dan sinclair41e4d9a2022-05-01 14:40:55 +0000349 ss << FriendlyName(lhs_type1) << " = " << FriendlyName(lhs_type2) << "("
350 << FriendlyName(rhs_type) << "(<rhs value expr>))";
351 SCOPED_TRACE(ss.str());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000352
Ben Clayton01ac21c2023-02-07 16:14:25 +0000353 auto* arg = Call(rhs_type, rhs_value_expr);
354 auto* tc = Call(lhs_type2, arg);
Ben Clayton58794ae2022-08-19 17:28:53 +0000355 auto* a = Var("a", lhs_type1, tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000356
dan sinclair41e4d9a2022-05-01 14:40:55 +0000357 // Self-assign 'a' to force the expression to be resolved so we can test its
358 // type below
359 auto* a_ident = Expr("a");
360 WrapInFunction(Decl(a), Assign(a_ident, "a"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000361
dan sinclair41e4d9a2022-05-01 14:40:55 +0000362 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000363
Ben Claytone5a67ac2022-05-19 21:50:59 +0000364 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000365 ASSERT_NE(call, nullptr);
366 switch (params.kind) {
367 case Kind::Construct: {
Ben Clayton54a104e2023-02-22 20:04:40 +0000368 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000369 ASSERT_NE(ctor, nullptr);
370 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +0000371 ASSERT_EQ(ctor->Parameters().Length(), 1u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000372 EXPECT_EQ(ctor->Parameters()[0]->Type(), TypeOf(arg));
373 break;
374 }
375 case Kind::Conversion: {
Ben Clayton54a104e2023-02-22 20:04:40 +0000376 auto* conv = call->Target()->As<sem::ValueConversion>();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000377 ASSERT_NE(conv, nullptr);
378 EXPECT_EQ(call->Type(), conv->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +0000379 ASSERT_EQ(conv->Parameters().Length(), 1u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000380 EXPECT_EQ(conv->Parameters()[0]->Type(), TypeOf(arg));
381 break;
382 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000383 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000384}
Ben Clayton54a104e2023-02-22 20:04:40 +0000385INSTANTIATE_TEST_SUITE_P(ResolverValueConstructorValidationTest,
386 ConversionConstructorValidTest,
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000387 testing::ValuesIn(valid_cases));
388
389constexpr CreatePtrs all_types[] = {
390 CreatePtrsFor<bool>(), //
391 CreatePtrsFor<u32>(), //
392 CreatePtrsFor<i32>(), //
393 CreatePtrsFor<f32>(), //
Zhaoming Jiang60588822022-06-28 14:03:36 +0000394 CreatePtrsFor<f16>(), //
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000395 CreatePtrsFor<vec3<bool>>(), //
396 CreatePtrsFor<vec3<i32>>(), //
397 CreatePtrsFor<vec3<u32>>(), //
398 CreatePtrsFor<vec3<f32>>(), //
Zhaoming Jiang60588822022-06-28 14:03:36 +0000399 CreatePtrsFor<vec3<f16>>(), //
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000400 CreatePtrsFor<mat3x3<i32>>(), //
401 CreatePtrsFor<mat3x3<u32>>(), //
402 CreatePtrsFor<mat3x3<f32>>(), //
Zhaoming Jiang60588822022-06-28 14:03:36 +0000403 CreatePtrsFor<mat3x3<f16>>(), //
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000404 CreatePtrsFor<mat2x3<i32>>(), //
405 CreatePtrsFor<mat2x3<u32>>(), //
406 CreatePtrsFor<mat2x3<f32>>(), //
Zhaoming Jiang60588822022-06-28 14:03:36 +0000407 CreatePtrsFor<mat2x3<f16>>(), //
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000408 CreatePtrsFor<mat3x2<i32>>(), //
409 CreatePtrsFor<mat3x2<u32>>(), //
Zhaoming Jiang60588822022-06-28 14:03:36 +0000410 CreatePtrsFor<mat3x2<f32>>(), //
411 CreatePtrsFor<mat3x2<f16>>(), //
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000412};
413
Ben Clayton54a104e2023-02-22 20:04:40 +0000414using ConversionConstructorInvalidTest = ResolverTestWithParam<std::tuple<CreatePtrs, // lhs
dan sinclair41e4d9a2022-05-01 14:40:55 +0000415 CreatePtrs // rhs
416 >>;
Ben Clayton54a104e2023-02-22 20:04:40 +0000417TEST_P(ConversionConstructorInvalidTest, All) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000418 auto& params = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000419
dan sinclair41e4d9a2022-05-01 14:40:55 +0000420 auto& lhs_params = std::get<0>(params);
421 auto& rhs_params = std::get<1>(params);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000422
dan sinclair41e4d9a2022-05-01 14:40:55 +0000423 // Skip test for valid cases
424 for (auto& v : valid_cases) {
425 if (v.lhs_type == lhs_params.ast && v.rhs_type == rhs_params.ast &&
Antonio Maioranob6d524382022-08-31 22:59:08 +0000426 v.rhs_value_expr == rhs_params.expr_from_double) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000427 return;
428 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000429 }
dan sinclair41e4d9a2022-05-01 14:40:55 +0000430 // Skip non-conversions
431 if (lhs_params.ast == rhs_params.ast) {
432 return;
433 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000434
dan sinclair41e4d9a2022-05-01 14:40:55 +0000435 // var a : <lhs_type1> = <lhs_type2>(<rhs_type>(<rhs_value_expr>));
Ben Clayton971318f2023-02-14 13:52:43 +0000436 auto lhs_type1 = lhs_params.ast(*this);
437 auto lhs_type2 = lhs_params.ast(*this);
438 auto rhs_type = rhs_params.ast(*this);
Antonio Maioranob6d524382022-08-31 22:59:08 +0000439 auto* rhs_value_expr = rhs_params.expr_from_double(*this, 0);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000440
dan sinclairbae54e72023-07-28 15:01:54 +0000441 StringStream ss;
dan sinclair41e4d9a2022-05-01 14:40:55 +0000442 ss << FriendlyName(lhs_type1) << " = " << FriendlyName(lhs_type2) << "("
443 << FriendlyName(rhs_type) << "(<rhs value expr>))";
444 SCOPED_TRACE(ss.str());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000445
Ben Claytoncd52f382023-08-07 13:11:08 +0000446 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +0000447
Ben Clayton01ac21c2023-02-07 16:14:25 +0000448 auto* a = Var("a", lhs_type1, Call(lhs_type2, Call(rhs_type, rhs_value_expr)));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000449
dan sinclair41e4d9a2022-05-01 14:40:55 +0000450 // Self-assign 'a' to force the expression to be resolved so we can test its
451 // type below
452 auto* a_ident = Expr("a");
453 WrapInFunction(Decl(a), Assign(a_ident, "a"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000454
dan sinclair41e4d9a2022-05-01 14:40:55 +0000455 ASSERT_FALSE(r()->Resolve());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000456}
Ben Clayton54a104e2023-02-22 20:04:40 +0000457INSTANTIATE_TEST_SUITE_P(ResolverValueConstructorValidationTest,
458 ConversionConstructorInvalidTest,
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000459 testing::Combine(testing::ValuesIn(all_types),
460 testing::ValuesIn(all_types)));
461
Ben Clayton54a104e2023-02-22 20:04:40 +0000462TEST_F(ResolverValueConstructorValidationTest, ConversionConstructorInvalid_TooManyConstructors) {
Ben Clayton01ac21c2023-02-07 16:14:25 +0000463 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 +0000464 WrapInFunction(a);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000465
dan sinclair41e4d9a2022-05-01 14:40:55 +0000466 ASSERT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +0000467 EXPECT_THAT(r()->error(), HasSubstr("12:34 error: no matching constructor for f32(f32, f32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000468}
469
Ben Clayton54a104e2023-02-22 20:04:40 +0000470TEST_F(ResolverValueConstructorValidationTest, ConversionConstructorInvalid_InvalidConstructor) {
Ben Clayton66805b02023-06-14 22:00:01 +0000471 auto* a = Var("a", ty.f32(), Call(Source{{12, 34}}, ty.f32(), Call<array<f32, 4>>()));
dan sinclair41e4d9a2022-05-01 14:40:55 +0000472 WrapInFunction(a);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000473
dan sinclair41e4d9a2022-05-01 14:40:55 +0000474 ASSERT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +0000475 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +0000476 HasSubstr("12:34 error: no matching constructor for f32(array<f32, 4>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000477}
478
479} // namespace ConversionConstructTest
480
Ben Clayton54a104e2023-02-22 20:04:40 +0000481namespace ArrayConstructor {
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000482
Ben Clayton54a104e2023-02-22 20:04:40 +0000483TEST_F(ResolverValueConstructorValidationTest, Array_ZeroValue_Pass) {
Ben Clayton0ce9ab02022-05-05 20:23:40 +0000484 // array<u32, 10u>();
Ben Clayton66805b02023-06-14 22:00:01 +0000485 auto* tc = Call<array<u32, 10>>();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000486 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000487
dan sinclair41e4d9a2022-05-01 14:40:55 +0000488 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000489
Ben Claytone5a67ac2022-05-19 21:50:59 +0000490 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000491 ASSERT_NE(call, nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +0000492 EXPECT_TRUE(call->Type()->Is<core::type::Array>());
Ben Clayton54a104e2023-02-22 20:04:40 +0000493 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000494 ASSERT_NE(ctor, nullptr);
495 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +0000496 ASSERT_EQ(ctor->Parameters().Length(), 0u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000497}
498
Ben Clayton54a104e2023-02-22 20:04:40 +0000499TEST_F(ResolverValueConstructorValidationTest, Array_U32U32U32) {
Ben Clayton6315a272022-08-01 17:18:04 +0000500 // array<u32, 3u>(0u, 10u, 20u);
Ben Clayton66805b02023-06-14 22:00:01 +0000501 auto* tc = Call<array<u32, 3>>(0_u, 10_u, 20_u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000502 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000503
dan sinclair41e4d9a2022-05-01 14:40:55 +0000504 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000505
Ben Claytone5a67ac2022-05-19 21:50:59 +0000506 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000507 ASSERT_NE(call, nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +0000508 EXPECT_TRUE(call->Type()->Is<core::type::Array>());
Ben Clayton54a104e2023-02-22 20:04:40 +0000509 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000510 ASSERT_NE(ctor, nullptr);
511 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +0000512 ASSERT_EQ(ctor->Parameters().Length(), 3u);
dan sinclaircedcdf32023-08-10 02:39:48 +0000513 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::U32>());
514 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::U32>());
515 EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<core::type::U32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000516}
517
Ben Clayton54a104e2023-02-22 20:04:40 +0000518TEST_F(ResolverValueConstructorValidationTest, InferredArray_U32U32U32) {
Ben Clayton4a656202022-08-01 17:36:54 +0000519 // array(0u, 10u, 20u);
Ben Clayton66805b02023-06-14 22:00:01 +0000520 auto* tc = Call<array<Infer>>(Source{{12, 34}}, 0_u, 10_u, 20_u);
Ben Clayton4a656202022-08-01 17:36:54 +0000521 WrapInFunction(tc);
522
523 ASSERT_TRUE(r()->Resolve()) << r()->error();
524
525 auto* call = Sem().Get<sem::Call>(tc);
526 ASSERT_NE(call, nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +0000527 EXPECT_TRUE(call->Type()->Is<core::type::Array>());
Ben Clayton54a104e2023-02-22 20:04:40 +0000528 auto* ctor = call->Target()->As<sem::ValueConstructor>();
Ben Clayton4a656202022-08-01 17:36:54 +0000529 ASSERT_NE(ctor, nullptr);
530 EXPECT_EQ(call->Type(), ctor->ReturnType());
531 ASSERT_EQ(ctor->Parameters().Length(), 3u);
dan sinclaircedcdf32023-08-10 02:39:48 +0000532 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::U32>());
533 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::U32>());
534 EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<core::type::U32>());
Ben Clayton4a656202022-08-01 17:36:54 +0000535}
536
Ben Clayton54a104e2023-02-22 20:04:40 +0000537TEST_F(ResolverValueConstructorValidationTest, Array_U32AIU32) {
Ben Clayton4a656202022-08-01 17:36:54 +0000538 // array<u32, 3u>(0u, 10, 20u);
Ben Clayton66805b02023-06-14 22:00:01 +0000539 auto* tc = Call<array<u32, 3>>(0_u, 10_a, 20_u);
Ben Clayton4a656202022-08-01 17:36:54 +0000540 WrapInFunction(tc);
541
542 ASSERT_TRUE(r()->Resolve()) << r()->error();
543
544 auto* call = Sem().Get<sem::Call>(tc);
545 ASSERT_NE(call, nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +0000546 EXPECT_TRUE(call->Type()->Is<core::type::Array>());
Ben Clayton54a104e2023-02-22 20:04:40 +0000547 auto* ctor = call->Target()->As<sem::ValueConstructor>();
Ben Clayton4a656202022-08-01 17:36:54 +0000548 ASSERT_NE(ctor, nullptr);
549 EXPECT_EQ(call->Type(), ctor->ReturnType());
550 ASSERT_EQ(ctor->Parameters().Length(), 3u);
dan sinclaircedcdf32023-08-10 02:39:48 +0000551 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::U32>());
552 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::U32>());
553 EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<core::type::U32>());
Ben Clayton4a656202022-08-01 17:36:54 +0000554}
555
Ben Clayton54a104e2023-02-22 20:04:40 +0000556TEST_F(ResolverValueConstructorValidationTest, InferredArray_U32AIU32) {
Ben Clayton4a656202022-08-01 17:36:54 +0000557 // array(0u, 10u, 20u);
Ben Clayton66805b02023-06-14 22:00:01 +0000558 auto* tc = Call<array<Infer>>(Source{{12, 34}}, 0_u, 10_a, 20_u);
Ben Clayton4a656202022-08-01 17:36:54 +0000559 WrapInFunction(tc);
560
561 ASSERT_TRUE(r()->Resolve()) << r()->error();
562
563 auto* call = Sem().Get<sem::Call>(tc);
564 ASSERT_NE(call, nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +0000565 EXPECT_TRUE(call->Type()->Is<core::type::Array>());
Ben Clayton54a104e2023-02-22 20:04:40 +0000566 auto* ctor = call->Target()->As<sem::ValueConstructor>();
Ben Clayton4a656202022-08-01 17:36:54 +0000567 ASSERT_NE(ctor, nullptr);
568 EXPECT_EQ(call->Type(), ctor->ReturnType());
569 ASSERT_EQ(ctor->Parameters().Length(), 3u);
dan sinclaircedcdf32023-08-10 02:39:48 +0000570 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::U32>());
571 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::U32>());
572 EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<core::type::U32>());
Ben Clayton4a656202022-08-01 17:36:54 +0000573}
574
Ben Clayton54a104e2023-02-22 20:04:40 +0000575TEST_F(ResolverValueConstructorValidationTest, ArrayU32_AIAIAI) {
Ben Clayton4a656202022-08-01 17:36:54 +0000576 // array<u32, 3u>(0, 10, 20);
Ben Clayton66805b02023-06-14 22:00:01 +0000577 auto* tc = Call<array<u32, 3>>(0_a, 10_a, 20_a);
Ben Clayton4a656202022-08-01 17:36:54 +0000578 WrapInFunction(tc);
579
580 ASSERT_TRUE(r()->Resolve()) << r()->error();
581
582 auto* call = Sem().Get<sem::Call>(tc);
583 ASSERT_NE(call, nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +0000584 EXPECT_TRUE(call->Type()->Is<core::type::Array>());
Ben Clayton54a104e2023-02-22 20:04:40 +0000585 auto* ctor = call->Target()->As<sem::ValueConstructor>();
Ben Clayton4a656202022-08-01 17:36:54 +0000586 ASSERT_NE(ctor, nullptr);
587 EXPECT_EQ(call->Type(), ctor->ReturnType());
588 ASSERT_EQ(ctor->Parameters().Length(), 3u);
dan sinclaircedcdf32023-08-10 02:39:48 +0000589 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::U32>());
590 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::U32>());
591 EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<core::type::U32>());
Ben Clayton4a656202022-08-01 17:36:54 +0000592}
593
Ben Clayton54a104e2023-02-22 20:04:40 +0000594TEST_F(ResolverValueConstructorValidationTest, InferredArray_AIAIAI) {
Ben Clayton4a656202022-08-01 17:36:54 +0000595 // const c = array(0, 10, 20);
Ben Clayton66805b02023-06-14 22:00:01 +0000596 auto* tc = Call<array<Infer>>(Source{{12, 34}}, 0_a, 10_a, 20_a);
Ben Clayton58794ae2022-08-19 17:28:53 +0000597 WrapInFunction(Decl(Const("C", tc)));
Ben Clayton4a656202022-08-01 17:36:54 +0000598
599 ASSERT_TRUE(r()->Resolve()) << r()->error();
600
601 auto* call = Sem().Get<sem::Call>(tc);
602 ASSERT_NE(call, nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +0000603 EXPECT_TRUE(call->Type()->Is<core::type::Array>());
Ben Clayton54a104e2023-02-22 20:04:40 +0000604 auto* ctor = call->Target()->As<sem::ValueConstructor>();
Ben Clayton4a656202022-08-01 17:36:54 +0000605 ASSERT_NE(ctor, nullptr);
606 EXPECT_EQ(call->Type(), ctor->ReturnType());
607 ASSERT_EQ(ctor->Parameters().Length(), 3u);
dan sinclaircedcdf32023-08-10 02:39:48 +0000608 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::AbstractInt>());
609 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::AbstractInt>());
610 EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<core::type::AbstractInt>());
Ben Clayton4a656202022-08-01 17:36:54 +0000611}
612
Ben Clayton54a104e2023-02-22 20:04:40 +0000613TEST_F(ResolverValueConstructorValidationTest, InferredArrayU32_VecI32_VecAI) {
Ben Clayton4a656202022-08-01 17:36:54 +0000614 // array(vec2(10i), vec2(20));
Ben Clayton66805b02023-06-14 22:00:01 +0000615 auto* tc = Call<array<Infer>>(Source{{12, 34}}, //
616 Call<vec2<Infer>>(20_i), //
617 Call<vec2<Infer>>(20_a));
Ben Clayton4a656202022-08-01 17:36:54 +0000618 WrapInFunction(tc);
619
620 ASSERT_TRUE(r()->Resolve()) << r()->error();
621
622 auto* call = Sem().Get<sem::Call>(tc);
623 ASSERT_NE(call, nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +0000624 EXPECT_TRUE(call->Type()->Is<core::type::Array>());
Ben Clayton54a104e2023-02-22 20:04:40 +0000625 auto* ctor = call->Target()->As<sem::ValueConstructor>();
Ben Clayton4a656202022-08-01 17:36:54 +0000626 ASSERT_NE(ctor, nullptr);
627 EXPECT_EQ(call->Type(), ctor->ReturnType());
628 ASSERT_EQ(ctor->Parameters().Length(), 2u);
dan sinclaircedcdf32023-08-10 02:39:48 +0000629 ASSERT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::Vector>());
630 EXPECT_TRUE(
631 ctor->Parameters()[0]->Type()->As<core::type::Vector>()->type()->Is<core::type::I32>());
632 ASSERT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::Vector>());
633 EXPECT_TRUE(
634 ctor->Parameters()[1]->Type()->As<core::type::Vector>()->type()->Is<core::type::I32>());
Ben Clayton4a656202022-08-01 17:36:54 +0000635}
636
Ben Clayton54a104e2023-02-22 20:04:40 +0000637TEST_F(ResolverValueConstructorValidationTest, InferredArrayU32_VecAI_VecF32) {
Ben Clayton4a656202022-08-01 17:36:54 +0000638 // array(vec2(20), vec2(10f));
Ben Clayton66805b02023-06-14 22:00:01 +0000639 auto* tc = Call<array<Infer>>(Source{{12, 34}}, //
640 Call<vec2<Infer>>(20_a), //
641 Call<vec2<Infer>>(20_f));
Ben Clayton4a656202022-08-01 17:36:54 +0000642 WrapInFunction(tc);
643
644 ASSERT_TRUE(r()->Resolve()) << r()->error();
645
646 auto* call = Sem().Get<sem::Call>(tc);
647 ASSERT_NE(call, nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +0000648 EXPECT_TRUE(call->Type()->Is<core::type::Array>());
Ben Clayton54a104e2023-02-22 20:04:40 +0000649 auto* ctor = call->Target()->As<sem::ValueConstructor>();
Ben Clayton4a656202022-08-01 17:36:54 +0000650 ASSERT_NE(ctor, nullptr);
651 EXPECT_EQ(call->Type(), ctor->ReturnType());
652 ASSERT_EQ(ctor->Parameters().Length(), 2u);
dan sinclaircedcdf32023-08-10 02:39:48 +0000653 ASSERT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::Vector>());
654 EXPECT_TRUE(
655 ctor->Parameters()[0]->Type()->As<core::type::Vector>()->type()->Is<core::type::F32>());
656 ASSERT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::Vector>());
657 EXPECT_TRUE(
658 ctor->Parameters()[1]->Type()->As<core::type::Vector>()->type()->Is<core::type::F32>());
Ben Clayton4a656202022-08-01 17:36:54 +0000659}
660
Ben Clayton54a104e2023-02-22 20:04:40 +0000661TEST_F(ResolverValueConstructorValidationTest, ArrayArgumentTypeMismatch_U32F32) {
Ben Clayton0ce9ab02022-05-05 20:23:40 +0000662 // array<u32, 3u>(0u, 1.0f, 20u);
Ben Clayton66805b02023-06-14 22:00:01 +0000663 auto* tc = Call<array<u32, 3>>(0_u, Expr(Source{{12, 34}}, 1_f), 20_u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000664 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000665
dan sinclair41e4d9a2022-05-01 14:40:55 +0000666 EXPECT_FALSE(r()->Resolve());
Ben Clayton9c4d0c92022-07-31 19:33:04 +0000667 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 +0000668}
669
Ben Clayton54a104e2023-02-22 20:04:40 +0000670TEST_F(ResolverValueConstructorValidationTest, InferredArrayArgumentTypeMismatch_U32F32) {
Ben Clayton4a656202022-08-01 17:36:54 +0000671 // array(0u, 1.0f, 20u);
Ben Clayton66805b02023-06-14 22:00:01 +0000672 auto* tc = Call<array<Infer>>(Source{{12, 34}}, 0_u, 1_f, 20_u);
Ben Clayton4a656202022-08-01 17:36:54 +0000673 WrapInFunction(tc);
674
675 EXPECT_FALSE(r()->Resolve());
676 EXPECT_EQ(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +0000677 R"(12:34 error: cannot infer common array element type from constructor arguments
Ben Clayton4a656202022-08-01 17:36:54 +0000678note: argument 0 is of type 'u32'
679note: argument 1 is of type 'f32')");
680}
681
Ben Clayton54a104e2023-02-22 20:04:40 +0000682TEST_F(ResolverValueConstructorValidationTest, ArrayArgumentTypeMismatch_F32I32) {
Ben Clayton0ce9ab02022-05-05 20:23:40 +0000683 // array<f32, 1u>(1i);
Ben Clayton66805b02023-06-14 22:00:01 +0000684 auto* tc = Call<array<f32, 1>>(Expr(Source{{12, 34}}, 1_i));
dan sinclair41e4d9a2022-05-01 14:40:55 +0000685 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000686
dan sinclair41e4d9a2022-05-01 14:40:55 +0000687 EXPECT_FALSE(r()->Resolve());
Ben Clayton9c4d0c92022-07-31 19:33:04 +0000688 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 +0000689}
690
Ben Clayton54a104e2023-02-22 20:04:40 +0000691TEST_F(ResolverValueConstructorValidationTest, InferredArrayArgumentTypeMismatch_F32I32) {
Ben Clayton4a656202022-08-01 17:36:54 +0000692 // array(1f, 1i);
Ben Clayton66805b02023-06-14 22:00:01 +0000693 auto* tc = Call<array<Infer>>(Source{{12, 34}}, 1_f, 1_i);
Ben Clayton4a656202022-08-01 17:36:54 +0000694 WrapInFunction(tc);
695
696 EXPECT_FALSE(r()->Resolve());
697 EXPECT_EQ(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +0000698 R"(12:34 error: cannot infer common array element type from constructor arguments
Ben Clayton4a656202022-08-01 17:36:54 +0000699note: argument 0 is of type 'f32'
700note: argument 1 is of type 'i32')");
701}
702
Ben Clayton54a104e2023-02-22 20:04:40 +0000703TEST_F(ResolverValueConstructorValidationTest, ArrayArgumentTypeMismatch_U32I32) {
Ben Clayton0ce9ab02022-05-05 20:23:40 +0000704 // array<u32, 1u>(1i, 0u, 0u, 0u, 0u, 0u);
Ben Clayton66805b02023-06-14 22:00:01 +0000705 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 +0000706 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000707
dan sinclair41e4d9a2022-05-01 14:40:55 +0000708 EXPECT_FALSE(r()->Resolve());
Ben Clayton9c4d0c92022-07-31 19:33:04 +0000709 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 +0000710}
711
Ben Clayton54a104e2023-02-22 20:04:40 +0000712TEST_F(ResolverValueConstructorValidationTest, InferredArrayArgumentTypeMismatch_U32I32) {
Ben Clayton4a656202022-08-01 17:36:54 +0000713 // array(1i, 0u, 0u, 0u, 0u, 0u);
Ben Clayton66805b02023-06-14 22:00:01 +0000714 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 +0000715 WrapInFunction(tc);
716
717 EXPECT_FALSE(r()->Resolve());
718 EXPECT_EQ(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +0000719 R"(12:34 error: cannot infer common array element type from constructor arguments
Ben Clayton4a656202022-08-01 17:36:54 +0000720note: argument 0 is of type 'i32'
721note: argument 1 is of type 'u32')");
722}
723
Ben Clayton54a104e2023-02-22 20:04:40 +0000724TEST_F(ResolverValueConstructorValidationTest, ArrayArgumentTypeMismatch_I32Vec2) {
Ben Clayton0ce9ab02022-05-05 20:23:40 +0000725 // array<i32, 3u>(1i, vec2<i32>());
Ben Clayton66805b02023-06-14 22:00:01 +0000726 auto* tc = Call<array<i32, 3>>(1_i, Call<vec2<i32>>(Source{{12, 34}}));
dan sinclair41e4d9a2022-05-01 14:40:55 +0000727 WrapInFunction(tc);
728 EXPECT_FALSE(r()->Resolve());
729 EXPECT_EQ(r()->error(),
Ben Clayton9c4d0c92022-07-31 19:33:04 +0000730 R"(12:34 error: 'vec2<i32>' cannot be used to construct an array of 'i32')");
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000731}
732
Ben Clayton54a104e2023-02-22 20:04:40 +0000733TEST_F(ResolverValueConstructorValidationTest, InferredArrayArgumentTypeMismatch_I32Vec2) {
Ben Clayton4a656202022-08-01 17:36:54 +0000734 // array(1i, vec2<i32>());
Ben Clayton66805b02023-06-14 22:00:01 +0000735 auto* tc = Call<array<Infer>>(Source{{12, 34}}, 1_i, Call<vec2<i32>>());
Ben Clayton4a656202022-08-01 17:36:54 +0000736 WrapInFunction(tc);
737 EXPECT_FALSE(r()->Resolve());
738 EXPECT_EQ(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +0000739 R"(12:34 error: cannot infer common array element type from constructor arguments
Ben Clayton4a656202022-08-01 17:36:54 +0000740note: argument 0 is of type 'i32'
741note: argument 1 is of type 'vec2<i32>')");
742}
743
Ben Clayton54a104e2023-02-22 20:04:40 +0000744TEST_F(ResolverValueConstructorValidationTest, ArrayArgumentTypeMismatch_Vec3i32_Vec3u32) {
Ben Clayton6315a272022-08-01 17:18:04 +0000745 // array<vec3<i32>, 2u>(vec3<u32>(), vec3<u32>());
Ben Clayton66805b02023-06-14 22:00:01 +0000746 auto* t = Call<array<vec3<i32>, 2>>(Call<vec3<u32>>(Source{{12, 34}}), Call<vec3<u32>>());
dan sinclair41e4d9a2022-05-01 14:40:55 +0000747 WrapInFunction(t);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000748
dan sinclair41e4d9a2022-05-01 14:40:55 +0000749 EXPECT_FALSE(r()->Resolve());
750 EXPECT_EQ(r()->error(),
Ben Clayton9c4d0c92022-07-31 19:33:04 +0000751 R"(12:34 error: 'vec3<u32>' cannot be used to construct an array of 'vec3<i32>')");
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000752}
753
Ben Clayton54a104e2023-02-22 20:04:40 +0000754TEST_F(ResolverValueConstructorValidationTest, InferredArrayArgumentTypeMismatch_Vec3i32_Vec3u32) {
Ben Clayton4a656202022-08-01 17:36:54 +0000755 // array(vec3<i32>(), vec3<u32>());
Ben Clayton66805b02023-06-14 22:00:01 +0000756 auto* t = Call<array<Infer>>(Source{{12, 34}}, Call<vec3<i32>>(), Call<vec3<u32>>());
Ben Clayton4a656202022-08-01 17:36:54 +0000757 WrapInFunction(t);
758
759 EXPECT_FALSE(r()->Resolve());
760 EXPECT_EQ(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +0000761 R"(12:34 error: cannot infer common array element type from constructor arguments
Ben Clayton4a656202022-08-01 17:36:54 +0000762note: argument 0 is of type 'vec3<i32>'
763note: argument 1 is of type 'vec3<u32>')");
764}
765
Ben Clayton54a104e2023-02-22 20:04:40 +0000766TEST_F(ResolverValueConstructorValidationTest, InferredArrayArgumentTypeMismatch_Vec3i32_Vec3AF) {
Ben Clayton4a656202022-08-01 17:36:54 +0000767 // array(vec3<i32>(), vec3(1.0));
Ben Clayton66805b02023-06-14 22:00:01 +0000768 auto* t = Call<array<Infer>>(Source{{12, 34}}, Call<vec3<i32>>(), Call("vec3", 1._a));
Ben Clayton4a656202022-08-01 17:36:54 +0000769 WrapInFunction(t);
770
771 EXPECT_FALSE(r()->Resolve());
772 EXPECT_EQ(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +0000773 R"(12:34 error: cannot infer common array element type from constructor arguments
Ben Clayton4a656202022-08-01 17:36:54 +0000774note: argument 0 is of type 'vec3<i32>'
775note: argument 1 is of type 'vec3<abstract-float>')");
776}
777
Ben Clayton54a104e2023-02-22 20:04:40 +0000778TEST_F(ResolverValueConstructorValidationTest, ArrayArgumentTypeMismatch_Vec3i32_Vec3bool) {
Ben Clayton6315a272022-08-01 17:18:04 +0000779 // array<vec3<i32>, 2u>(vec3<i32>(), vec3<bool>());
Ben Clayton66805b02023-06-14 22:00:01 +0000780 auto* t = Call<array<vec3<i32>, 2>>(Call<vec3<i32>>(), Call<vec3<bool>>());
dan sinclair41e4d9a2022-05-01 14:40:55 +0000781 WrapInFunction(t);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000782
dan sinclair41e4d9a2022-05-01 14:40:55 +0000783 EXPECT_FALSE(r()->Resolve());
784 EXPECT_EQ(r()->error(),
Ben Clayton6315a272022-08-01 17:18:04 +0000785 R"(error: 'vec3<bool>' cannot be used to construct an array of 'vec3<i32>')");
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000786}
787
Ben Clayton54a104e2023-02-22 20:04:40 +0000788TEST_F(ResolverValueConstructorValidationTest, InferredArrayArgumentTypeMismatch_Vec3i32_Vec3bool) {
Ben Clayton4a656202022-08-01 17:36:54 +0000789 // array(vec3<i32>(), vec3<bool>());
Ben Clayton66805b02023-06-14 22:00:01 +0000790 auto* t = Call<array<Infer>>(Source{{12, 34}}, Call<vec3<i32>>(), Call<vec3<bool>>());
Ben Clayton4a656202022-08-01 17:36:54 +0000791 WrapInFunction(t);
792
793 EXPECT_FALSE(r()->Resolve());
794 EXPECT_EQ(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +0000795 R"(12:34 error: cannot infer common array element type from constructor arguments
Ben Clayton4a656202022-08-01 17:36:54 +0000796note: argument 0 is of type 'vec3<i32>'
797note: argument 1 is of type 'vec3<bool>')");
798}
799
Ben Clayton54a104e2023-02-22 20:04:40 +0000800TEST_F(ResolverValueConstructorValidationTest, ArrayOfArray_SubElemSizeMismatch) {
Ben Clayton0ce9ab02022-05-05 20:23:40 +0000801 // array<array<i32, 2u>, 2u>(array<i32, 3u>(), array<i32, 2u>());
Ben Clayton66805b02023-06-14 22:00:01 +0000802 auto* t = Call<array<array<i32, 2>, 2>>(Source{{12, 34}}, Call<array<i32, 3>>(),
803 Call<array<i32, 2>>());
dan sinclair41e4d9a2022-05-01 14:40:55 +0000804 WrapInFunction(t);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000805
dan sinclair41e4d9a2022-05-01 14:40:55 +0000806 EXPECT_FALSE(r()->Resolve());
Ben Clayton6315a272022-08-01 17:18:04 +0000807 EXPECT_EQ(r()->error(),
808 R"(error: 'array<i32, 3>' cannot be used to construct an array of 'array<i32, 2>')");
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000809}
810
Ben Clayton54a104e2023-02-22 20:04:40 +0000811TEST_F(ResolverValueConstructorValidationTest, InferredArrayOfArray_SubElemSizeMismatch) {
Ben Clayton4a656202022-08-01 17:36:54 +0000812 // array<array<i32, 2u>, 2u>(array<i32, 3u>(), array<i32, 2u>());
Ben Clayton66805b02023-06-14 22:00:01 +0000813 auto* t = Call<array<Infer>>(Source{{12, 34}}, Call<array<i32, 3>>(), Call<array<i32, 2>>());
Ben Clayton4a656202022-08-01 17:36:54 +0000814 WrapInFunction(t);
815
816 EXPECT_FALSE(r()->Resolve());
817 EXPECT_EQ(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +0000818 R"(12:34 error: cannot infer common array element type from constructor arguments
Ben Clayton4a656202022-08-01 17:36:54 +0000819note: argument 0 is of type 'array<i32, 3>'
820note: argument 1 is of type 'array<i32, 2>')");
821}
822
Ben Clayton54a104e2023-02-22 20:04:40 +0000823TEST_F(ResolverValueConstructorValidationTest, ArrayOfArray_SubElemTypeMismatch) {
Ben Clayton0ce9ab02022-05-05 20:23:40 +0000824 // array<array<i32, 2u>, 2u>(array<i32, 2u>(), array<u32, 2u>());
Ben Clayton66805b02023-06-14 22:00:01 +0000825 auto* t = Call<array<array<i32, 2>, 2>>(Source{{12, 34}}, Call<array<i32, 2>>(),
826 Call<array<u32, 2>>());
dan sinclair41e4d9a2022-05-01 14:40:55 +0000827 WrapInFunction(t);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000828
dan sinclair41e4d9a2022-05-01 14:40:55 +0000829 EXPECT_FALSE(r()->Resolve());
Ben Clayton6315a272022-08-01 17:18:04 +0000830 EXPECT_EQ(r()->error(),
831 R"(error: 'array<u32, 2>' cannot be used to construct an array of 'array<i32, 2>')");
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000832}
833
Ben Clayton54a104e2023-02-22 20:04:40 +0000834TEST_F(ResolverValueConstructorValidationTest, InferredArrayOfArray_SubElemTypeMismatch) {
Ben Clayton4a656202022-08-01 17:36:54 +0000835 // array<array<i32, 2u>, 2u>(array<i32, 2u>(), array<u32, 2u>());
Ben Clayton66805b02023-06-14 22:00:01 +0000836 auto* t = Call<array<Infer>>(Source{{12, 34}}, Call<array<i32, 2>>(), Call<array<u32, 2>>());
Ben Clayton4a656202022-08-01 17:36:54 +0000837 WrapInFunction(t);
838
839 EXPECT_FALSE(r()->Resolve());
840 EXPECT_EQ(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +0000841 R"(12:34 error: cannot infer common array element type from constructor arguments
Ben Clayton4a656202022-08-01 17:36:54 +0000842note: argument 0 is of type 'array<i32, 2>'
843note: argument 1 is of type 'array<u32, 2>')");
844}
845
Ben Clayton54a104e2023-02-22 20:04:40 +0000846TEST_F(ResolverValueConstructorValidationTest, Array_TooFewElements) {
Ben Clayton0ce9ab02022-05-05 20:23:40 +0000847 // array<i32, 4u>(1i, 2i, 3i);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000848 SetSource(Source::Location({12, 34}));
Ben Clayton66805b02023-06-14 22:00:01 +0000849 auto* tc = Call<array<i32, 4>>(Expr(1_i), Expr(2_i), Expr(3_i));
dan sinclair41e4d9a2022-05-01 14:40:55 +0000850 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000851
dan sinclair41e4d9a2022-05-01 14:40:55 +0000852 EXPECT_FALSE(r()->Resolve());
853 EXPECT_EQ(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +0000854 "12:34 error: array constructor has too few elements: expected 4, found 3");
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000855}
856
Ben Clayton54a104e2023-02-22 20:04:40 +0000857TEST_F(ResolverValueConstructorValidationTest, Array_TooManyElements) {
Ben Clayton0ce9ab02022-05-05 20:23:40 +0000858 // array<i32, 4u>(1i, 2i, 3i, 4i, 5i);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000859 SetSource(Source::Location({12, 34}));
Ben Clayton66805b02023-06-14 22:00:01 +0000860 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 +0000861 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000862
dan sinclair41e4d9a2022-05-01 14:40:55 +0000863 EXPECT_FALSE(r()->Resolve());
864 EXPECT_EQ(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +0000865 "12:34 error: array constructor has too many "
dan sinclair41e4d9a2022-05-01 14:40:55 +0000866 "elements: expected 4, "
867 "found 5");
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000868}
869
Ben Clayton54a104e2023-02-22 20:04:40 +0000870TEST_F(ResolverValueConstructorValidationTest, Array_Runtime) {
Ben Clayton0ce9ab02022-05-05 20:23:40 +0000871 // array<i32>(1i);
Ben Clayton66805b02023-06-14 22:00:01 +0000872 auto* tc = Call<array<i32>>(Source{{12, 34}}, Expr(1_i));
dan sinclair41e4d9a2022-05-01 14:40:55 +0000873 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000874
dan sinclair41e4d9a2022-05-01 14:40:55 +0000875 EXPECT_FALSE(r()->Resolve());
Ben Clayton6315a272022-08-01 17:18:04 +0000876 EXPECT_EQ(r()->error(), "12:34 error: cannot construct a runtime-sized array");
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000877}
878
Ben Clayton54a104e2023-02-22 20:04:40 +0000879TEST_F(ResolverValueConstructorValidationTest, Array_RuntimeZeroValue) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000880 // array<i32>();
Ben Clayton66805b02023-06-14 22:00:01 +0000881 auto* tc = Call<array<i32>>(Source{{12, 34}});
dan sinclair41e4d9a2022-05-01 14:40:55 +0000882 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000883
dan sinclair41e4d9a2022-05-01 14:40:55 +0000884 EXPECT_FALSE(r()->Resolve());
Ben Clayton6315a272022-08-01 17:18:04 +0000885 EXPECT_EQ(r()->error(), "12:34 error: cannot construct a runtime-sized array");
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000886}
887
Ben Clayton54a104e2023-02-22 20:04:40 +0000888} // namespace ArrayConstructor
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000889
Ben Clayton54a104e2023-02-22 20:04:40 +0000890namespace ScalarConstructor {
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000891
Ben Clayton54a104e2023-02-22 20:04:40 +0000892TEST_F(ResolverValueConstructorValidationTest, I32_Success) {
Ben Clayton01ac21c2023-02-07 16:14:25 +0000893 auto* expr = Call<i32>(Expr(123_i));
dan sinclair41e4d9a2022-05-01 14:40:55 +0000894 WrapInFunction(expr);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000895
dan sinclair41e4d9a2022-05-01 14:40:55 +0000896 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000897
dan sinclair41e4d9a2022-05-01 14:40:55 +0000898 ASSERT_NE(TypeOf(expr), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +0000899 ASSERT_TRUE(TypeOf(expr)->Is<core::type::I32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000900
Ben Claytone5a67ac2022-05-19 21:50:59 +0000901 auto* call = Sem().Get<sem::Call>(expr);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000902 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +0000903 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000904 ASSERT_NE(ctor, nullptr);
905 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +0000906 ASSERT_EQ(ctor->Parameters().Length(), 1u);
dan sinclaircedcdf32023-08-10 02:39:48 +0000907 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::I32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000908}
909
Ben Clayton54a104e2023-02-22 20:04:40 +0000910TEST_F(ResolverValueConstructorValidationTest, U32_Success) {
Ben Clayton01ac21c2023-02-07 16:14:25 +0000911 auto* expr = Call<u32>(Expr(123_u));
dan sinclair41e4d9a2022-05-01 14:40:55 +0000912 WrapInFunction(expr);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000913
dan sinclair41e4d9a2022-05-01 14:40:55 +0000914 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000915
dan sinclair41e4d9a2022-05-01 14:40:55 +0000916 ASSERT_NE(TypeOf(expr), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +0000917 ASSERT_TRUE(TypeOf(expr)->Is<core::type::U32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000918
Ben Claytone5a67ac2022-05-19 21:50:59 +0000919 auto* call = Sem().Get<sem::Call>(expr);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000920 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +0000921 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000922 ASSERT_NE(ctor, nullptr);
923 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +0000924 ASSERT_EQ(ctor->Parameters().Length(), 1u);
dan sinclaircedcdf32023-08-10 02:39:48 +0000925 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::U32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000926}
927
Ben Clayton54a104e2023-02-22 20:04:40 +0000928TEST_F(ResolverValueConstructorValidationTest, F32_Success) {
Ben Clayton01ac21c2023-02-07 16:14:25 +0000929 auto* expr = Call<f32>(Expr(1.23_f));
dan sinclair41e4d9a2022-05-01 14:40:55 +0000930 WrapInFunction(expr);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000931
dan sinclair41e4d9a2022-05-01 14:40:55 +0000932 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000933
dan sinclair41e4d9a2022-05-01 14:40:55 +0000934 ASSERT_NE(TypeOf(expr), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +0000935 ASSERT_TRUE(TypeOf(expr)->Is<core::type::F32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000936
Ben Claytone5a67ac2022-05-19 21:50:59 +0000937 auto* call = Sem().Get<sem::Call>(expr);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000938 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +0000939 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000940 ASSERT_NE(ctor, nullptr);
941 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +0000942 ASSERT_EQ(ctor->Parameters().Length(), 1u);
dan sinclaircedcdf32023-08-10 02:39:48 +0000943 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::F32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000944}
945
Ben Clayton54a104e2023-02-22 20:04:40 +0000946TEST_F(ResolverValueConstructorValidationTest, F16_Success) {
Ben Claytoncd52f382023-08-07 13:11:08 +0000947 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +0000948
Ben Clayton01ac21c2023-02-07 16:14:25 +0000949 auto* expr = Call<f16>(Expr(1.5_h));
Zhaoming Jiang60588822022-06-28 14:03:36 +0000950 WrapInFunction(expr);
951
952 ASSERT_TRUE(r()->Resolve()) << r()->error();
953
954 ASSERT_NE(TypeOf(expr), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +0000955 ASSERT_TRUE(TypeOf(expr)->Is<core::type::F16>());
Zhaoming Jiang60588822022-06-28 14:03:36 +0000956
957 auto* call = Sem().Get<sem::Call>(expr);
958 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +0000959 auto* ctor = call->Target()->As<sem::ValueConstructor>();
Zhaoming Jiang60588822022-06-28 14:03:36 +0000960 ASSERT_NE(ctor, nullptr);
961 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +0000962 ASSERT_EQ(ctor->Parameters().Length(), 1u);
dan sinclaircedcdf32023-08-10 02:39:48 +0000963 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::F16>());
Zhaoming Jiang60588822022-06-28 14:03:36 +0000964}
965
Ben Clayton54a104e2023-02-22 20:04:40 +0000966TEST_F(ResolverValueConstructorValidationTest, Convert_f32_to_i32_Success) {
Ben Clayton01ac21c2023-02-07 16:14:25 +0000967 auto* expr = Call<i32>(1.23_f);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000968 WrapInFunction(expr);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000969
dan sinclair41e4d9a2022-05-01 14:40:55 +0000970 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000971
dan sinclair41e4d9a2022-05-01 14:40:55 +0000972 ASSERT_NE(TypeOf(expr), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +0000973 ASSERT_TRUE(TypeOf(expr)->Is<core::type::I32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000974
Ben Claytone5a67ac2022-05-19 21:50:59 +0000975 auto* call = Sem().Get<sem::Call>(expr);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000976 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +0000977 auto* ctor = call->Target()->As<sem::ValueConversion>();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000978 ASSERT_NE(ctor, nullptr);
979 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +0000980 ASSERT_EQ(ctor->Parameters().Length(), 1u);
dan sinclaircedcdf32023-08-10 02:39:48 +0000981 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::F32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000982}
983
Ben Clayton54a104e2023-02-22 20:04:40 +0000984TEST_F(ResolverValueConstructorValidationTest, Convert_i32_to_u32_Success) {
Ben Clayton01ac21c2023-02-07 16:14:25 +0000985 auto* expr = Call<u32>(123_i);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000986 WrapInFunction(expr);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000987
dan sinclair41e4d9a2022-05-01 14:40:55 +0000988 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000989
dan sinclair41e4d9a2022-05-01 14:40:55 +0000990 ASSERT_NE(TypeOf(expr), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +0000991 ASSERT_TRUE(TypeOf(expr)->Is<core::type::U32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000992
Ben Claytone5a67ac2022-05-19 21:50:59 +0000993 auto* call = Sem().Get<sem::Call>(expr);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000994 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +0000995 auto* ctor = call->Target()->As<sem::ValueConversion>();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000996 ASSERT_NE(ctor, nullptr);
997 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +0000998 ASSERT_EQ(ctor->Parameters().Length(), 1u);
dan sinclaircedcdf32023-08-10 02:39:48 +0000999 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::I32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001000}
1001
Ben Clayton54a104e2023-02-22 20:04:40 +00001002TEST_F(ResolverValueConstructorValidationTest, Convert_u32_to_f16_Success) {
Ben Claytoncd52f382023-08-07 13:11:08 +00001003 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00001004
Ben Clayton01ac21c2023-02-07 16:14:25 +00001005 auto* expr = Call<f16>(123_u);
Zhaoming Jiang60588822022-06-28 14:03:36 +00001006 WrapInFunction(expr);
1007
1008 ASSERT_TRUE(r()->Resolve()) << r()->error();
1009
1010 ASSERT_NE(TypeOf(expr), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001011 ASSERT_TRUE(TypeOf(expr)->Is<core::type::F16>());
Zhaoming Jiang60588822022-06-28 14:03:36 +00001012
1013 auto* call = Sem().Get<sem::Call>(expr);
1014 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001015 auto* ctor = call->Target()->As<sem::ValueConversion>();
Zhaoming Jiang60588822022-06-28 14:03:36 +00001016 ASSERT_NE(ctor, nullptr);
1017 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001018 ASSERT_EQ(ctor->Parameters().Length(), 1u);
dan sinclaircedcdf32023-08-10 02:39:48 +00001019 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::U32>());
Zhaoming Jiang60588822022-06-28 14:03:36 +00001020}
1021
Ben Clayton54a104e2023-02-22 20:04:40 +00001022TEST_F(ResolverValueConstructorValidationTest, Convert_f16_to_f32_Success) {
Ben Claytoncd52f382023-08-07 13:11:08 +00001023 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00001024
Ben Clayton01ac21c2023-02-07 16:14:25 +00001025 auto* expr = Call<f32>(123_h);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001026 WrapInFunction(expr);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001027
dan sinclair41e4d9a2022-05-01 14:40:55 +00001028 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001029
dan sinclair41e4d9a2022-05-01 14:40:55 +00001030 ASSERT_NE(TypeOf(expr), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001031 ASSERT_TRUE(TypeOf(expr)->Is<core::type::F32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001032
Ben Claytone5a67ac2022-05-19 21:50:59 +00001033 auto* call = Sem().Get<sem::Call>(expr);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001034 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001035 auto* ctor = call->Target()->As<sem::ValueConversion>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001036 ASSERT_NE(ctor, nullptr);
1037 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001038 ASSERT_EQ(ctor->Parameters().Length(), 1u);
dan sinclaircedcdf32023-08-10 02:39:48 +00001039 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::F16>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001040}
1041
Ben Clayton54a104e2023-02-22 20:04:40 +00001042} // namespace ScalarConstructor
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001043
Ben Clayton54a104e2023-02-22 20:04:40 +00001044namespace VectorConstructor {
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001045
Ben Clayton54a104e2023-02-22 20:04:40 +00001046TEST_F(ResolverValueConstructorValidationTest, Vec2F32_Error_ScalarArgumentTypeMismatch) {
Ben Clayton66805b02023-06-14 22:00:01 +00001047 WrapInFunction(Call<vec2<f32>>(Source{{12, 34}}, 1_i, 2_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001048
dan sinclair41e4d9a2022-05-01 14:40:55 +00001049 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001050 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001051 HasSubstr("12:34 error: no matching constructor for vec2<f32>(i32, f32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001052}
1053
Ben Clayton54a104e2023-02-22 20:04:40 +00001054TEST_F(ResolverValueConstructorValidationTest, Vec2F16_Error_ScalarArgumentTypeMismatch) {
Ben Claytoncd52f382023-08-07 13:11:08 +00001055 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00001056
Ben Clayton66805b02023-06-14 22:00:01 +00001057 WrapInFunction(Call<vec2<f16>>(Source{{12, 34}}, 1_h, 2_f));
Zhaoming Jiang60588822022-06-28 14:03:36 +00001058
1059 EXPECT_FALSE(r()->Resolve());
1060 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001061 HasSubstr("12:34 error: no matching constructor for vec2<f16>(f16, f32)"));
Zhaoming Jiang60588822022-06-28 14:03:36 +00001062}
1063
Ben Clayton54a104e2023-02-22 20:04:40 +00001064TEST_F(ResolverValueConstructorValidationTest, Vec2U32_Error_ScalarArgumentTypeMismatch) {
Ben Clayton66805b02023-06-14 22:00:01 +00001065 WrapInFunction(Call<vec2<u32>>(Source{{12, 34}}, 1_u, 2_i));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001066
dan sinclair41e4d9a2022-05-01 14:40:55 +00001067 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001068 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001069 HasSubstr("12:34 error: no matching constructor for vec2<u32>(u32, i32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001070}
1071
Ben Clayton54a104e2023-02-22 20:04:40 +00001072TEST_F(ResolverValueConstructorValidationTest, Vec2I32_Error_ScalarArgumentTypeMismatch) {
Ben Clayton66805b02023-06-14 22:00:01 +00001073 WrapInFunction(Call<vec2<i32>>(Source{{12, 34}}, 1_u, 2_i));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001074
dan sinclair41e4d9a2022-05-01 14:40:55 +00001075 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001076 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001077 HasSubstr("12:34 error: no matching constructor for vec2<i32>(u32, i32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001078}
1079
Ben Clayton54a104e2023-02-22 20:04:40 +00001080TEST_F(ResolverValueConstructorValidationTest, Vec2Bool_Error_ScalarArgumentTypeMismatch) {
Ben Clayton66805b02023-06-14 22:00:01 +00001081 WrapInFunction(Call<vec2<bool>>(Source{{12, 34}}, true, 1_i));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001082
dan sinclair41e4d9a2022-05-01 14:40:55 +00001083 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001084 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001085 HasSubstr("12:34 error: no matching constructor for vec2<bool>(bool, i32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001086}
1087
Ben Clayton54a104e2023-02-22 20:04:40 +00001088TEST_F(ResolverValueConstructorValidationTest, Vec2_Error_Vec3ArgumentCardinalityTooLarge) {
Ben Clayton66805b02023-06-14 22:00:01 +00001089 WrapInFunction(Call<vec2<f32>>(Source{{12, 34}}, Call<vec3<f32>>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001090
dan sinclair41e4d9a2022-05-01 14:40:55 +00001091 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001092 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001093 HasSubstr("12:34 error: no matching constructor for vec2<f32>(vec3<f32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001094}
1095
Ben Clayton54a104e2023-02-22 20:04:40 +00001096TEST_F(ResolverValueConstructorValidationTest, Vec2_Error_Vec4ArgumentCardinalityTooLarge) {
Ben Clayton66805b02023-06-14 22:00:01 +00001097 WrapInFunction(Call<vec2<f32>>(Source{{12, 34}}, Call<vec4<f32>>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001098
dan sinclair41e4d9a2022-05-01 14:40:55 +00001099 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001100 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001101 HasSubstr("12:34 error: no matching constructor for vec2<f32>(vec4<f32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001102}
1103
Ben Clayton54a104e2023-02-22 20:04:40 +00001104TEST_F(ResolverValueConstructorValidationTest, Vec2_Error_TooManyArgumentsScalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001105 WrapInFunction(Call<vec2<f32>>(Source{{12, 34}}, 1_f, 2_f, 3_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001106
dan sinclair41e4d9a2022-05-01 14:40:55 +00001107 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001108 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001109 HasSubstr("12:34 error: no matching constructor for vec2<f32>(f32, f32, f32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001110}
1111
Ben Clayton54a104e2023-02-22 20:04:40 +00001112TEST_F(ResolverValueConstructorValidationTest, Vec2_Error_TooManyArgumentsVector) {
Ben Clayton66805b02023-06-14 22:00:01 +00001113 WrapInFunction(Call<vec2<f32>>(Source{{12, 34}}, Call<vec2<f32>>(), Call<vec2<f32>>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001114
dan sinclair41e4d9a2022-05-01 14:40:55 +00001115 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001116 EXPECT_THAT(
1117 r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001118 HasSubstr("12:34 error: no matching constructor for vec2<f32>(vec2<f32>, vec2<f32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001119}
1120
Ben Clayton54a104e2023-02-22 20:04:40 +00001121TEST_F(ResolverValueConstructorValidationTest, Vec2_Error_TooManyArgumentsVectorAndScalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001122 WrapInFunction(Call<vec2<f32>>(Source{{12, 34}}, Call<vec2<f32>>(), 1_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001123
dan sinclair41e4d9a2022-05-01 14:40:55 +00001124 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001125 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001126 HasSubstr("12:34 error: no matching constructor for vec2<f32>(vec2<f32>, f32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001127}
1128
Ben Clayton54a104e2023-02-22 20:04:40 +00001129TEST_F(ResolverValueConstructorValidationTest, Vec2_Error_InvalidArgumentType) {
Ben Clayton66805b02023-06-14 22:00:01 +00001130 WrapInFunction(Call<vec2<f32>>(Source{{12, 34}}, Call<mat2x2<f32>>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001131
dan sinclair41e4d9a2022-05-01 14:40:55 +00001132 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001133 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001134 HasSubstr("12:34 error: no matching constructor for vec2<f32>(mat2x2<f32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001135}
1136
Ben Clayton54a104e2023-02-22 20:04:40 +00001137TEST_F(ResolverValueConstructorValidationTest, Vec2_Success_ZeroValue) {
Ben Clayton66805b02023-06-14 22:00:01 +00001138 auto* tc = Call<vec2<f32>>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001139 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001140
dan sinclair41e4d9a2022-05-01 14:40:55 +00001141 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001142
dan sinclair41e4d9a2022-05-01 14:40:55 +00001143 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001144 ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
1145 EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
1146 EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 2u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001147
Ben Claytone5a67ac2022-05-19 21:50:59 +00001148 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001149 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001150 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001151 ASSERT_NE(ctor, nullptr);
1152 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001153 ASSERT_EQ(ctor->Parameters().Length(), 0u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001154}
1155
Ben Clayton54a104e2023-02-22 20:04:40 +00001156TEST_F(ResolverValueConstructorValidationTest, Vec2F32_Success_Scalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001157 auto* tc = Call<vec2<f32>>(1_f, 1_f);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001158 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001159
dan sinclair41e4d9a2022-05-01 14:40:55 +00001160 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001161
dan sinclair41e4d9a2022-05-01 14:40:55 +00001162 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001163 ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
1164 EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
1165 EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 2u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001166
Ben Claytone5a67ac2022-05-19 21:50:59 +00001167 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001168 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001169 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001170 ASSERT_NE(ctor, nullptr);
1171 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001172 ASSERT_EQ(ctor->Parameters().Length(), 2u);
dan sinclaircedcdf32023-08-10 02:39:48 +00001173 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::F32>());
1174 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::F32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001175}
1176
Ben Clayton54a104e2023-02-22 20:04:40 +00001177TEST_F(ResolverValueConstructorValidationTest, Vec2F16_Success_Scalar) {
Ben Claytoncd52f382023-08-07 13:11:08 +00001178 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00001179
Ben Clayton66805b02023-06-14 22:00:01 +00001180 auto* tc = Call<vec2<f16>>(1_h, 1_h);
Zhaoming Jiang60588822022-06-28 14:03:36 +00001181 WrapInFunction(tc);
1182
1183 ASSERT_TRUE(r()->Resolve()) << r()->error();
1184
1185 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001186 ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
1187 EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F16>());
1188 EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 2u);
Zhaoming Jiang60588822022-06-28 14:03:36 +00001189
1190 auto* call = Sem().Get<sem::Call>(tc);
1191 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001192 auto* ctor = call->Target()->As<sem::ValueConstructor>();
Zhaoming Jiang60588822022-06-28 14:03:36 +00001193 ASSERT_NE(ctor, nullptr);
1194 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001195 ASSERT_EQ(ctor->Parameters().Length(), 2u);
dan sinclaircedcdf32023-08-10 02:39:48 +00001196 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::F16>());
1197 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::F16>());
Zhaoming Jiang60588822022-06-28 14:03:36 +00001198}
1199
Ben Clayton54a104e2023-02-22 20:04:40 +00001200TEST_F(ResolverValueConstructorValidationTest, Vec2U32_Success_Scalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001201 auto* tc = Call<vec2<u32>>(1_u, 1_u);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001202 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001203
dan sinclair41e4d9a2022-05-01 14:40:55 +00001204 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001205
dan sinclair41e4d9a2022-05-01 14:40:55 +00001206 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001207 ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
1208 EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::U32>());
1209 EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 2u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001210
Ben Claytone5a67ac2022-05-19 21:50:59 +00001211 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001212 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001213 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001214 ASSERT_NE(ctor, nullptr);
1215 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001216 ASSERT_EQ(ctor->Parameters().Length(), 2u);
dan sinclaircedcdf32023-08-10 02:39:48 +00001217 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::U32>());
1218 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::U32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001219}
1220
Ben Clayton54a104e2023-02-22 20:04:40 +00001221TEST_F(ResolverValueConstructorValidationTest, Vec2I32_Success_Scalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001222 auto* tc = Call<vec2<i32>>(1_i, 1_i);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001223 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001224
dan sinclair41e4d9a2022-05-01 14:40:55 +00001225 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001226
dan sinclair41e4d9a2022-05-01 14:40:55 +00001227 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001228 ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
1229 EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::I32>());
1230 EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 2u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001231
Ben Claytone5a67ac2022-05-19 21:50:59 +00001232 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001233 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001234 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001235 ASSERT_NE(ctor, nullptr);
1236 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001237 ASSERT_EQ(ctor->Parameters().Length(), 2u);
dan sinclaircedcdf32023-08-10 02:39:48 +00001238 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::I32>());
1239 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::I32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001240}
1241
Ben Clayton54a104e2023-02-22 20:04:40 +00001242TEST_F(ResolverValueConstructorValidationTest, Vec2Bool_Success_Scalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001243 auto* tc = Call<vec2<bool>>(true, false);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001244 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001245
dan sinclair41e4d9a2022-05-01 14:40:55 +00001246 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001247
dan sinclair41e4d9a2022-05-01 14:40:55 +00001248 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001249 ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
1250 EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::Bool>());
1251 EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 2u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001252
Ben Claytone5a67ac2022-05-19 21:50:59 +00001253 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001254 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001255 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001256 ASSERT_NE(ctor, nullptr);
1257 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001258 ASSERT_EQ(ctor->Parameters().Length(), 2u);
dan sinclaircedcdf32023-08-10 02:39:48 +00001259 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::Bool>());
1260 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::Bool>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001261}
1262
Ben Clayton54a104e2023-02-22 20:04:40 +00001263TEST_F(ResolverValueConstructorValidationTest, Vec2_Success_Identity) {
Ben Clayton66805b02023-06-14 22:00:01 +00001264 auto* tc = Call<vec2<f32>>(Call<vec2<f32>>());
dan sinclair41e4d9a2022-05-01 14:40:55 +00001265 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001266
dan sinclair41e4d9a2022-05-01 14:40:55 +00001267 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001268
dan sinclair41e4d9a2022-05-01 14:40:55 +00001269 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001270 ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
1271 EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
1272 EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 2u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001273
Ben Claytone5a67ac2022-05-19 21:50:59 +00001274 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001275 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001276 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001277 ASSERT_NE(ctor, nullptr);
1278 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001279 ASSERT_EQ(ctor->Parameters().Length(), 1u);
dan sinclaircedcdf32023-08-10 02:39:48 +00001280 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::Vector>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001281}
1282
Ben Clayton54a104e2023-02-22 20:04:40 +00001283TEST_F(ResolverValueConstructorValidationTest, Vec2_Success_Vec2TypeConversion) {
Ben Clayton66805b02023-06-14 22:00:01 +00001284 auto* tc = Call<vec2<f32>>(Call<vec2<i32>>());
dan sinclair41e4d9a2022-05-01 14:40:55 +00001285 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001286
dan sinclair41e4d9a2022-05-01 14:40:55 +00001287 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001288
dan sinclair41e4d9a2022-05-01 14:40:55 +00001289 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001290 ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
1291 EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
1292 EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 2u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001293
Ben Claytone5a67ac2022-05-19 21:50:59 +00001294 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001295 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001296 auto* ctor = call->Target()->As<sem::ValueConversion>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001297 ASSERT_NE(ctor, nullptr);
1298 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001299 ASSERT_EQ(ctor->Parameters().Length(), 1u);
dan sinclaircedcdf32023-08-10 02:39:48 +00001300 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::Vector>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001301}
1302
Ben Clayton54a104e2023-02-22 20:04:40 +00001303TEST_F(ResolverValueConstructorValidationTest, Vec3F32_Error_ScalarArgumentTypeMismatch) {
Ben Clayton66805b02023-06-14 22:00:01 +00001304 WrapInFunction(Call<vec3<f32>>(Source{{12, 34}}, 1_f, 2_f, 3_i));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001305
dan sinclair41e4d9a2022-05-01 14:40:55 +00001306 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001307 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001308 HasSubstr("12:34 error: no matching constructor for vec3<f32>(f32, f32, i32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001309}
1310
Ben Clayton54a104e2023-02-22 20:04:40 +00001311TEST_F(ResolverValueConstructorValidationTest, Vec3F16_Error_ScalarArgumentTypeMismatch) {
Ben Claytoncd52f382023-08-07 13:11:08 +00001312 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00001313
Ben Clayton66805b02023-06-14 22:00:01 +00001314 WrapInFunction(Call<vec3<f16>>(Source{{12, 34}}, 1_h, 2_h, 3_f));
Zhaoming Jiang60588822022-06-28 14:03:36 +00001315
1316 EXPECT_FALSE(r()->Resolve());
1317 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001318 HasSubstr("12:34 error: no matching constructor for vec3<f16>(f16, f16, f32)"));
Zhaoming Jiang60588822022-06-28 14:03:36 +00001319}
1320
Ben Clayton54a104e2023-02-22 20:04:40 +00001321TEST_F(ResolverValueConstructorValidationTest, Vec3U32_Error_ScalarArgumentTypeMismatch) {
Ben Clayton66805b02023-06-14 22:00:01 +00001322 WrapInFunction(Call<vec3<u32>>(Source{{12, 34}}, 1_u, 2_i, 3_u));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001323
dan sinclair41e4d9a2022-05-01 14:40:55 +00001324 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001325 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001326 HasSubstr("12:34 error: no matching constructor for vec3<u32>(u32, i32, u32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001327}
1328
Ben Clayton54a104e2023-02-22 20:04:40 +00001329TEST_F(ResolverValueConstructorValidationTest, Vec3I32_Error_ScalarArgumentTypeMismatch) {
Ben Clayton66805b02023-06-14 22:00:01 +00001330 WrapInFunction(Call<vec3<i32>>(Source{{12, 34}}, 1_i, 2_u, 3_i));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001331
dan sinclair41e4d9a2022-05-01 14:40:55 +00001332 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001333 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001334 HasSubstr("12:34 error: no matching constructor for vec3<i32>(i32, u32, i32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001335}
1336
Ben Clayton54a104e2023-02-22 20:04:40 +00001337TEST_F(ResolverValueConstructorValidationTest, Vec3Bool_Error_ScalarArgumentTypeMismatch) {
Ben Clayton66805b02023-06-14 22:00:01 +00001338 WrapInFunction(Call<vec3<bool>>(Source{{12, 34}}, false, 1_i, true));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001339
dan sinclair41e4d9a2022-05-01 14:40:55 +00001340 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001341 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001342 HasSubstr("12:34 error: no matching constructor for vec3<bool>(bool, i32, bool)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001343}
1344
Ben Clayton54a104e2023-02-22 20:04:40 +00001345TEST_F(ResolverValueConstructorValidationTest, Vec3_Error_Vec4ArgumentCardinalityTooLarge) {
Ben Clayton66805b02023-06-14 22:00:01 +00001346 WrapInFunction(Call<vec3<f32>>(Source{{12, 34}}, Call<vec4<f32>>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001347
dan sinclair41e4d9a2022-05-01 14:40:55 +00001348 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001349 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001350 HasSubstr("12:34 error: no matching constructor for vec3<f32>(vec4<f32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001351}
1352
Ben Clayton54a104e2023-02-22 20:04:40 +00001353TEST_F(ResolverValueConstructorValidationTest, Vec3_Error_TooFewArgumentsScalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001354 WrapInFunction(Call<vec3<f32>>(Source{{12, 34}}, 1_f, 2_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001355
dan sinclair41e4d9a2022-05-01 14:40:55 +00001356 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001357 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001358 HasSubstr("12:34 error: no matching constructor for vec3<f32>(f32, f32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001359}
1360
Ben Clayton54a104e2023-02-22 20:04:40 +00001361TEST_F(ResolverValueConstructorValidationTest, Vec3_Error_TooManyArgumentsScalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001362 WrapInFunction(Call<vec3<f32>>(Source{{12, 34}}, 1_f, 2_f, 3_f, 4_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001363
dan sinclair41e4d9a2022-05-01 14:40:55 +00001364 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001365 EXPECT_THAT(
1366 r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001367 HasSubstr("12:34 error: no matching constructor for vec3<f32>(f32, f32, f32, f32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001368}
1369
Ben Clayton54a104e2023-02-22 20:04:40 +00001370TEST_F(ResolverValueConstructorValidationTest, Vec3_Error_TooFewArgumentsVec2) {
Ben Clayton66805b02023-06-14 22:00:01 +00001371 WrapInFunction(Call<vec3<f32>>(Source{{12, 34}}, Call<vec2<f32>>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001372
dan sinclair41e4d9a2022-05-01 14:40:55 +00001373 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001374 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001375 HasSubstr("12:34 error: no matching constructor for vec3<f32>(vec2<f32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001376}
1377
Ben Clayton54a104e2023-02-22 20:04:40 +00001378TEST_F(ResolverValueConstructorValidationTest, Vec3_Error_TooManyArgumentsVec2) {
Ben Clayton66805b02023-06-14 22:00:01 +00001379 WrapInFunction(Call<vec3<f32>>(Source{{12, 34}}, Call<vec2<f32>>(), Call<vec2<f32>>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001380
dan sinclair41e4d9a2022-05-01 14:40:55 +00001381 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001382 EXPECT_THAT(
1383 r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001384 HasSubstr("12:34 error: no matching constructor for vec3<f32>(vec2<f32>, vec2<f32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001385}
1386
Ben Clayton54a104e2023-02-22 20:04:40 +00001387TEST_F(ResolverValueConstructorValidationTest, Vec3_Error_TooManyArgumentsVec2AndScalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001388 WrapInFunction(Call<vec3<f32>>(Source{{12, 34}}, Call<vec2<f32>>(), 1_f, 1_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001389
dan sinclair41e4d9a2022-05-01 14:40:55 +00001390 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001391 EXPECT_THAT(
1392 r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001393 HasSubstr("12:34 error: no matching constructor for vec3<f32>(vec2<f32>, f32, f32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001394}
1395
Ben Clayton54a104e2023-02-22 20:04:40 +00001396TEST_F(ResolverValueConstructorValidationTest, Vec3_Error_TooManyArgumentsVec3) {
Ben Clayton66805b02023-06-14 22:00:01 +00001397 WrapInFunction(Call<vec3<f32>>(Source{{12, 34}}, Call<vec3<f32>>(), 1_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001398
dan sinclair41e4d9a2022-05-01 14:40:55 +00001399 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001400 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001401 HasSubstr("12:34 error: no matching constructor for vec3<f32>(vec3<f32>, f32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001402}
1403
Ben Clayton54a104e2023-02-22 20:04:40 +00001404TEST_F(ResolverValueConstructorValidationTest, Vec3_Error_InvalidArgumentType) {
Ben Clayton66805b02023-06-14 22:00:01 +00001405 WrapInFunction(Call<vec3<f32>>(Source{{12, 34}}, Call<mat2x2<f32>>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001406
dan sinclair41e4d9a2022-05-01 14:40:55 +00001407 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001408 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001409 HasSubstr("12:34 error: no matching constructor for vec3<f32>(mat2x2<f32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001410}
1411
Ben Clayton54a104e2023-02-22 20:04:40 +00001412TEST_F(ResolverValueConstructorValidationTest, Vec3_Success_ZeroValue) {
Ben Clayton66805b02023-06-14 22:00:01 +00001413 auto* tc = Call<vec3<f32>>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001414 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001415
dan sinclair41e4d9a2022-05-01 14:40:55 +00001416 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001417
dan sinclair41e4d9a2022-05-01 14:40:55 +00001418 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001419 ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
1420 EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
1421 EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 3u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001422
Ben Claytone5a67ac2022-05-19 21:50:59 +00001423 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001424 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001425 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001426 ASSERT_NE(ctor, nullptr);
1427 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001428 ASSERT_EQ(ctor->Parameters().Length(), 0u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001429}
1430
Ben Clayton54a104e2023-02-22 20:04:40 +00001431TEST_F(ResolverValueConstructorValidationTest, Vec3F32_Success_Scalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001432 auto* tc = Call<vec3<f32>>(1_f, 1_f, 1_f);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001433 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001434
dan sinclair41e4d9a2022-05-01 14:40:55 +00001435 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001436
dan sinclair41e4d9a2022-05-01 14:40:55 +00001437 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001438 ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
1439 EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
1440 EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 3u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001441
Ben Claytone5a67ac2022-05-19 21:50:59 +00001442 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001443 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001444 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001445 ASSERT_NE(ctor, nullptr);
1446 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001447 ASSERT_EQ(ctor->Parameters().Length(), 3u);
dan sinclaircedcdf32023-08-10 02:39:48 +00001448 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::F32>());
1449 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::F32>());
1450 EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<core::type::F32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001451}
1452
Ben Clayton54a104e2023-02-22 20:04:40 +00001453TEST_F(ResolverValueConstructorValidationTest, Vec3F16_Success_Scalar) {
Ben Claytoncd52f382023-08-07 13:11:08 +00001454 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00001455
Ben Clayton66805b02023-06-14 22:00:01 +00001456 auto* tc = Call<vec3<f16>>(1_h, 1_h, 1_h);
Zhaoming Jiang60588822022-06-28 14:03:36 +00001457 WrapInFunction(tc);
1458
1459 ASSERT_TRUE(r()->Resolve()) << r()->error();
1460
1461 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001462 ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
1463 EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F16>());
1464 EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 3u);
Zhaoming Jiang60588822022-06-28 14:03:36 +00001465
1466 auto* call = Sem().Get<sem::Call>(tc);
1467 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001468 auto* ctor = call->Target()->As<sem::ValueConstructor>();
Zhaoming Jiang60588822022-06-28 14:03:36 +00001469 ASSERT_NE(ctor, nullptr);
1470 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001471 ASSERT_EQ(ctor->Parameters().Length(), 3u);
dan sinclaircedcdf32023-08-10 02:39:48 +00001472 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::F16>());
1473 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::F16>());
1474 EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<core::type::F16>());
Zhaoming Jiang60588822022-06-28 14:03:36 +00001475}
1476
Ben Clayton54a104e2023-02-22 20:04:40 +00001477TEST_F(ResolverValueConstructorValidationTest, Vec3U32_Success_Scalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001478 auto* tc = Call<vec3<u32>>(1_u, 1_u, 1_u);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001479 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001480
dan sinclair41e4d9a2022-05-01 14:40:55 +00001481 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001482
dan sinclair41e4d9a2022-05-01 14:40:55 +00001483 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001484 ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
1485 EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::U32>());
1486 EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 3u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001487
Ben Claytone5a67ac2022-05-19 21:50:59 +00001488 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001489 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001490 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001491 ASSERT_NE(ctor, nullptr);
1492 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001493 ASSERT_EQ(ctor->Parameters().Length(), 3u);
dan sinclaircedcdf32023-08-10 02:39:48 +00001494 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::U32>());
1495 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::U32>());
1496 EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<core::type::U32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001497}
1498
Ben Clayton54a104e2023-02-22 20:04:40 +00001499TEST_F(ResolverValueConstructorValidationTest, Vec3I32_Success_Scalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001500 auto* tc = Call<vec3<i32>>(1_i, 1_i, 1_i);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001501 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001502
dan sinclair41e4d9a2022-05-01 14:40:55 +00001503 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001504
dan sinclair41e4d9a2022-05-01 14:40:55 +00001505 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001506 ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
1507 EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::I32>());
1508 EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 3u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001509
Ben Claytone5a67ac2022-05-19 21:50:59 +00001510 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001511 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001512 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001513 ASSERT_NE(ctor, nullptr);
1514 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001515 ASSERT_EQ(ctor->Parameters().Length(), 3u);
dan sinclaircedcdf32023-08-10 02:39:48 +00001516 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::I32>());
1517 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::I32>());
1518 EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<core::type::I32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001519}
1520
Ben Clayton54a104e2023-02-22 20:04:40 +00001521TEST_F(ResolverValueConstructorValidationTest, Vec3Bool_Success_Scalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001522 auto* tc = Call<vec3<bool>>(true, false, true);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001523 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001524
dan sinclair41e4d9a2022-05-01 14:40:55 +00001525 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001526
dan sinclair41e4d9a2022-05-01 14:40:55 +00001527 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001528 ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
1529 EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::Bool>());
1530 EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 3u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001531
Ben Claytone5a67ac2022-05-19 21:50:59 +00001532 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001533 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001534 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001535 ASSERT_NE(ctor, nullptr);
1536 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001537 ASSERT_EQ(ctor->Parameters().Length(), 3u);
dan sinclaircedcdf32023-08-10 02:39:48 +00001538 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::Bool>());
1539 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::Bool>());
1540 EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<core::type::Bool>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001541}
1542
Ben Clayton54a104e2023-02-22 20:04:40 +00001543TEST_F(ResolverValueConstructorValidationTest, Vec3_Success_Vec2AndScalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001544 auto* tc = Call<vec3<f32>>(Call<vec2<f32>>(), 1_f);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001545 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001546
dan sinclair41e4d9a2022-05-01 14:40:55 +00001547 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001548
dan sinclair41e4d9a2022-05-01 14:40:55 +00001549 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001550 ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
1551 EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
1552 EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 3u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001553
Ben Claytone5a67ac2022-05-19 21:50:59 +00001554 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001555 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001556 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001557 ASSERT_NE(ctor, nullptr);
1558 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001559 ASSERT_EQ(ctor->Parameters().Length(), 2u);
dan sinclaircedcdf32023-08-10 02:39:48 +00001560 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::Vector>());
1561 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::F32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001562}
1563
Ben Clayton54a104e2023-02-22 20:04:40 +00001564TEST_F(ResolverValueConstructorValidationTest, Vec3_Success_ScalarAndVec2) {
Ben Clayton66805b02023-06-14 22:00:01 +00001565 auto* tc = Call<vec3<f32>>(1_f, Call<vec2<f32>>());
dan sinclair41e4d9a2022-05-01 14:40:55 +00001566 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001567
dan sinclair41e4d9a2022-05-01 14:40:55 +00001568 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001569
dan sinclair41e4d9a2022-05-01 14:40:55 +00001570 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001571 ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
1572 EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
1573 EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 3u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001574
Ben Claytone5a67ac2022-05-19 21:50:59 +00001575 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001576 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001577 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001578 ASSERT_NE(ctor, nullptr);
1579 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001580 ASSERT_EQ(ctor->Parameters().Length(), 2u);
dan sinclaircedcdf32023-08-10 02:39:48 +00001581 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::F32>());
1582 EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::Vector>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001583}
1584
Ben Clayton54a104e2023-02-22 20:04:40 +00001585TEST_F(ResolverValueConstructorValidationTest, Vec3_Success_Identity) {
Ben Clayton66805b02023-06-14 22:00:01 +00001586 auto* tc = Call<vec3<f32>>(Call<vec3<f32>>());
dan sinclair41e4d9a2022-05-01 14:40:55 +00001587 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001588
dan sinclair41e4d9a2022-05-01 14:40:55 +00001589 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001590
dan sinclair41e4d9a2022-05-01 14:40:55 +00001591 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001592 ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
1593 EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
1594 EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 3u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001595
Ben Claytone5a67ac2022-05-19 21:50:59 +00001596 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001597 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001598 auto* ctor = call->Target()->As<sem::ValueConstructor>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001599 ASSERT_NE(ctor, nullptr);
1600 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001601 ASSERT_EQ(ctor->Parameters().Length(), 1u);
dan sinclaircedcdf32023-08-10 02:39:48 +00001602 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::Vector>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001603}
1604
Ben Clayton54a104e2023-02-22 20:04:40 +00001605TEST_F(ResolverValueConstructorValidationTest, Vec3_Success_Vec3TypeConversion) {
Ben Clayton66805b02023-06-14 22:00:01 +00001606 auto* tc = Call<vec3<f32>>(Call<vec3<i32>>());
dan sinclair41e4d9a2022-05-01 14:40:55 +00001607 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001608
dan sinclair41e4d9a2022-05-01 14:40:55 +00001609 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001610
dan sinclair41e4d9a2022-05-01 14:40:55 +00001611 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001612 ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
1613 EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
1614 EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 3u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001615
Ben Claytone5a67ac2022-05-19 21:50:59 +00001616 auto* call = Sem().Get<sem::Call>(tc);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001617 ASSERT_NE(call, nullptr);
Ben Clayton54a104e2023-02-22 20:04:40 +00001618 auto* ctor = call->Target()->As<sem::ValueConversion>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001619 ASSERT_NE(ctor, nullptr);
1620 EXPECT_EQ(call->Type(), ctor->ReturnType());
Ben Clayton958a4642022-07-26 07:55:24 +00001621 ASSERT_EQ(ctor->Parameters().Length(), 1u);
dan sinclaircedcdf32023-08-10 02:39:48 +00001622 EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::Vector>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001623}
1624
Ben Clayton54a104e2023-02-22 20:04:40 +00001625TEST_F(ResolverValueConstructorValidationTest, Vec4F32_Error_ScalarArgumentTypeMismatch) {
Ben Clayton66805b02023-06-14 22:00:01 +00001626 WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, 1_f, 1_f, 1_i, 1_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001627
dan sinclair41e4d9a2022-05-01 14:40:55 +00001628 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001629 EXPECT_THAT(
1630 r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001631 HasSubstr("12:34 error: no matching constructor for vec4<f32>(f32, f32, i32, f32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001632}
1633
Ben Clayton54a104e2023-02-22 20:04:40 +00001634TEST_F(ResolverValueConstructorValidationTest, Vec4F16_Error_ScalarArgumentTypeMismatch) {
Ben Claytoncd52f382023-08-07 13:11:08 +00001635 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00001636
Ben Clayton66805b02023-06-14 22:00:01 +00001637 WrapInFunction(Call<vec4<f16>>(Source{{12, 34}}, 1_h, 1_h, 1_f, 1_h));
Zhaoming Jiang60588822022-06-28 14:03:36 +00001638
1639 EXPECT_FALSE(r()->Resolve());
1640 EXPECT_THAT(
1641 r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001642 HasSubstr("12:34 error: no matching constructor for vec4<f16>(f16, f16, f32, f16)"));
Zhaoming Jiang60588822022-06-28 14:03:36 +00001643}
1644
Ben Clayton54a104e2023-02-22 20:04:40 +00001645TEST_F(ResolverValueConstructorValidationTest, Vec4U32_Error_ScalarArgumentTypeMismatch) {
Ben Clayton66805b02023-06-14 22:00:01 +00001646 WrapInFunction(Call<vec4<u32>>(Source{{12, 34}}, 1_u, 1_u, 1_i, 1_u));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001647
dan sinclair41e4d9a2022-05-01 14:40:55 +00001648 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001649 EXPECT_THAT(
1650 r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001651 HasSubstr("12:34 error: no matching constructor for vec4<u32>(u32, u32, i32, u32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001652}
1653
Ben Clayton54a104e2023-02-22 20:04:40 +00001654TEST_F(ResolverValueConstructorValidationTest, Vec4I32_Error_ScalarArgumentTypeMismatch) {
Ben Clayton66805b02023-06-14 22:00:01 +00001655 WrapInFunction(Call<vec4<i32>>(Source{{12, 34}}, 1_i, 1_i, 1_u, 1_i));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001656
dan sinclair41e4d9a2022-05-01 14:40:55 +00001657 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001658 EXPECT_THAT(
1659 r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001660 HasSubstr("12:34 error: no matching constructor for vec4<i32>(i32, i32, u32, i32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001661}
1662
Ben Clayton54a104e2023-02-22 20:04:40 +00001663TEST_F(ResolverValueConstructorValidationTest, Vec4Bool_Error_ScalarArgumentTypeMismatch) {
Ben Clayton66805b02023-06-14 22:00:01 +00001664 WrapInFunction(Call<vec4<bool>>(Source{{12, 34}}, true, false, 1_i, true));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001665
dan sinclair41e4d9a2022-05-01 14:40:55 +00001666 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001667 EXPECT_THAT(
1668 r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001669 HasSubstr("12:34 error: no matching constructor for vec4<bool>(bool, bool, i32, bool)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001670}
1671
Ben Clayton54a104e2023-02-22 20:04:40 +00001672TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_TooFewArgumentsScalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001673 WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, 1_f, 2_f, 3_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001674
dan sinclair41e4d9a2022-05-01 14:40:55 +00001675 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001676 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001677 HasSubstr("12:34 error: no matching constructor for vec4<f32>(f32, f32, f32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001678}
1679
Ben Clayton54a104e2023-02-22 20:04:40 +00001680TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_TooManyArgumentsScalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001681 WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, 1_f, 2_f, 3_f, 4_f, 5_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001682
dan sinclair41e4d9a2022-05-01 14:40:55 +00001683 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001684 EXPECT_THAT(
1685 r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001686 HasSubstr("12:34 error: no matching constructor for vec4<f32>(f32, f32, f32, f32, f32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001687}
1688
Ben Clayton54a104e2023-02-22 20:04:40 +00001689TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_TooFewArgumentsVec2AndScalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001690 WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, Call<vec2<f32>>(), 1_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001691
dan sinclair41e4d9a2022-05-01 14:40:55 +00001692 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001693 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001694 HasSubstr("12:34 error: no matching constructor for vec4<f32>(vec2<f32>, f32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001695}
1696
Ben Clayton54a104e2023-02-22 20:04:40 +00001697TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_TooManyArgumentsVec2AndScalars) {
Ben Clayton66805b02023-06-14 22:00:01 +00001698 WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, Call<vec2<f32>>(), 1_f, 2_f, 3_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001699
dan sinclair41e4d9a2022-05-01 14:40:55 +00001700 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001701 EXPECT_THAT(
1702 r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001703 HasSubstr("12:34 error: no matching constructor for vec4<f32>(vec2<f32>, f32, f32, f32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001704}
1705
Ben Clayton54a104e2023-02-22 20:04:40 +00001706TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_TooManyArgumentsVec2Vec2Scalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001707 WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, Call<vec2<f32>>(), Call<vec2<f32>>(), 1_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001708
dan sinclair41e4d9a2022-05-01 14:40:55 +00001709 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001710 EXPECT_THAT(
1711 r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001712 HasSubstr("12:34 error: no matching constructor for vec4<f32>(vec2<f32>, vec2<f32>, f32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001713}
1714
Ben Clayton54a104e2023-02-22 20:04:40 +00001715TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_TooManyArgumentsVec2Vec2Vec2) {
Ben Clayton66805b02023-06-14 22:00:01 +00001716 WrapInFunction(
1717 Call<vec4<f32>>(Source{{12, 34}}, Call<vec2<f32>>(), Call<vec2<f32>>(), Call<vec2<f32>>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001718
dan sinclair41e4d9a2022-05-01 14:40:55 +00001719 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001720 EXPECT_THAT(
1721 r()->error(),
1722 HasSubstr(
Ben Clayton54a104e2023-02-22 20:04:40 +00001723 "12:34 error: no matching constructor for vec4<f32>(vec2<f32>, vec2<f32>, vec2<f32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001724}
1725
Ben Clayton54a104e2023-02-22 20:04:40 +00001726TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_TooFewArgumentsVec3) {
Ben Clayton66805b02023-06-14 22:00:01 +00001727 WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, Call<vec3<f32>>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001728
dan sinclair41e4d9a2022-05-01 14:40:55 +00001729 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001730 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001731 HasSubstr("12:34 error: no matching constructor for vec4<f32>(vec3<f32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001732}
1733
Ben Clayton54a104e2023-02-22 20:04:40 +00001734TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_TooManyArgumentsVec3AndScalars) {
Ben Clayton66805b02023-06-14 22:00:01 +00001735 WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, Call<vec3<f32>>(), 1_f, 2_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001736
dan sinclair41e4d9a2022-05-01 14:40:55 +00001737 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001738 EXPECT_THAT(
1739 r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001740 HasSubstr("12:34 error: no matching constructor for vec4<f32>(vec3<f32>, f32, f32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001741}
1742
Ben Clayton54a104e2023-02-22 20:04:40 +00001743TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_TooManyArgumentsVec3AndVec2) {
Ben Clayton66805b02023-06-14 22:00:01 +00001744 WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, Call<vec3<f32>>(), Call<vec2<f32>>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001745
dan sinclair41e4d9a2022-05-01 14:40:55 +00001746 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001747 EXPECT_THAT(
1748 r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001749 HasSubstr("12:34 error: no matching constructor for vec4<f32>(vec3<f32>, vec2<f32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001750}
1751
Ben Clayton54a104e2023-02-22 20:04:40 +00001752TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_TooManyArgumentsVec2AndVec3) {
Ben Clayton66805b02023-06-14 22:00:01 +00001753 WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, Call<vec2<f32>>(), Call<vec3<f32>>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001754
dan sinclair41e4d9a2022-05-01 14:40:55 +00001755 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001756 EXPECT_THAT(
1757 r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001758 HasSubstr("12:34 error: no matching constructor for vec4<f32>(vec2<f32>, vec3<f32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001759}
1760
Ben Clayton54a104e2023-02-22 20:04:40 +00001761TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_TooManyArgumentsVec3AndVec3) {
Ben Clayton66805b02023-06-14 22:00:01 +00001762 WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, Call<vec3<f32>>(), Call<vec3<f32>>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001763
dan sinclair41e4d9a2022-05-01 14:40:55 +00001764 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001765 EXPECT_THAT(
1766 r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001767 HasSubstr("12:34 error: no matching constructor for vec4<f32>(vec3<f32>, vec3<f32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001768}
1769
Ben Clayton54a104e2023-02-22 20:04:40 +00001770TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_InvalidArgumentType) {
Ben Clayton66805b02023-06-14 22:00:01 +00001771 WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, Call<mat2x2<f32>>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001772
dan sinclair41e4d9a2022-05-01 14:40:55 +00001773 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001774 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001775 HasSubstr("12:34 error: no matching constructor for vec4<f32>(mat2x2<f32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001776}
1777
Ben Clayton54a104e2023-02-22 20:04:40 +00001778TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_ZeroValue) {
Ben Clayton66805b02023-06-14 22:00:01 +00001779 auto* tc = Call<vec4<f32>>();
dan sinclair41e4d9a2022-05-01 14:40:55 +00001780 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001781
dan sinclair41e4d9a2022-05-01 14:40:55 +00001782 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001783
dan sinclair41e4d9a2022-05-01 14:40:55 +00001784 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001785 ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
1786 EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
1787 EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001788}
1789
Ben Clayton54a104e2023-02-22 20:04:40 +00001790TEST_F(ResolverValueConstructorValidationTest, Vec4F32_Success_Scalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001791 auto* tc = Call<vec4<f32>>(1_f, 1_f, 1_f, 1_f);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001792 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001793
dan sinclair41e4d9a2022-05-01 14:40:55 +00001794 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001795
dan sinclair41e4d9a2022-05-01 14:40:55 +00001796 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001797 ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
1798 EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
1799 EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001800}
1801
Ben Clayton54a104e2023-02-22 20:04:40 +00001802TEST_F(ResolverValueConstructorValidationTest, Vec4F16_Success_Scalar) {
Ben Claytoncd52f382023-08-07 13:11:08 +00001803 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00001804
Ben Clayton66805b02023-06-14 22:00:01 +00001805 auto* tc = Call<vec4<f16>>(1_h, 1_h, 1_h, 1_h);
Zhaoming Jiang60588822022-06-28 14:03:36 +00001806 WrapInFunction(tc);
1807
1808 ASSERT_TRUE(r()->Resolve()) << r()->error();
1809
1810 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001811 ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
1812 EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F16>());
1813 EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 4u);
Zhaoming Jiang60588822022-06-28 14:03:36 +00001814}
1815
Ben Clayton54a104e2023-02-22 20:04:40 +00001816TEST_F(ResolverValueConstructorValidationTest, Vec4U32_Success_Scalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001817 auto* tc = Call<vec4<u32>>(1_u, 1_u, 1_u, 1_u);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001818 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001819
dan sinclair41e4d9a2022-05-01 14:40:55 +00001820 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001821
dan sinclair41e4d9a2022-05-01 14:40:55 +00001822 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001823 ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
1824 EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::U32>());
1825 EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001826}
1827
Ben Clayton54a104e2023-02-22 20:04:40 +00001828TEST_F(ResolverValueConstructorValidationTest, Vec4I32_Success_Scalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001829 auto* tc = Call<vec4<i32>>(1_i, 1_i, 1_i, 1_i);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001830 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001831
dan sinclair41e4d9a2022-05-01 14:40:55 +00001832 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001833
dan sinclair41e4d9a2022-05-01 14:40:55 +00001834 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001835 ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
1836 EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::I32>());
1837 EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001838}
1839
Ben Clayton54a104e2023-02-22 20:04:40 +00001840TEST_F(ResolverValueConstructorValidationTest, Vec4Bool_Success_Scalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001841 auto* tc = Call<vec4<bool>>(true, false, true, false);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001842 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001843
dan sinclair41e4d9a2022-05-01 14:40:55 +00001844 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001845
dan sinclair41e4d9a2022-05-01 14:40:55 +00001846 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001847 ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
1848 EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::Bool>());
1849 EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001850}
1851
Ben Clayton54a104e2023-02-22 20:04:40 +00001852TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_Vec2ScalarScalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001853 auto* tc = Call<vec4<f32>>(Call<vec2<f32>>(), 1_f, 1_f);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001854 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001855
dan sinclair41e4d9a2022-05-01 14:40:55 +00001856 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001857
dan sinclair41e4d9a2022-05-01 14:40:55 +00001858 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001859 ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
1860 EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
1861 EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001862}
1863
Ben Clayton54a104e2023-02-22 20:04:40 +00001864TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_ScalarVec2Scalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001865 auto* tc = Call<vec4<f32>>(1_f, Call<vec2<f32>>(), 1_f);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001866 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001867
dan sinclair41e4d9a2022-05-01 14:40:55 +00001868 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001869
dan sinclair41e4d9a2022-05-01 14:40:55 +00001870 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001871 ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
1872 EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
1873 EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001874}
1875
Ben Clayton54a104e2023-02-22 20:04:40 +00001876TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_ScalarScalarVec2) {
Ben Clayton66805b02023-06-14 22:00:01 +00001877 auto* tc = Call<vec4<f32>>(1_f, 1_f, Call<vec2<f32>>());
dan sinclair41e4d9a2022-05-01 14:40:55 +00001878 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001879
dan sinclair41e4d9a2022-05-01 14:40:55 +00001880 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001881
dan sinclair41e4d9a2022-05-01 14:40:55 +00001882 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001883 ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
1884 EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
1885 EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001886}
1887
Ben Clayton54a104e2023-02-22 20:04:40 +00001888TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_Vec2AndVec2) {
Ben Clayton66805b02023-06-14 22:00:01 +00001889 auto* tc = Call<vec4<f32>>(Call<vec2<f32>>(), Call<vec2<f32>>());
dan sinclair41e4d9a2022-05-01 14:40:55 +00001890 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001891
dan sinclair41e4d9a2022-05-01 14:40:55 +00001892 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001893
dan sinclair41e4d9a2022-05-01 14:40:55 +00001894 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001895 ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
1896 EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
1897 EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001898}
1899
Ben Clayton54a104e2023-02-22 20:04:40 +00001900TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_Vec3AndScalar) {
Ben Clayton66805b02023-06-14 22:00:01 +00001901 auto* tc = Call<vec4<f32>>(Call<vec3<f32>>(), 1_f);
dan sinclair41e4d9a2022-05-01 14:40:55 +00001902 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001903
dan sinclair41e4d9a2022-05-01 14:40:55 +00001904 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001905
dan sinclair41e4d9a2022-05-01 14:40:55 +00001906 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001907 ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
1908 EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
1909 EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001910}
1911
Ben Clayton54a104e2023-02-22 20:04:40 +00001912TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_ScalarAndVec3) {
Ben Clayton66805b02023-06-14 22:00:01 +00001913 auto* tc = Call<vec4<f32>>(1_f, Call<vec3<f32>>());
dan sinclair41e4d9a2022-05-01 14:40:55 +00001914 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001915
dan sinclair41e4d9a2022-05-01 14:40:55 +00001916 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001917
dan sinclair41e4d9a2022-05-01 14:40:55 +00001918 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001919 ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
1920 EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
1921 EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001922}
1923
Ben Clayton54a104e2023-02-22 20:04:40 +00001924TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_Identity) {
Ben Clayton66805b02023-06-14 22:00:01 +00001925 auto* tc = Call<vec4<f32>>(Call<vec4<f32>>());
dan sinclair41e4d9a2022-05-01 14:40:55 +00001926 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001927
dan sinclair41e4d9a2022-05-01 14:40:55 +00001928 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001929
dan sinclair41e4d9a2022-05-01 14:40:55 +00001930 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001931 ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
1932 EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
1933 EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001934}
1935
Ben Clayton54a104e2023-02-22 20:04:40 +00001936TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_Vec4TypeConversion) {
Ben Clayton66805b02023-06-14 22:00:01 +00001937 auto* tc = Call<vec4<f32>>(Call<vec4<i32>>());
dan sinclair41e4d9a2022-05-01 14:40:55 +00001938 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001939
dan sinclair41e4d9a2022-05-01 14:40:55 +00001940 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001941
dan sinclair41e4d9a2022-05-01 14:40:55 +00001942 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001943 ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
1944 EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
1945 EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001946}
1947
Ben Clayton54a104e2023-02-22 20:04:40 +00001948TEST_F(ResolverValueConstructorValidationTest, NestedVectorConstructors_InnerError) {
Ben Clayton66805b02023-06-14 22:00:01 +00001949 WrapInFunction(Call<vec4<f32>>(Call<vec4<f32>>(1_f, 1_f, //
1950 Call<vec3<f32>>(Source{{12, 34}}, 1_f, 1_f)),
1951 1_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001952
dan sinclair41e4d9a2022-05-01 14:40:55 +00001953 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00001954 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00001955 HasSubstr("12:34 error: no matching constructor for vec3<f32>(f32, f32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001956}
1957
Ben Clayton54a104e2023-02-22 20:04:40 +00001958TEST_F(ResolverValueConstructorValidationTest, NestedVectorConstructors_Success) {
Ben Clayton66805b02023-06-14 22:00:01 +00001959 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 +00001960 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001961
dan sinclair41e4d9a2022-05-01 14:40:55 +00001962 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001963
dan sinclair41e4d9a2022-05-01 14:40:55 +00001964 ASSERT_NE(TypeOf(tc), nullptr);
dan sinclaircedcdf32023-08-10 02:39:48 +00001965 ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
1966 EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
1967 EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001968}
1969
Ben Clayton54a104e2023-02-22 20:04:40 +00001970TEST_F(ResolverValueConstructorValidationTest, Vector_Alias_Argument_Error) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00001971 auto* alias = Alias("UnsignedInt", ty.u32());
Ben Claytoncd52f382023-08-07 13:11:08 +00001972 GlobalVar("uint_var", ty.Of(alias), core::AddressSpace::kPrivate);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001973
Ben Clayton66805b02023-06-14 22:00:01 +00001974 auto* tc = Call<vec2<f32>>(Source{{12, 34}}, "uint_var");
dan sinclair41e4d9a2022-05-01 14:40:55 +00001975 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001976
dan sinclair41e4d9a2022-05-01 14:40:55 +00001977 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00001978 EXPECT_THAT(r()->error(), HasSubstr("12:34 error: no matching constructor for vec2<f32>(u32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001979}
1980
Ben Clayton54a104e2023-02-22 20:04:40 +00001981TEST_F(ResolverValueConstructorValidationTest, Vector_Alias_Argument_Success) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00001982 auto* f32_alias = Alias("Float32", ty.f32());
1983 auto* vec2_alias = Alias("VectorFloat2", ty.vec2<f32>());
Ben Claytoncd52f382023-08-07 13:11:08 +00001984 GlobalVar("my_f32", ty.Of(f32_alias), core::AddressSpace::kPrivate);
1985 GlobalVar("my_vec2", ty.Of(vec2_alias), core::AddressSpace::kPrivate);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001986
Ben Clayton66805b02023-06-14 22:00:01 +00001987 auto* tc = Call<vec3<f32>>("my_vec2", "my_f32");
dan sinclair41e4d9a2022-05-01 14:40:55 +00001988 WrapInFunction(tc);
1989 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001990}
1991
Ben Clayton54a104e2023-02-22 20:04:40 +00001992TEST_F(ResolverValueConstructorValidationTest, Vector_ElementTypeAlias_Error) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00001993 auto* f32_alias = Alias("Float32", ty.f32());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001994
dan sinclair41e4d9a2022-05-01 14:40:55 +00001995 // vec2<Float32>(1.0f, 1u)
Ben Clayton971318f2023-02-14 13:52:43 +00001996 auto vec_type = ty.vec(ty.Of(f32_alias), 2);
Ben Clayton01ac21c2023-02-07 16:14:25 +00001997 WrapInFunction(Call(Source{{12, 34}}, vec_type, 1_f, 1_u));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001998
dan sinclair41e4d9a2022-05-01 14:40:55 +00001999 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00002000 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00002001 HasSubstr("12:34 error: no matching constructor for vec2<f32>(f32, u32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002002}
2003
Ben Clayton54a104e2023-02-22 20:04:40 +00002004TEST_F(ResolverValueConstructorValidationTest, Vector_ElementTypeAlias_Success) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002005 auto* f32_alias = Alias("Float32", ty.f32());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002006
dan sinclair41e4d9a2022-05-01 14:40:55 +00002007 // vec2<Float32>(1.0f, 1.0f)
Ben Clayton971318f2023-02-14 13:52:43 +00002008 auto vec_type = ty.vec(ty.Of(f32_alias), 2);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002009 auto* tc = Call(Source{{12, 34}}, vec_type, 1_f, 1_f);
dan sinclair41e4d9a2022-05-01 14:40:55 +00002010 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002011
dan sinclair41e4d9a2022-05-01 14:40:55 +00002012 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002013}
2014
Ben Clayton54a104e2023-02-22 20:04:40 +00002015TEST_F(ResolverValueConstructorValidationTest, Vector_ArgumentElementTypeAlias_Error) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002016 auto* f32_alias = Alias("Float32", ty.f32());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002017
dan sinclair41e4d9a2022-05-01 14:40:55 +00002018 // vec3<u32>(vec<Float32>(), 1.0f)
Ben Clayton971318f2023-02-14 13:52:43 +00002019 auto vec_type = ty.vec(ty.Of(f32_alias), 2);
Ben Clayton66805b02023-06-14 22:00:01 +00002020 WrapInFunction(Call<vec3<u32>>(Source{{12, 34}}, Call(vec_type), 1_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002021
dan sinclair41e4d9a2022-05-01 14:40:55 +00002022 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00002023 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00002024 HasSubstr("12:34 error: no matching constructor for vec3<u32>(vec2<f32>, f32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002025}
2026
Ben Clayton54a104e2023-02-22 20:04:40 +00002027TEST_F(ResolverValueConstructorValidationTest, Vector_ArgumentElementTypeAlias_Success) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002028 auto* f32_alias = Alias("Float32", ty.f32());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002029
dan sinclair41e4d9a2022-05-01 14:40:55 +00002030 // vec3<f32>(vec<Float32>(), 1.0f)
Ben Clayton971318f2023-02-14 13:52:43 +00002031 auto vec_type = ty.vec(ty.Of(f32_alias), 2);
Ben Clayton66805b02023-06-14 22:00:01 +00002032 auto* tc = Call<vec3<f32>>(Call(Source{{12, 34}}, vec_type), 1_f);
dan sinclair41e4d9a2022-05-01 14:40:55 +00002033 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002034
dan sinclair41e4d9a2022-05-01 14:40:55 +00002035 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002036}
2037
Ben Clayton54a104e2023-02-22 20:04:40 +00002038TEST_F(ResolverValueConstructorValidationTest, InferVec2ElementTypeFromScalars) {
Ben Claytoncd52f382023-08-07 13:11:08 +00002039 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002040
Ben Clayton66805b02023-06-14 22:00:01 +00002041 auto* vec2_bool = Call<vec2<Infer>>(true, false);
2042 auto* vec2_i32 = Call<vec2<Infer>>(1_i, 2_i);
2043 auto* vec2_u32 = Call<vec2<Infer>>(1_u, 2_u);
2044 auto* vec2_f32 = Call<vec2<Infer>>(1_f, 2_f);
2045 auto* vec2_f16 = Call<vec2<Infer>>(1_h, 2_h);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002046 WrapInFunction(vec2_bool, vec2_i32, vec2_u32, vec2_f32, vec2_f16);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002047
dan sinclair41e4d9a2022-05-01 14:40:55 +00002048 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002049
dan sinclaircedcdf32023-08-10 02:39:48 +00002050 ASSERT_TRUE(TypeOf(vec2_bool)->Is<core::type::Vector>());
2051 ASSERT_TRUE(TypeOf(vec2_i32)->Is<core::type::Vector>());
2052 ASSERT_TRUE(TypeOf(vec2_u32)->Is<core::type::Vector>());
2053 ASSERT_TRUE(TypeOf(vec2_f32)->Is<core::type::Vector>());
2054 ASSERT_TRUE(TypeOf(vec2_f16)->Is<core::type::Vector>());
2055 EXPECT_TRUE(TypeOf(vec2_bool)->As<core::type::Vector>()->type()->Is<core::type::Bool>());
2056 EXPECT_TRUE(TypeOf(vec2_i32)->As<core::type::Vector>()->type()->Is<core::type::I32>());
2057 EXPECT_TRUE(TypeOf(vec2_u32)->As<core::type::Vector>()->type()->Is<core::type::U32>());
2058 EXPECT_TRUE(TypeOf(vec2_f32)->As<core::type::Vector>()->type()->Is<core::type::F32>());
2059 EXPECT_TRUE(TypeOf(vec2_f16)->As<core::type::Vector>()->type()->Is<core::type::F16>());
2060 EXPECT_EQ(TypeOf(vec2_bool)->As<core::type::Vector>()->Width(), 2u);
2061 EXPECT_EQ(TypeOf(vec2_i32)->As<core::type::Vector>()->Width(), 2u);
2062 EXPECT_EQ(TypeOf(vec2_u32)->As<core::type::Vector>()->Width(), 2u);
2063 EXPECT_EQ(TypeOf(vec2_f32)->As<core::type::Vector>()->Width(), 2u);
2064 EXPECT_EQ(TypeOf(vec2_f16)->As<core::type::Vector>()->Width(), 2u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002065}
2066
Ben Clayton54a104e2023-02-22 20:04:40 +00002067TEST_F(ResolverValueConstructorValidationTest, InferVec2ElementTypeFromVec2) {
Ben Claytoncd52f382023-08-07 13:11:08 +00002068 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002069
Ben Clayton66805b02023-06-14 22:00:01 +00002070 auto* vec2_bool = Call<vec2<Infer>>(Call<vec2<bool>>(true, false));
2071 auto* vec2_i32 = Call<vec2<Infer>>(Call<vec2<i32>>(1_i, 2_i));
2072 auto* vec2_u32 = Call<vec2<Infer>>(Call<vec2<u32>>(1_u, 2_u));
2073 auto* vec2_f32 = Call<vec2<Infer>>(Call<vec2<f32>>(1_f, 2_f));
2074 auto* vec2_f16 = Call<vec2<Infer>>(Call<vec2<f16>>(1_h, 2_h));
Zhaoming Jiang60588822022-06-28 14:03:36 +00002075 WrapInFunction(vec2_bool, vec2_i32, vec2_u32, vec2_f32, vec2_f16);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002076
dan sinclair41e4d9a2022-05-01 14:40:55 +00002077 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002078
dan sinclaircedcdf32023-08-10 02:39:48 +00002079 ASSERT_TRUE(TypeOf(vec2_bool)->Is<core::type::Vector>());
2080 ASSERT_TRUE(TypeOf(vec2_i32)->Is<core::type::Vector>());
2081 ASSERT_TRUE(TypeOf(vec2_u32)->Is<core::type::Vector>());
2082 ASSERT_TRUE(TypeOf(vec2_f32)->Is<core::type::Vector>());
2083 ASSERT_TRUE(TypeOf(vec2_f16)->Is<core::type::Vector>());
2084 EXPECT_TRUE(TypeOf(vec2_bool)->As<core::type::Vector>()->type()->Is<core::type::Bool>());
2085 EXPECT_TRUE(TypeOf(vec2_i32)->As<core::type::Vector>()->type()->Is<core::type::I32>());
2086 EXPECT_TRUE(TypeOf(vec2_u32)->As<core::type::Vector>()->type()->Is<core::type::U32>());
2087 EXPECT_TRUE(TypeOf(vec2_f32)->As<core::type::Vector>()->type()->Is<core::type::F32>());
2088 EXPECT_TRUE(TypeOf(vec2_f16)->As<core::type::Vector>()->type()->Is<core::type::F16>());
2089 EXPECT_EQ(TypeOf(vec2_bool)->As<core::type::Vector>()->Width(), 2u);
2090 EXPECT_EQ(TypeOf(vec2_i32)->As<core::type::Vector>()->Width(), 2u);
2091 EXPECT_EQ(TypeOf(vec2_u32)->As<core::type::Vector>()->Width(), 2u);
2092 EXPECT_EQ(TypeOf(vec2_f32)->As<core::type::Vector>()->Width(), 2u);
2093 EXPECT_EQ(TypeOf(vec2_f16)->As<core::type::Vector>()->Width(), 2u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002094}
2095
Ben Clayton54a104e2023-02-22 20:04:40 +00002096TEST_F(ResolverValueConstructorValidationTest, InferVec3ElementTypeFromScalars) {
Ben Claytoncd52f382023-08-07 13:11:08 +00002097 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002098
Ben Clayton66805b02023-06-14 22:00:01 +00002099 auto* vec3_bool = Call<vec3<Infer>>(true, false, true);
2100 auto* vec3_i32 = Call<vec3<Infer>>(1_i, 2_i, 3_i);
2101 auto* vec3_u32 = Call<vec3<Infer>>(1_u, 2_u, 3_u);
2102 auto* vec3_f32 = Call<vec3<Infer>>(1_f, 2_f, 3_f);
2103 auto* vec3_f16 = Call<vec3<Infer>>(1_h, 2_h, 3_h);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002104 WrapInFunction(vec3_bool, vec3_i32, vec3_u32, vec3_f32, vec3_f16);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002105
dan sinclair41e4d9a2022-05-01 14:40:55 +00002106 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002107
dan sinclaircedcdf32023-08-10 02:39:48 +00002108 ASSERT_TRUE(TypeOf(vec3_bool)->Is<core::type::Vector>());
2109 ASSERT_TRUE(TypeOf(vec3_i32)->Is<core::type::Vector>());
2110 ASSERT_TRUE(TypeOf(vec3_u32)->Is<core::type::Vector>());
2111 ASSERT_TRUE(TypeOf(vec3_f32)->Is<core::type::Vector>());
2112 ASSERT_TRUE(TypeOf(vec3_f16)->Is<core::type::Vector>());
2113 EXPECT_TRUE(TypeOf(vec3_bool)->As<core::type::Vector>()->type()->Is<core::type::Bool>());
2114 EXPECT_TRUE(TypeOf(vec3_i32)->As<core::type::Vector>()->type()->Is<core::type::I32>());
2115 EXPECT_TRUE(TypeOf(vec3_u32)->As<core::type::Vector>()->type()->Is<core::type::U32>());
2116 EXPECT_TRUE(TypeOf(vec3_f32)->As<core::type::Vector>()->type()->Is<core::type::F32>());
2117 EXPECT_TRUE(TypeOf(vec3_f16)->As<core::type::Vector>()->type()->Is<core::type::F16>());
2118 EXPECT_EQ(TypeOf(vec3_bool)->As<core::type::Vector>()->Width(), 3u);
2119 EXPECT_EQ(TypeOf(vec3_i32)->As<core::type::Vector>()->Width(), 3u);
2120 EXPECT_EQ(TypeOf(vec3_u32)->As<core::type::Vector>()->Width(), 3u);
2121 EXPECT_EQ(TypeOf(vec3_f32)->As<core::type::Vector>()->Width(), 3u);
2122 EXPECT_EQ(TypeOf(vec3_f16)->As<core::type::Vector>()->Width(), 3u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002123}
2124
Ben Clayton54a104e2023-02-22 20:04:40 +00002125TEST_F(ResolverValueConstructorValidationTest, InferVec3ElementTypeFromVec3) {
Ben Claytoncd52f382023-08-07 13:11:08 +00002126 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002127
Ben Clayton66805b02023-06-14 22:00:01 +00002128 auto* vec3_bool = Call<vec3<Infer>>(Call<vec3<bool>>(true, false, true));
2129 auto* vec3_i32 = Call<vec3<Infer>>(Call<vec3<i32>>(1_i, 2_i, 3_i));
2130 auto* vec3_u32 = Call<vec3<Infer>>(Call<vec3<u32>>(1_u, 2_u, 3_u));
2131 auto* vec3_f32 = Call<vec3<Infer>>(Call<vec3<f32>>(1_f, 2_f, 3_f));
2132 auto* vec3_f16 = Call<vec3<Infer>>(Call<vec3<f16>>(1_h, 2_h, 3_h));
Zhaoming Jiang60588822022-06-28 14:03:36 +00002133 WrapInFunction(vec3_bool, vec3_i32, vec3_u32, vec3_f32, vec3_f16);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002134
dan sinclair41e4d9a2022-05-01 14:40:55 +00002135 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002136
dan sinclaircedcdf32023-08-10 02:39:48 +00002137 ASSERT_TRUE(TypeOf(vec3_bool)->Is<core::type::Vector>());
2138 ASSERT_TRUE(TypeOf(vec3_i32)->Is<core::type::Vector>());
2139 ASSERT_TRUE(TypeOf(vec3_u32)->Is<core::type::Vector>());
2140 ASSERT_TRUE(TypeOf(vec3_f32)->Is<core::type::Vector>());
2141 ASSERT_TRUE(TypeOf(vec3_f16)->Is<core::type::Vector>());
2142 EXPECT_TRUE(TypeOf(vec3_bool)->As<core::type::Vector>()->type()->Is<core::type::Bool>());
2143 EXPECT_TRUE(TypeOf(vec3_i32)->As<core::type::Vector>()->type()->Is<core::type::I32>());
2144 EXPECT_TRUE(TypeOf(vec3_u32)->As<core::type::Vector>()->type()->Is<core::type::U32>());
2145 EXPECT_TRUE(TypeOf(vec3_f32)->As<core::type::Vector>()->type()->Is<core::type::F32>());
2146 EXPECT_TRUE(TypeOf(vec3_f16)->As<core::type::Vector>()->type()->Is<core::type::F16>());
2147 EXPECT_EQ(TypeOf(vec3_bool)->As<core::type::Vector>()->Width(), 3u);
2148 EXPECT_EQ(TypeOf(vec3_i32)->As<core::type::Vector>()->Width(), 3u);
2149 EXPECT_EQ(TypeOf(vec3_u32)->As<core::type::Vector>()->Width(), 3u);
2150 EXPECT_EQ(TypeOf(vec3_f32)->As<core::type::Vector>()->Width(), 3u);
2151 EXPECT_EQ(TypeOf(vec3_f16)->As<core::type::Vector>()->Width(), 3u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002152}
2153
Ben Clayton54a104e2023-02-22 20:04:40 +00002154TEST_F(ResolverValueConstructorValidationTest, InferVec3ElementTypeFromScalarAndVec2) {
Ben Claytoncd52f382023-08-07 13:11:08 +00002155 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002156
Ben Clayton66805b02023-06-14 22:00:01 +00002157 auto* vec3_bool = Call<vec3<Infer>>(true, Call<vec2<bool>>(false, true));
2158 auto* vec3_i32 = Call<vec3<Infer>>(1_i, Call<vec2<i32>>(2_i, 3_i));
2159 auto* vec3_u32 = Call<vec3<Infer>>(1_u, Call<vec2<u32>>(2_u, 3_u));
2160 auto* vec3_f32 = Call<vec3<Infer>>(1_f, Call<vec2<f32>>(2_f, 3_f));
2161 auto* vec3_f16 = Call<vec3<Infer>>(1_h, Call<vec2<f16>>(2_h, 3_h));
Zhaoming Jiang60588822022-06-28 14:03:36 +00002162 WrapInFunction(vec3_bool, vec3_i32, vec3_u32, vec3_f32, vec3_f16);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002163
dan sinclair41e4d9a2022-05-01 14:40:55 +00002164 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002165
dan sinclaircedcdf32023-08-10 02:39:48 +00002166 ASSERT_TRUE(TypeOf(vec3_bool)->Is<core::type::Vector>());
2167 ASSERT_TRUE(TypeOf(vec3_i32)->Is<core::type::Vector>());
2168 ASSERT_TRUE(TypeOf(vec3_u32)->Is<core::type::Vector>());
2169 ASSERT_TRUE(TypeOf(vec3_f32)->Is<core::type::Vector>());
2170 ASSERT_TRUE(TypeOf(vec3_f16)->Is<core::type::Vector>());
2171 EXPECT_TRUE(TypeOf(vec3_bool)->As<core::type::Vector>()->type()->Is<core::type::Bool>());
2172 EXPECT_TRUE(TypeOf(vec3_i32)->As<core::type::Vector>()->type()->Is<core::type::I32>());
2173 EXPECT_TRUE(TypeOf(vec3_u32)->As<core::type::Vector>()->type()->Is<core::type::U32>());
2174 EXPECT_TRUE(TypeOf(vec3_f32)->As<core::type::Vector>()->type()->Is<core::type::F32>());
2175 EXPECT_TRUE(TypeOf(vec3_f16)->As<core::type::Vector>()->type()->Is<core::type::F16>());
2176 EXPECT_EQ(TypeOf(vec3_bool)->As<core::type::Vector>()->Width(), 3u);
2177 EXPECT_EQ(TypeOf(vec3_i32)->As<core::type::Vector>()->Width(), 3u);
2178 EXPECT_EQ(TypeOf(vec3_u32)->As<core::type::Vector>()->Width(), 3u);
2179 EXPECT_EQ(TypeOf(vec3_f32)->As<core::type::Vector>()->Width(), 3u);
2180 EXPECT_EQ(TypeOf(vec3_f16)->As<core::type::Vector>()->Width(), 3u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002181}
2182
Ben Clayton54a104e2023-02-22 20:04:40 +00002183TEST_F(ResolverValueConstructorValidationTest, InferVec4ElementTypeFromScalars) {
Ben Claytoncd52f382023-08-07 13:11:08 +00002184 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002185
Ben Clayton66805b02023-06-14 22:00:01 +00002186 auto* vec4_bool = Call<vec4<Infer>>(true, false, true, false);
2187 auto* vec4_i32 = Call<vec4<Infer>>(1_i, 2_i, 3_i, 4_i);
2188 auto* vec4_u32 = Call<vec4<Infer>>(1_u, 2_u, 3_u, 4_u);
2189 auto* vec4_f32 = Call<vec4<Infer>>(1_f, 2_f, 3_f, 4_f);
2190 auto* vec4_f16 = Call<vec4<Infer>>(1_h, 2_h, 3_h, 4_h);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002191 WrapInFunction(vec4_bool, vec4_i32, vec4_u32, vec4_f32, vec4_f16);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002192
dan sinclair41e4d9a2022-05-01 14:40:55 +00002193 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002194
dan sinclaircedcdf32023-08-10 02:39:48 +00002195 ASSERT_TRUE(TypeOf(vec4_bool)->Is<core::type::Vector>());
2196 ASSERT_TRUE(TypeOf(vec4_i32)->Is<core::type::Vector>());
2197 ASSERT_TRUE(TypeOf(vec4_u32)->Is<core::type::Vector>());
2198 ASSERT_TRUE(TypeOf(vec4_f32)->Is<core::type::Vector>());
2199 ASSERT_TRUE(TypeOf(vec4_f16)->Is<core::type::Vector>());
2200 EXPECT_TRUE(TypeOf(vec4_bool)->As<core::type::Vector>()->type()->Is<core::type::Bool>());
2201 EXPECT_TRUE(TypeOf(vec4_i32)->As<core::type::Vector>()->type()->Is<core::type::I32>());
2202 EXPECT_TRUE(TypeOf(vec4_u32)->As<core::type::Vector>()->type()->Is<core::type::U32>());
2203 EXPECT_TRUE(TypeOf(vec4_f32)->As<core::type::Vector>()->type()->Is<core::type::F32>());
2204 EXPECT_TRUE(TypeOf(vec4_f16)->As<core::type::Vector>()->type()->Is<core::type::F16>());
2205 EXPECT_EQ(TypeOf(vec4_bool)->As<core::type::Vector>()->Width(), 4u);
2206 EXPECT_EQ(TypeOf(vec4_i32)->As<core::type::Vector>()->Width(), 4u);
2207 EXPECT_EQ(TypeOf(vec4_u32)->As<core::type::Vector>()->Width(), 4u);
2208 EXPECT_EQ(TypeOf(vec4_f32)->As<core::type::Vector>()->Width(), 4u);
2209 EXPECT_EQ(TypeOf(vec4_f16)->As<core::type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002210}
2211
Ben Clayton54a104e2023-02-22 20:04:40 +00002212TEST_F(ResolverValueConstructorValidationTest, InferVec4ElementTypeFromVec4) {
Ben Claytoncd52f382023-08-07 13:11:08 +00002213 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002214
Ben Clayton66805b02023-06-14 22:00:01 +00002215 auto* vec4_bool = Call<vec4<Infer>>(Call<vec4<bool>>(true, false, true, false));
2216 auto* vec4_i32 = Call<vec4<Infer>>(Call<vec4<i32>>(1_i, 2_i, 3_i, 4_i));
2217 auto* vec4_u32 = Call<vec4<Infer>>(Call<vec4<u32>>(1_u, 2_u, 3_u, 4_u));
2218 auto* vec4_f32 = Call<vec4<Infer>>(Call<vec4<f32>>(1_f, 2_f, 3_f, 4_f));
2219 auto* vec4_f16 = Call<vec4<Infer>>(Call<vec4<f16>>(1_h, 2_h, 3_h, 4_h));
Zhaoming Jiang60588822022-06-28 14:03:36 +00002220 WrapInFunction(vec4_bool, vec4_i32, vec4_u32, vec4_f32, vec4_f16);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002221
dan sinclair41e4d9a2022-05-01 14:40:55 +00002222 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002223
dan sinclaircedcdf32023-08-10 02:39:48 +00002224 ASSERT_TRUE(TypeOf(vec4_bool)->Is<core::type::Vector>());
2225 ASSERT_TRUE(TypeOf(vec4_i32)->Is<core::type::Vector>());
2226 ASSERT_TRUE(TypeOf(vec4_u32)->Is<core::type::Vector>());
2227 ASSERT_TRUE(TypeOf(vec4_f32)->Is<core::type::Vector>());
2228 ASSERT_TRUE(TypeOf(vec4_f16)->Is<core::type::Vector>());
2229 EXPECT_TRUE(TypeOf(vec4_bool)->As<core::type::Vector>()->type()->Is<core::type::Bool>());
2230 EXPECT_TRUE(TypeOf(vec4_i32)->As<core::type::Vector>()->type()->Is<core::type::I32>());
2231 EXPECT_TRUE(TypeOf(vec4_u32)->As<core::type::Vector>()->type()->Is<core::type::U32>());
2232 EXPECT_TRUE(TypeOf(vec4_f32)->As<core::type::Vector>()->type()->Is<core::type::F32>());
2233 EXPECT_TRUE(TypeOf(vec4_f16)->As<core::type::Vector>()->type()->Is<core::type::F16>());
2234 EXPECT_EQ(TypeOf(vec4_bool)->As<core::type::Vector>()->Width(), 4u);
2235 EXPECT_EQ(TypeOf(vec4_i32)->As<core::type::Vector>()->Width(), 4u);
2236 EXPECT_EQ(TypeOf(vec4_u32)->As<core::type::Vector>()->Width(), 4u);
2237 EXPECT_EQ(TypeOf(vec4_f32)->As<core::type::Vector>()->Width(), 4u);
2238 EXPECT_EQ(TypeOf(vec4_f16)->As<core::type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002239}
2240
Ben Clayton54a104e2023-02-22 20:04:40 +00002241TEST_F(ResolverValueConstructorValidationTest, InferVec4ElementTypeFromScalarAndVec3) {
Ben Claytoncd52f382023-08-07 13:11:08 +00002242 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002243
Ben Clayton66805b02023-06-14 22:00:01 +00002244 auto* vec4_bool = Call<vec4<Infer>>(true, Call<vec3<bool>>(false, true, false));
2245 auto* vec4_i32 = Call<vec4<Infer>>(1_i, Call<vec3<i32>>(2_i, 3_i, 4_i));
2246 auto* vec4_u32 = Call<vec4<Infer>>(1_u, Call<vec3<u32>>(2_u, 3_u, 4_u));
2247 auto* vec4_f32 = Call<vec4<Infer>>(1_f, Call<vec3<f32>>(2_f, 3_f, 4_f));
2248 auto* vec4_f16 = Call<vec4<Infer>>(1_h, Call<vec3<f16>>(2_h, 3_h, 4_h));
Zhaoming Jiang60588822022-06-28 14:03:36 +00002249 WrapInFunction(vec4_bool, vec4_i32, vec4_u32, vec4_f32, vec4_f16);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002250
dan sinclair41e4d9a2022-05-01 14:40:55 +00002251 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002252
dan sinclaircedcdf32023-08-10 02:39:48 +00002253 ASSERT_TRUE(TypeOf(vec4_bool)->Is<core::type::Vector>());
2254 ASSERT_TRUE(TypeOf(vec4_i32)->Is<core::type::Vector>());
2255 ASSERT_TRUE(TypeOf(vec4_u32)->Is<core::type::Vector>());
2256 ASSERT_TRUE(TypeOf(vec4_f32)->Is<core::type::Vector>());
2257 ASSERT_TRUE(TypeOf(vec4_f16)->Is<core::type::Vector>());
2258 EXPECT_TRUE(TypeOf(vec4_bool)->As<core::type::Vector>()->type()->Is<core::type::Bool>());
2259 EXPECT_TRUE(TypeOf(vec4_i32)->As<core::type::Vector>()->type()->Is<core::type::I32>());
2260 EXPECT_TRUE(TypeOf(vec4_u32)->As<core::type::Vector>()->type()->Is<core::type::U32>());
2261 EXPECT_TRUE(TypeOf(vec4_f32)->As<core::type::Vector>()->type()->Is<core::type::F32>());
2262 EXPECT_TRUE(TypeOf(vec4_f16)->As<core::type::Vector>()->type()->Is<core::type::F16>());
2263 EXPECT_EQ(TypeOf(vec4_bool)->As<core::type::Vector>()->Width(), 4u);
2264 EXPECT_EQ(TypeOf(vec4_i32)->As<core::type::Vector>()->Width(), 4u);
2265 EXPECT_EQ(TypeOf(vec4_u32)->As<core::type::Vector>()->Width(), 4u);
2266 EXPECT_EQ(TypeOf(vec4_f32)->As<core::type::Vector>()->Width(), 4u);
2267 EXPECT_EQ(TypeOf(vec4_f16)->As<core::type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002268}
2269
Ben Clayton54a104e2023-02-22 20:04:40 +00002270TEST_F(ResolverValueConstructorValidationTest, InferVec4ElementTypeFromVec2AndVec2) {
Ben Claytoncd52f382023-08-07 13:11:08 +00002271 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002272
Ben Clayton66805b02023-06-14 22:00:01 +00002273 auto* vec4_bool =
2274 Call<vec4<Infer>>(Call<vec2<bool>>(true, false), Call<vec2<bool>>(true, false));
2275 auto* vec4_i32 = Call<vec4<Infer>>(Call<vec2<i32>>(1_i, 2_i), Call<vec2<i32>>(3_i, 4_i));
2276 auto* vec4_u32 = Call<vec4<Infer>>(Call<vec2<u32>>(1_u, 2_u), Call<vec2<u32>>(3_u, 4_u));
2277 auto* vec4_f32 = Call<vec4<Infer>>(Call<vec2<f32>>(1_f, 2_f), Call<vec2<f32>>(3_f, 4_f));
2278 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 +00002279 WrapInFunction(vec4_bool, vec4_i32, vec4_u32, vec4_f32, vec4_f16);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002280
dan sinclair41e4d9a2022-05-01 14:40:55 +00002281 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002282
dan sinclaircedcdf32023-08-10 02:39:48 +00002283 ASSERT_TRUE(TypeOf(vec4_bool)->Is<core::type::Vector>());
2284 ASSERT_TRUE(TypeOf(vec4_i32)->Is<core::type::Vector>());
2285 ASSERT_TRUE(TypeOf(vec4_u32)->Is<core::type::Vector>());
2286 ASSERT_TRUE(TypeOf(vec4_f32)->Is<core::type::Vector>());
2287 ASSERT_TRUE(TypeOf(vec4_f16)->Is<core::type::Vector>());
2288 EXPECT_TRUE(TypeOf(vec4_bool)->As<core::type::Vector>()->type()->Is<core::type::Bool>());
2289 EXPECT_TRUE(TypeOf(vec4_i32)->As<core::type::Vector>()->type()->Is<core::type::I32>());
2290 EXPECT_TRUE(TypeOf(vec4_u32)->As<core::type::Vector>()->type()->Is<core::type::U32>());
2291 EXPECT_TRUE(TypeOf(vec4_f32)->As<core::type::Vector>()->type()->Is<core::type::F32>());
2292 EXPECT_TRUE(TypeOf(vec4_f16)->As<core::type::Vector>()->type()->Is<core::type::F16>());
2293 EXPECT_EQ(TypeOf(vec4_bool)->As<core::type::Vector>()->Width(), 4u);
2294 EXPECT_EQ(TypeOf(vec4_i32)->As<core::type::Vector>()->Width(), 4u);
2295 EXPECT_EQ(TypeOf(vec4_u32)->As<core::type::Vector>()->Width(), 4u);
2296 EXPECT_EQ(TypeOf(vec4_f32)->As<core::type::Vector>()->Width(), 4u);
2297 EXPECT_EQ(TypeOf(vec4_f16)->As<core::type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002298}
2299
Ben Claytonde42feb2023-04-21 12:19:49 +00002300TEST_F(ResolverValueConstructorValidationTest, InferVecNoArgs) {
Ben Clayton66805b02023-06-14 22:00:01 +00002301 auto* v2 = Call<vec2<Infer>>();
2302 auto* v3 = Call<vec3<Infer>>();
2303 auto* v4 = Call<vec4<Infer>>();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002304
Ben Claytonde42feb2023-04-21 12:19:49 +00002305 GlobalConst("v2", v2);
2306 GlobalConst("v3", v3);
2307 GlobalConst("v4", v4);
2308
2309 ASSERT_TRUE(r()->Resolve()) << r()->error();
2310
dan sinclaircedcdf32023-08-10 02:39:48 +00002311 ASSERT_TRUE(TypeOf(v2)->Is<core::type::Vector>());
2312 ASSERT_TRUE(TypeOf(v3)->Is<core::type::Vector>());
2313 ASSERT_TRUE(TypeOf(v4)->Is<core::type::Vector>());
2314 EXPECT_TRUE(TypeOf(v2)->As<core::type::Vector>()->type()->Is<core::type::AbstractInt>());
2315 EXPECT_TRUE(TypeOf(v3)->As<core::type::Vector>()->type()->Is<core::type::AbstractInt>());
2316 EXPECT_TRUE(TypeOf(v4)->As<core::type::Vector>()->type()->Is<core::type::AbstractInt>());
2317 EXPECT_EQ(TypeOf(v2)->As<core::type::Vector>()->Width(), 2u);
2318 EXPECT_EQ(TypeOf(v3)->As<core::type::Vector>()->Width(), 3u);
2319 EXPECT_EQ(TypeOf(v4)->As<core::type::Vector>()->Width(), 4u);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002320}
2321
Ben Clayton54a104e2023-02-22 20:04:40 +00002322TEST_F(ResolverValueConstructorValidationTest, CannotInferVec2ElementTypeFromScalarsMismatch) {
Ben Clayton971318f2023-02-14 13:52:43 +00002323 WrapInFunction(Call(Source{{1, 1}}, "vec2", //
Ben Clayton01ac21c2023-02-07 16:14:25 +00002324 Expr(Source{{1, 2}}, 1_i), //
2325 Expr(Source{{1, 3}}, 2_u)));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002326
dan sinclair41e4d9a2022-05-01 14:40:55 +00002327 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00002328 EXPECT_THAT(r()->error(), HasSubstr("1:1 error: no matching constructor for vec2(i32, u32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002329}
2330
Ben Clayton54a104e2023-02-22 20:04:40 +00002331TEST_F(ResolverValueConstructorValidationTest, CannotInferVec3ElementTypeFromScalarsMismatch) {
Ben Clayton971318f2023-02-14 13:52:43 +00002332 WrapInFunction(Call(Source{{1, 1}}, "vec3", //
Ben Clayton01ac21c2023-02-07 16:14:25 +00002333 Expr(Source{{1, 2}}, 1_i), //
2334 Expr(Source{{1, 3}}, 2_u), //
2335 Expr(Source{{1, 4}}, 3_i)));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002336
dan sinclair41e4d9a2022-05-01 14:40:55 +00002337 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00002338 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00002339 HasSubstr("1:1 error: no matching constructor for vec3(i32, u32, i32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002340}
2341
Ben Clayton54a104e2023-02-22 20:04:40 +00002342TEST_F(ResolverValueConstructorValidationTest,
2343 CannotInferVec3ElementTypeFromScalarAndVec2Mismatch) {
Ben Clayton971318f2023-02-14 13:52:43 +00002344 WrapInFunction(Call(Source{{1, 1}}, "vec3", //
Ben Clayton01ac21c2023-02-07 16:14:25 +00002345 Expr(Source{{1, 2}}, 1_i), //
2346 Call(Source{{1, 3}}, ty.vec2<f32>(), 2_f, 3_f)));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002347
dan sinclair41e4d9a2022-05-01 14:40:55 +00002348 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00002349 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00002350 HasSubstr("1:1 error: no matching constructor for vec3(i32, vec2<f32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002351}
2352
Ben Clayton54a104e2023-02-22 20:04:40 +00002353TEST_F(ResolverValueConstructorValidationTest, CannotInferVec4ElementTypeFromScalarsMismatch) {
Ben Clayton971318f2023-02-14 13:52:43 +00002354 WrapInFunction(Call(Source{{1, 1}}, "vec4", //
Ben Clayton01ac21c2023-02-07 16:14:25 +00002355 Expr(Source{{1, 2}}, 1_i), //
2356 Expr(Source{{1, 3}}, 2_i), //
2357 Expr(Source{{1, 4}}, 3_f), //
2358 Expr(Source{{1, 5}}, 4_i)));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002359
dan sinclair41e4d9a2022-05-01 14:40:55 +00002360 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00002361 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00002362 HasSubstr("1:1 error: no matching constructor for vec4(i32, i32, f32, i32)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002363}
2364
Ben Clayton54a104e2023-02-22 20:04:40 +00002365TEST_F(ResolverValueConstructorValidationTest,
2366 CannotInferVec4ElementTypeFromScalarAndVec3Mismatch) {
Ben Clayton971318f2023-02-14 13:52:43 +00002367 WrapInFunction(Call(Source{{1, 1}}, "vec4", //
Ben Clayton01ac21c2023-02-07 16:14:25 +00002368 Expr(Source{{1, 2}}, 1_i), //
2369 Call(Source{{1, 3}}, ty.vec3<u32>(), 2_u, 3_u, 4_u)));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002370
dan sinclair41e4d9a2022-05-01 14:40:55 +00002371 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00002372 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00002373 HasSubstr("1:1 error: no matching constructor for vec4(i32, vec3<u32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002374}
2375
Ben Clayton54a104e2023-02-22 20:04:40 +00002376TEST_F(ResolverValueConstructorValidationTest, CannotInferVec4ElementTypeFromVec2AndVec2Mismatch) {
Ben Clayton971318f2023-02-14 13:52:43 +00002377 WrapInFunction(Call(Source{{1, 1}}, "vec4", //
Ben Clayton01ac21c2023-02-07 16:14:25 +00002378 Call(Source{{1, 2}}, ty.vec2<i32>(), 3_i, 4_i), //
2379 Call(Source{{1, 3}}, ty.vec2<u32>(), 3_u, 4_u)));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002380
dan sinclair41e4d9a2022-05-01 14:40:55 +00002381 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00002382 EXPECT_THAT(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00002383 HasSubstr("1:1 error: no matching constructor for vec4(vec2<i32>, vec2<u32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002384}
2385
Ben Clayton54a104e2023-02-22 20:04:40 +00002386} // namespace VectorConstructor
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002387
Ben Clayton54a104e2023-02-22 20:04:40 +00002388namespace MatrixConstructor {
Zhaoming Jiang60588822022-06-28 14:03:36 +00002389
2390struct MatrixParams {
2391 using name_func_ptr = std::string (*)();
2392
dan sinclair41e4d9a2022-05-01 14:40:55 +00002393 uint32_t rows;
2394 uint32_t columns;
Zhaoming Jiang60588822022-06-28 14:03:36 +00002395 name_func_ptr get_element_type_name;
2396 builder::ast_type_func_ptr create_element_ast_type;
Antonio Maioranob6d524382022-08-31 22:59:08 +00002397 builder::ast_expr_from_double_func_ptr create_element_ast_value;
Zhaoming Jiang60588822022-06-28 14:03:36 +00002398 builder::ast_type_func_ptr create_column_ast_type;
2399 builder::ast_type_func_ptr create_mat_ast_type;
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002400};
2401
Zhaoming Jiang60588822022-06-28 14:03:36 +00002402template <typename T, uint32_t R, uint32_t C>
2403constexpr MatrixParams MatrixParamsFor() {
2404 return MatrixParams{
2405 R,
2406 C,
2407 DataType<T>::Name,
2408 DataType<T>::AST,
Antonio Maioranob6d524382022-08-31 22:59:08 +00002409 DataType<T>::ExprFromDouble,
Ben Clayton66805b02023-06-14 22:00:01 +00002410 DataType<vec<R, T>>::AST,
2411 DataType<mat<C, R, T>>::AST,
Zhaoming Jiang60588822022-06-28 14:03:36 +00002412 };
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002413}
2414
Zhaoming Jiang60588822022-06-28 14:03:36 +00002415static std::string MatrixStr(const MatrixParams& param) {
2416 return "mat" + std::to_string(param.columns) + "x" + std::to_string(param.rows) + "<" +
2417 param.get_element_type_name() + ">";
2418}
2419
Ben Clayton54a104e2023-02-22 20:04:40 +00002420using MatrixConstructorTest = ResolverTestWithParam<MatrixParams>;
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002421
Ben Clayton54a104e2023-02-22 20:04:40 +00002422TEST_P(MatrixConstructorTest, ColumnConstructor_Error_TooFewArguments) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002423 // matNxM<f32>(vecM<f32>(), ...); with N - 1 arguments
Zhaoming Jiang60588822022-06-28 14:03:36 +00002424 // matNxM<f16>(vecM<f16>(), ...); with N - 1 arguments
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002425
dan sinclair41e4d9a2022-05-01 14:40:55 +00002426 const auto param = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002427
Ben Claytoncd52f382023-08-07 13:11:08 +00002428 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002429
2430 const std::string element_type_name = param.get_element_type_name();
dan sinclairbae54e72023-07-28 15:01:54 +00002431 StringStream args_tys;
2432 Vector<const ast::Expression*, 8> args;
Ben Clayton6ae608c2022-05-16 20:54:42 +00002433 for (uint32_t i = 0; i < param.columns - 1; i++) {
Ben Clayton971318f2023-02-14 13:52:43 +00002434 ast::Type vec_type = param.create_column_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002435 args.Push(Call(vec_type));
Ben Clayton6ae608c2022-05-16 20:54:42 +00002436 if (i > 0) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002437 args_tys << ", ";
2438 }
Zhaoming Jiang60588822022-06-28 14:03:36 +00002439 args_tys << "vec" << param.rows << "<" + element_type_name + ">";
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002440 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002441
Ben Clayton971318f2023-02-14 13:52:43 +00002442 ast::Type matrix_type = param.create_mat_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002443 auto* tc = Call(Source{{12, 34}}, matrix_type, std::move(args));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002444 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002445
dan sinclair41e4d9a2022-05-01 14:40:55 +00002446 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00002447 EXPECT_THAT(r()->error(), HasSubstr("12:34 error: no matching constructor for " +
Ben Clayton3b5edf12022-05-16 21:14:11 +00002448 MatrixStr(param) + "(" + args_tys.str() + ")"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002449}
2450
Ben Clayton54a104e2023-02-22 20:04:40 +00002451TEST_P(MatrixConstructorTest, ElementConstructor_Error_TooFewArguments) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002452 // matNxM<f32>(f32,...,f32); with N*M - 1 arguments
Zhaoming Jiang60588822022-06-28 14:03:36 +00002453 // matNxM<f16>(f16,...,f16); with N*M - 1 arguments
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002454
dan sinclair41e4d9a2022-05-01 14:40:55 +00002455 const auto param = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002456
Ben Claytoncd52f382023-08-07 13:11:08 +00002457 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002458
2459 const std::string element_type_name = param.get_element_type_name();
dan sinclairbae54e72023-07-28 15:01:54 +00002460 StringStream args_tys;
2461 Vector<const ast::Expression*, 8> args;
Ben Clayton6ae608c2022-05-16 20:54:42 +00002462 for (uint32_t i = 0; i < param.columns * param.rows - 1; i++) {
Ben Clayton01ac21c2023-02-07 16:14:25 +00002463 args.Push(Call(param.create_element_ast_type(*this)));
Ben Clayton6ae608c2022-05-16 20:54:42 +00002464 if (i > 0) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002465 args_tys << ", ";
2466 }
Zhaoming Jiang60588822022-06-28 14:03:36 +00002467 args_tys << element_type_name;
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002468 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002469
Ben Clayton971318f2023-02-14 13:52:43 +00002470 ast::Type matrix_type = param.create_mat_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002471 auto* tc = Call(Source{{12, 34}}, matrix_type, std::move(args));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002472 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002473
dan sinclair41e4d9a2022-05-01 14:40:55 +00002474 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00002475 EXPECT_THAT(r()->error(), HasSubstr("12:34 error: no matching constructor for " +
Ben Clayton3b5edf12022-05-16 21:14:11 +00002476 MatrixStr(param) + "(" + args_tys.str() + ")"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002477}
2478
Ben Clayton54a104e2023-02-22 20:04:40 +00002479TEST_P(MatrixConstructorTest, ColumnConstructor_Error_TooManyArguments) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002480 // matNxM<f32>(vecM<f32>(), ...); with N + 1 arguments
Zhaoming Jiang60588822022-06-28 14:03:36 +00002481 // matNxM<f16>(vecM<f16>(), ...); with N + 1 arguments
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002482
dan sinclair41e4d9a2022-05-01 14:40:55 +00002483 const auto param = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002484
Ben Claytoncd52f382023-08-07 13:11:08 +00002485 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002486
2487 const std::string element_type_name = param.get_element_type_name();
dan sinclairbae54e72023-07-28 15:01:54 +00002488 StringStream args_tys;
2489 Vector<const ast::Expression*, 8> args;
Ben Clayton6ae608c2022-05-16 20:54:42 +00002490 for (uint32_t i = 0; i < param.columns + 1; i++) {
Ben Clayton971318f2023-02-14 13:52:43 +00002491 ast::Type vec_type = param.create_column_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002492 args.Push(Call(vec_type));
Ben Clayton6ae608c2022-05-16 20:54:42 +00002493 if (i > 0) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002494 args_tys << ", ";
2495 }
Zhaoming Jiang60588822022-06-28 14:03:36 +00002496 args_tys << "vec" << param.rows << "<" + element_type_name + ">";
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002497 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002498
Ben Clayton971318f2023-02-14 13:52:43 +00002499 ast::Type matrix_type = param.create_mat_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002500 auto* tc = Call(Source{{12, 34}}, matrix_type, std::move(args));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002501 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002502
dan sinclair41e4d9a2022-05-01 14:40:55 +00002503 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00002504 EXPECT_THAT(r()->error(), HasSubstr("12:34 error: no matching constructor for " +
Ben Clayton3b5edf12022-05-16 21:14:11 +00002505 MatrixStr(param) + "(" + args_tys.str() + ")"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002506}
2507
Ben Clayton54a104e2023-02-22 20:04:40 +00002508TEST_P(MatrixConstructorTest, ElementConstructor_Error_TooManyArguments) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002509 // matNxM<f32>(f32,...,f32); with N*M + 1 arguments
Zhaoming Jiang60588822022-06-28 14:03:36 +00002510 // matNxM<f16>(f16,...,f16); with N*M + 1 arguments
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002511
dan sinclair41e4d9a2022-05-01 14:40:55 +00002512 const auto param = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002513
Ben Claytoncd52f382023-08-07 13:11:08 +00002514 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002515
2516 const std::string element_type_name = param.get_element_type_name();
dan sinclairbae54e72023-07-28 15:01:54 +00002517 StringStream args_tys;
2518 Vector<const ast::Expression*, 8> args;
Ben Clayton6ae608c2022-05-16 20:54:42 +00002519 for (uint32_t i = 0; i < param.columns * param.rows + 1; i++) {
Ben Clayton01ac21c2023-02-07 16:14:25 +00002520 args.Push(Call(param.create_element_ast_type(*this)));
Ben Clayton6ae608c2022-05-16 20:54:42 +00002521 if (i > 0) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002522 args_tys << ", ";
2523 }
Zhaoming Jiang60588822022-06-28 14:03:36 +00002524 args_tys << element_type_name;
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002525 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002526
Ben Clayton971318f2023-02-14 13:52:43 +00002527 ast::Type matrix_type = param.create_mat_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002528 auto* tc = Call(Source{{12, 34}}, matrix_type, std::move(args));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002529 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002530
dan sinclair41e4d9a2022-05-01 14:40:55 +00002531 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00002532 EXPECT_THAT(r()->error(), HasSubstr("12:34 error: no matching constructor for " +
Ben Clayton3b5edf12022-05-16 21:14:11 +00002533 MatrixStr(param) + "(" + args_tys.str() + ")"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002534}
2535
Ben Clayton54a104e2023-02-22 20:04:40 +00002536TEST_P(MatrixConstructorTest, ColumnConstructor_Error_InvalidArgumentType) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002537 // matNxM<f32>(vec<u32>, vec<u32>, ...); N arguments
Zhaoming Jiang60588822022-06-28 14:03:36 +00002538 // matNxM<f16>(vec<u32>, vec<u32>, ...); N arguments
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002539
dan sinclair41e4d9a2022-05-01 14:40:55 +00002540 const auto param = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002541
Ben Claytoncd52f382023-08-07 13:11:08 +00002542 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002543
dan sinclairbae54e72023-07-28 15:01:54 +00002544 StringStream args_tys;
2545 Vector<const ast::Expression*, 8> args;
Ben Clayton6ae608c2022-05-16 20:54:42 +00002546 for (uint32_t i = 0; i < param.columns; i++) {
Ben Clayton971318f2023-02-14 13:52:43 +00002547 auto vec_type = ty.vec<u32>(param.rows);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002548 args.Push(Call(vec_type));
Ben Clayton6ae608c2022-05-16 20:54:42 +00002549 if (i > 0) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002550 args_tys << ", ";
2551 }
2552 args_tys << "vec" << param.rows << "<u32>";
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002553 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002554
Ben Clayton971318f2023-02-14 13:52:43 +00002555 ast::Type matrix_type = param.create_mat_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002556 auto* tc = Call(Source{{12, 34}}, matrix_type, std::move(args));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002557 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002558
dan sinclair41e4d9a2022-05-01 14:40:55 +00002559 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00002560 EXPECT_THAT(r()->error(), HasSubstr("12:34 error: no matching constructor for " +
Ben Clayton3b5edf12022-05-16 21:14:11 +00002561 MatrixStr(param) + "(" + args_tys.str() + ")"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002562}
2563
Ben Clayton54a104e2023-02-22 20:04:40 +00002564TEST_P(MatrixConstructorTest, ElementConstructor_Error_InvalidArgumentType) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002565 // matNxM<f32>(u32, u32, ...); N*M arguments
Zhaoming Jiang60588822022-06-28 14:03:36 +00002566 // matNxM<f16>(u32, u32, ...); N*M arguments
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002567
dan sinclair41e4d9a2022-05-01 14:40:55 +00002568 const auto param = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002569
Ben Claytoncd52f382023-08-07 13:11:08 +00002570 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002571
dan sinclairbae54e72023-07-28 15:01:54 +00002572 StringStream args_tys;
2573 Vector<const ast::Expression*, 8> args;
Ben Clayton6ae608c2022-05-16 20:54:42 +00002574 for (uint32_t i = 0; i < param.columns; i++) {
Ben Clayton783b1692022-08-02 17:03:35 +00002575 args.Push(Expr(1_u));
Ben Clayton6ae608c2022-05-16 20:54:42 +00002576 if (i > 0) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002577 args_tys << ", ";
2578 }
2579 args_tys << "u32";
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002580 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002581
Ben Clayton971318f2023-02-14 13:52:43 +00002582 ast::Type matrix_type = param.create_mat_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002583 auto* tc = Call(Source{{12, 34}}, matrix_type, std::move(args));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002584 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002585
dan sinclair41e4d9a2022-05-01 14:40:55 +00002586 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00002587 EXPECT_THAT(r()->error(), HasSubstr("12:34 error: no matching constructor for " +
Ben Clayton3b5edf12022-05-16 21:14:11 +00002588 MatrixStr(param) + "(" + args_tys.str() + ")"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002589}
2590
Ben Clayton54a104e2023-02-22 20:04:40 +00002591TEST_P(MatrixConstructorTest, ColumnConstructor_Error_TooFewRowsInVectorArgument) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002592 // matNxM<f32>(vecM<f32>(),...,vecM-1<f32>());
Zhaoming Jiang60588822022-06-28 14:03:36 +00002593 // matNxM<f16>(vecM<f16>(),...,vecM-1<f32>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002594
dan sinclair41e4d9a2022-05-01 14:40:55 +00002595 const auto param = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002596
dan sinclair41e4d9a2022-05-01 14:40:55 +00002597 // Skip the test if parameters would have resulted in an invalid vec1 type.
2598 if (param.rows == 2) {
2599 return;
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002600 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002601
Ben Claytoncd52f382023-08-07 13:11:08 +00002602 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002603
2604 const std::string element_type_name = param.get_element_type_name();
dan sinclairbae54e72023-07-28 15:01:54 +00002605 StringStream args_tys;
2606 Vector<const ast::Expression*, 8> args;
Ben Clayton6ae608c2022-05-16 20:54:42 +00002607 for (uint32_t i = 0; i < param.columns; i++) {
Ben Clayton971318f2023-02-14 13:52:43 +00002608 ast::Type valid_vec_type = param.create_column_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002609 args.Push(Call(valid_vec_type));
Ben Clayton6ae608c2022-05-16 20:54:42 +00002610 if (i > 0) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002611 args_tys << ", ";
2612 }
Zhaoming Jiang60588822022-06-28 14:03:36 +00002613 args_tys << "vec" << param.rows << "<" + element_type_name + ">";
dan sinclair41e4d9a2022-05-01 14:40:55 +00002614 }
2615 const size_t kInvalidLoc = 2 * (param.columns - 1);
Ben Clayton971318f2023-02-14 13:52:43 +00002616 auto invalid_vec_type = ty.vec(param.create_element_ast_type(*this), param.rows - 1);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002617 args.Push(Call(Source{{12, kInvalidLoc}}, invalid_vec_type));
Zhaoming Jiang60588822022-06-28 14:03:36 +00002618 args_tys << ", vec" << (param.rows - 1) << "<" + element_type_name + ">";
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002619
Ben Clayton971318f2023-02-14 13:52:43 +00002620 ast::Type matrix_type = param.create_mat_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002621 auto* tc = Call(Source{{12, 34}}, matrix_type, std::move(args));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002622 WrapInFunction(tc);
2623
2624 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00002625 EXPECT_THAT(r()->error(), HasSubstr("12:34 error: no matching constructor for " +
Ben Clayton3b5edf12022-05-16 21:14:11 +00002626 MatrixStr(param) + "(" + args_tys.str() + ")"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002627}
2628
Ben Clayton54a104e2023-02-22 20:04:40 +00002629TEST_P(MatrixConstructorTest, ColumnConstructor_Error_TooManyRowsInVectorArgument) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002630 // matNxM<f32>(vecM<f32>(),...,vecM+1<f32>());
Zhaoming Jiang60588822022-06-28 14:03:36 +00002631 // matNxM<f16>(vecM<f16>(),...,vecM+1<f16>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002632
dan sinclair41e4d9a2022-05-01 14:40:55 +00002633 const auto param = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002634
dan sinclair41e4d9a2022-05-01 14:40:55 +00002635 // Skip the test if parameters would have resulted in an invalid vec5 type.
2636 if (param.rows == 4) {
2637 return;
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002638 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002639
Ben Claytoncd52f382023-08-07 13:11:08 +00002640 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002641
2642 const std::string element_type_name = param.get_element_type_name();
dan sinclairbae54e72023-07-28 15:01:54 +00002643 StringStream args_tys;
2644 Vector<const ast::Expression*, 8> args;
Ben Clayton6ae608c2022-05-16 20:54:42 +00002645 for (uint32_t i = 0; i < param.columns; i++) {
Ben Clayton971318f2023-02-14 13:52:43 +00002646 ast::Type valid_vec_type = param.create_column_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002647 args.Push(Call(valid_vec_type));
Ben Clayton6ae608c2022-05-16 20:54:42 +00002648 if (i > 0) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002649 args_tys << ", ";
2650 }
Zhaoming Jiang60588822022-06-28 14:03:36 +00002651 args_tys << "vec" << param.rows << "<" + element_type_name + ">";
dan sinclair41e4d9a2022-05-01 14:40:55 +00002652 }
Ben Clayton971318f2023-02-14 13:52:43 +00002653 auto invalid_vec_type = ty.vec(param.create_element_ast_type(*this), param.rows + 1);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002654 args.Push(Call(invalid_vec_type));
Zhaoming Jiang60588822022-06-28 14:03:36 +00002655 args_tys << ", vec" << (param.rows + 1) << "<" + element_type_name + ">";
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002656
Ben Clayton971318f2023-02-14 13:52:43 +00002657 ast::Type matrix_type = param.create_mat_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002658 auto* tc = Call(Source{{12, 34}}, matrix_type, std::move(args));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002659 WrapInFunction(tc);
2660
2661 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00002662 EXPECT_THAT(r()->error(), HasSubstr("12:34 error: no matching constructor for " +
Ben Clayton3b5edf12022-05-16 21:14:11 +00002663 MatrixStr(param) + "(" + args_tys.str() + ")"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002664}
2665
Ben Clayton54a104e2023-02-22 20:04:40 +00002666TEST_P(MatrixConstructorTest, ZeroValue_Success) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002667 // matNxM<f32>();
Zhaoming Jiang60588822022-06-28 14:03:36 +00002668 // matNxM<f16>();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002669
dan sinclair41e4d9a2022-05-01 14:40:55 +00002670 const auto param = GetParam();
Zhaoming Jiang60588822022-06-28 14:03:36 +00002671
Ben Claytoncd52f382023-08-07 13:11:08 +00002672 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002673
Ben Clayton971318f2023-02-14 13:52:43 +00002674 ast::Type matrix_type = param.create_mat_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002675 auto* tc = Call(Source{{12, 40}}, matrix_type);
dan sinclair41e4d9a2022-05-01 14:40:55 +00002676 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002677
dan sinclair41e4d9a2022-05-01 14:40:55 +00002678 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002679}
2680
Ben Clayton54a104e2023-02-22 20:04:40 +00002681TEST_P(MatrixConstructorTest, WithColumns_Success) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002682 // matNxM<f32>(vecM<f32>(), ...); with N arguments
Zhaoming Jiang60588822022-06-28 14:03:36 +00002683 // matNxM<f16>(vecM<f16>(), ...); with N arguments
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002684
dan sinclair41e4d9a2022-05-01 14:40:55 +00002685 const auto param = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002686
Ben Claytoncd52f382023-08-07 13:11:08 +00002687 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002688
dan sinclairbae54e72023-07-28 15:01:54 +00002689 Vector<const ast::Expression*, 4> args;
Ben Clayton6ae608c2022-05-16 20:54:42 +00002690 for (uint32_t i = 0; i < param.columns; i++) {
Ben Clayton971318f2023-02-14 13:52:43 +00002691 ast::Type vec_type = param.create_column_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002692 args.Push(Call(vec_type));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002693 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002694
Ben Clayton971318f2023-02-14 13:52:43 +00002695 ast::Type matrix_type = param.create_mat_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002696 auto* tc = Call(matrix_type, std::move(args));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002697 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002698
dan sinclair41e4d9a2022-05-01 14:40:55 +00002699 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002700}
2701
Ben Clayton54a104e2023-02-22 20:04:40 +00002702TEST_P(MatrixConstructorTest, WithElements_Success) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002703 // matNxM<f32>(f32,...,f32); with N*M arguments
Zhaoming Jiang60588822022-06-28 14:03:36 +00002704 // matNxM<f16>(f16,...,f16); with N*M arguments
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002705
dan sinclair41e4d9a2022-05-01 14:40:55 +00002706 const auto param = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002707
Ben Claytoncd52f382023-08-07 13:11:08 +00002708 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002709
dan sinclairbae54e72023-07-28 15:01:54 +00002710 Vector<const ast::Expression*, 16> args;
Ben Clayton6ae608c2022-05-16 20:54:42 +00002711 for (uint32_t i = 0; i < param.columns * param.rows; i++) {
Ben Clayton01ac21c2023-02-07 16:14:25 +00002712 args.Push(Call(param.create_element_ast_type(*this)));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002713 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002714
Ben Clayton971318f2023-02-14 13:52:43 +00002715 ast::Type matrix_type = param.create_mat_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002716 auto* tc = Call(matrix_type, std::move(args));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002717 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002718
dan sinclair41e4d9a2022-05-01 14:40:55 +00002719 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002720}
2721
Ben Clayton54a104e2023-02-22 20:04:40 +00002722TEST_P(MatrixConstructorTest, ElementTypeAlias_Error) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002723 // matNxM<Float32>(vecM<u32>(), ...); with N arguments
Zhaoming Jiang60588822022-06-28 14:03:36 +00002724 // matNxM<Float16>(vecM<u32>(), ...); with N arguments
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002725
dan sinclair41e4d9a2022-05-01 14:40:55 +00002726 const auto param = GetParam();
Zhaoming Jiang60588822022-06-28 14:03:36 +00002727
Ben Claytoncd52f382023-08-07 13:11:08 +00002728 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002729
2730 auto* elem_type_alias = Alias("ElemType", param.create_element_ast_type(*this));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002731
dan sinclairbae54e72023-07-28 15:01:54 +00002732 StringStream args_tys;
2733 Vector<const ast::Expression*, 4> args;
Ben Clayton6ae608c2022-05-16 20:54:42 +00002734 for (uint32_t i = 0; i < param.columns; i++) {
Ben Clayton971318f2023-02-14 13:52:43 +00002735 auto vec_type = ty.vec(ty.u32(), param.rows);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002736 args.Push(Call(vec_type));
Ben Clayton6ae608c2022-05-16 20:54:42 +00002737 if (i > 0) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002738 args_tys << ", ";
2739 }
2740 args_tys << "vec" << param.rows << "<u32>";
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002741 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002742
Ben Clayton971318f2023-02-14 13:52:43 +00002743 auto matrix_type = ty.mat(ty.Of(elem_type_alias), param.columns, param.rows);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002744 auto* tc = Call(Source{{12, 34}}, matrix_type, std::move(args));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002745 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002746
dan sinclair41e4d9a2022-05-01 14:40:55 +00002747 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00002748 EXPECT_THAT(r()->error(), HasSubstr("12:34 error: no matching constructor for " +
Ben Clayton3b5edf12022-05-16 21:14:11 +00002749 MatrixStr(param) + "(" + args_tys.str() + ")"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002750}
2751
Ben Clayton54a104e2023-02-22 20:04:40 +00002752TEST_P(MatrixConstructorTest, ElementTypeAlias_Success) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002753 // matNxM<Float32>(vecM<f32>(), ...); with N arguments
Zhaoming Jiang60588822022-06-28 14:03:36 +00002754 // matNxM<Float16>(vecM<f16>(), ...); with N arguments
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002755
dan sinclair41e4d9a2022-05-01 14:40:55 +00002756 const auto param = GetParam();
Zhaoming Jiang60588822022-06-28 14:03:36 +00002757
Ben Claytoncd52f382023-08-07 13:11:08 +00002758 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002759
2760 auto* elem_type_alias = Alias("ElemType", param.create_element_ast_type(*this));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002761
dan sinclairbae54e72023-07-28 15:01:54 +00002762 Vector<const ast::Expression*, 8> args;
Ben Clayton6ae608c2022-05-16 20:54:42 +00002763 for (uint32_t i = 0; i < param.columns; i++) {
Ben Clayton971318f2023-02-14 13:52:43 +00002764 ast::Type vec_type = param.create_column_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002765 args.Push(Call(vec_type));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002766 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002767
Ben Clayton971318f2023-02-14 13:52:43 +00002768 auto matrix_type = ty.mat(ty.Of(elem_type_alias), param.columns, param.rows);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002769 auto* tc = Call(Source{}, matrix_type, std::move(args));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002770 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002771
dan sinclair41e4d9a2022-05-01 14:40:55 +00002772 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002773}
2774
Ben Clayton54a104e2023-02-22 20:04:40 +00002775TEST_F(ResolverValueConstructorValidationTest, MatrixConstructor_ArgumentTypeAlias_Error) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002776 auto* alias = Alias("VectorUnsigned2", ty.vec2<u32>());
Ben Clayton66805b02023-06-14 22:00:01 +00002777 auto* tc = Call(Source{{12, 34}}, ty.mat2x2<f32>(), Call(ty.Of(alias)), Call<vec2<f32>>());
dan sinclair41e4d9a2022-05-01 14:40:55 +00002778 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002779
dan sinclair41e4d9a2022-05-01 14:40:55 +00002780 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00002781 EXPECT_THAT(
2782 r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00002783 HasSubstr("12:34 error: no matching constructor for mat2x2<f32>(vec2<u32>, vec2<f32>)"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002784}
2785
Ben Clayton54a104e2023-02-22 20:04:40 +00002786TEST_P(MatrixConstructorTest, ArgumentTypeAlias_Success) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002787 const auto param = GetParam();
Zhaoming Jiang60588822022-06-28 14:03:36 +00002788
Ben Claytoncd52f382023-08-07 13:11:08 +00002789 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002790
Ben Clayton971318f2023-02-14 13:52:43 +00002791 ast::Type matrix_type = param.create_mat_ast_type(*this);
2792 ast::Type vec_type = param.create_column_ast_type(*this);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002793 auto* vec_alias = Alias("ColVectorAlias", vec_type);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002794
dan sinclairbae54e72023-07-28 15:01:54 +00002795 Vector<const ast::Expression*, 4> args;
Ben Clayton6ae608c2022-05-16 20:54:42 +00002796 for (uint32_t i = 0; i < param.columns; i++) {
Ben Clayton01ac21c2023-02-07 16:14:25 +00002797 args.Push(Call(ty.Of(vec_alias)));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002798 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002799
Ben Clayton01ac21c2023-02-07 16:14:25 +00002800 auto* tc = Call(Source{}, matrix_type, std::move(args));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002801 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002802
dan sinclair41e4d9a2022-05-01 14:40:55 +00002803 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002804}
2805
Ben Clayton54a104e2023-02-22 20:04:40 +00002806TEST_P(MatrixConstructorTest, ArgumentElementTypeAlias_Error) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002807 const auto param = GetParam();
Zhaoming Jiang60588822022-06-28 14:03:36 +00002808
Ben Claytoncd52f382023-08-07 13:11:08 +00002809 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002810
Ben Clayton971318f2023-02-14 13:52:43 +00002811 ast::Type matrix_type = param.create_mat_ast_type(*this);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002812 auto* u32_type_alias = Alias("UnsignedInt", ty.u32());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002813
dan sinclairbae54e72023-07-28 15:01:54 +00002814 StringStream args_tys;
2815 Vector<const ast::Expression*, 4> args;
Ben Clayton6ae608c2022-05-16 20:54:42 +00002816 for (uint32_t i = 0; i < param.columns; i++) {
Ben Clayton971318f2023-02-14 13:52:43 +00002817 auto vec_type = ty.vec(ty.Of(u32_type_alias), param.rows);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002818 args.Push(Call(vec_type));
Ben Clayton6ae608c2022-05-16 20:54:42 +00002819 if (i > 0) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002820 args_tys << ", ";
2821 }
2822 args_tys << "vec" << param.rows << "<u32>";
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002823 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002824
Ben Clayton01ac21c2023-02-07 16:14:25 +00002825 auto* tc = Call(Source{{12, 34}}, matrix_type, std::move(args));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002826 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002827
dan sinclair41e4d9a2022-05-01 14:40:55 +00002828 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00002829 EXPECT_THAT(r()->error(), HasSubstr("12:34 error: no matching constructor for " +
Ben Clayton3b5edf12022-05-16 21:14:11 +00002830 MatrixStr(param) + "(" + args_tys.str() + ")"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002831}
2832
Ben Clayton54a104e2023-02-22 20:04:40 +00002833TEST_P(MatrixConstructorTest, ArgumentElementTypeAlias_Success) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002834 const auto param = GetParam();
Zhaoming Jiang60588822022-06-28 14:03:36 +00002835
Ben Claytoncd52f382023-08-07 13:11:08 +00002836 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002837
2838 auto* elem_type_alias = Alias("ElemType", param.create_element_ast_type(*this));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002839
dan sinclairbae54e72023-07-28 15:01:54 +00002840 Vector<const ast::Expression*, 4> args;
Ben Clayton6ae608c2022-05-16 20:54:42 +00002841 for (uint32_t i = 0; i < param.columns; i++) {
Ben Clayton971318f2023-02-14 13:52:43 +00002842 auto vec_type = ty.vec(ty.Of(elem_type_alias), param.rows);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002843 args.Push(Call(vec_type));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002844 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002845
Ben Clayton971318f2023-02-14 13:52:43 +00002846 ast::Type matrix_type = param.create_mat_ast_type(*this);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002847 auto* tc = Call(Source{}, matrix_type, std::move(args));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002848 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002849
dan sinclair41e4d9a2022-05-01 14:40:55 +00002850 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002851}
2852
Ben Clayton54a104e2023-02-22 20:04:40 +00002853TEST_P(MatrixConstructorTest, InferElementTypeFromVectors) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002854 const auto param = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002855
Ben Claytoncd52f382023-08-07 13:11:08 +00002856 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002857
dan sinclairbae54e72023-07-28 15:01:54 +00002858 Vector<const ast::Expression*, 8> args;
Ben Clayton6ae608c2022-05-16 20:54:42 +00002859 for (uint32_t i = 0; i < param.columns; i++) {
Ben Clayton01ac21c2023-02-07 16:14:25 +00002860 args.Push(Call(param.create_column_ast_type(*this)));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002861 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002862
Ben Clayton971318f2023-02-14 13:52:43 +00002863 auto matrix_type = ty.mat<Infer>(param.columns, param.rows);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002864 auto* tc = Call(Source{}, matrix_type, std::move(args));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002865 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002866
dan sinclair41e4d9a2022-05-01 14:40:55 +00002867 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002868}
2869
Ben Clayton54a104e2023-02-22 20:04:40 +00002870TEST_P(MatrixConstructorTest, InferElementTypeFromScalars) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002871 const auto param = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002872
Ben Claytoncd52f382023-08-07 13:11:08 +00002873 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002874
dan sinclairbae54e72023-07-28 15:01:54 +00002875 Vector<const ast::Expression*, 8> args;
dan sinclair41e4d9a2022-05-01 14:40:55 +00002876 for (uint32_t i = 0; i < param.rows * param.columns; i++) {
Ben Clayton783b1692022-08-02 17:03:35 +00002877 args.Push(param.create_element_ast_value(*this, static_cast<double>(i)));
dan sinclair41e4d9a2022-05-01 14:40:55 +00002878 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002879
Ben Clayton971318f2023-02-14 13:52:43 +00002880 auto matrix_type = ty.mat<Infer>(param.columns, param.rows);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002881 WrapInFunction(Call(Source{{12, 34}}, matrix_type, std::move(args)));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002882
dan sinclair41e4d9a2022-05-01 14:40:55 +00002883 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002884}
2885
Ben Clayton54a104e2023-02-22 20:04:40 +00002886TEST_P(MatrixConstructorTest, CannotInferElementTypeFromVectors_Mismatch) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002887 const auto param = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002888
Ben Claytoncd52f382023-08-07 13:11:08 +00002889 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002890
dan sinclairbae54e72023-07-28 15:01:54 +00002891 StringStream err;
Ben Clayton54a104e2023-02-22 20:04:40 +00002892 err << "12:34 error: no matching constructor for mat" << param.columns << "x" << param.rows
Ben Clayton6ae608c2022-05-16 20:54:42 +00002893 << "(";
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002894
dan sinclairbae54e72023-07-28 15:01:54 +00002895 Vector<const ast::Expression*, 8> args;
dan sinclair41e4d9a2022-05-01 14:40:55 +00002896 for (uint32_t i = 0; i < param.columns; i++) {
Ben Clayton6ae608c2022-05-16 20:54:42 +00002897 if (i > 0) {
2898 err << ", ";
2899 }
dan sinclair41e4d9a2022-05-01 14:40:55 +00002900 if (i == 1) {
2901 // Odd one out
Ben Clayton01ac21c2023-02-07 16:14:25 +00002902 args.Push(Call(ty.vec<i32>(param.rows)));
Ben Clayton6ae608c2022-05-16 20:54:42 +00002903 err << "vec" << param.rows << "<i32>";
dan sinclair41e4d9a2022-05-01 14:40:55 +00002904 } else {
Ben Clayton01ac21c2023-02-07 16:14:25 +00002905 args.Push(Call(param.create_column_ast_type(*this)));
Zhaoming Jiang60588822022-06-28 14:03:36 +00002906 err << "vec" << param.rows << "<" + param.get_element_type_name() + ">";
dan sinclair41e4d9a2022-05-01 14:40:55 +00002907 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002908 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002909
Ben Clayton971318f2023-02-14 13:52:43 +00002910 auto matrix_type = ty.mat<Infer>(param.columns, param.rows);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002911 WrapInFunction(Call(Source{{12, 34}}, matrix_type, std::move(args)));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002912
dan sinclair41e4d9a2022-05-01 14:40:55 +00002913 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00002914 EXPECT_THAT(r()->error(), HasSubstr(err.str()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002915}
2916
Ben Clayton54a104e2023-02-22 20:04:40 +00002917TEST_P(MatrixConstructorTest, CannotInferElementTypeFromScalars_Mismatch) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002918 const auto param = GetParam();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002919
Ben Claytoncd52f382023-08-07 13:11:08 +00002920 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00002921
dan sinclairbae54e72023-07-28 15:01:54 +00002922 StringStream err;
Ben Clayton54a104e2023-02-22 20:04:40 +00002923 err << "12:34 error: no matching constructor for mat" << param.columns << "x" << param.rows
Ben Clayton6ae608c2022-05-16 20:54:42 +00002924 << "(";
2925
dan sinclairbae54e72023-07-28 15:01:54 +00002926 Vector<const ast::Expression*, 16> args;
dan sinclair41e4d9a2022-05-01 14:40:55 +00002927 for (uint32_t i = 0; i < param.rows * param.columns; i++) {
Ben Clayton6ae608c2022-05-16 20:54:42 +00002928 if (i > 0) {
2929 err << ", ";
2930 }
dan sinclair41e4d9a2022-05-01 14:40:55 +00002931 if (i == 3) {
Ben Clayton783b1692022-08-02 17:03:35 +00002932 args.Push(Expr(static_cast<i32>(i))); // The odd one out
Ben Clayton6ae608c2022-05-16 20:54:42 +00002933 err << "i32";
dan sinclair41e4d9a2022-05-01 14:40:55 +00002934 } else {
Ben Clayton783b1692022-08-02 17:03:35 +00002935 args.Push(param.create_element_ast_value(*this, static_cast<double>(i)));
Zhaoming Jiang60588822022-06-28 14:03:36 +00002936 err << param.get_element_type_name();
dan sinclair41e4d9a2022-05-01 14:40:55 +00002937 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002938 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002939
Ben Clayton6ae608c2022-05-16 20:54:42 +00002940 err << ")";
2941
Ben Clayton971318f2023-02-14 13:52:43 +00002942 auto matrix_type = ty.mat<Infer>(param.columns, param.rows);
Ben Clayton01ac21c2023-02-07 16:14:25 +00002943 WrapInFunction(Call(Source{{12, 34}}, matrix_type, std::move(args)));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002944
dan sinclair41e4d9a2022-05-01 14:40:55 +00002945 EXPECT_FALSE(r()->Resolve());
Ben Clayton6ae608c2022-05-16 20:54:42 +00002946 EXPECT_THAT(r()->error(), HasSubstr(err.str()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002947}
2948
Ben Clayton54a104e2023-02-22 20:04:40 +00002949INSTANTIATE_TEST_SUITE_P(ResolverValueConstructorValidationTest,
2950 MatrixConstructorTest,
Zhaoming Jiang60588822022-06-28 14:03:36 +00002951 testing::Values(MatrixParamsFor<f32, 2, 2>(),
2952 MatrixParamsFor<f32, 3, 2>(),
2953 MatrixParamsFor<f32, 4, 2>(),
2954 MatrixParamsFor<f32, 2, 3>(),
2955 MatrixParamsFor<f32, 3, 3>(),
2956 MatrixParamsFor<f32, 4, 3>(),
2957 MatrixParamsFor<f32, 2, 4>(),
2958 MatrixParamsFor<f32, 3, 4>(),
2959 MatrixParamsFor<f32, 4, 4>(),
2960 MatrixParamsFor<f16, 2, 2>(),
2961 MatrixParamsFor<f16, 3, 2>(),
2962 MatrixParamsFor<f16, 4, 2>(),
2963 MatrixParamsFor<f16, 2, 3>(),
2964 MatrixParamsFor<f16, 3, 3>(),
2965 MatrixParamsFor<f16, 4, 3>(),
2966 MatrixParamsFor<f16, 2, 4>(),
2967 MatrixParamsFor<f16, 3, 4>(),
2968 MatrixParamsFor<f16, 4, 4>()));
Ben Clayton54a104e2023-02-22 20:04:40 +00002969} // namespace MatrixConstructor
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002970
Ben Clayton54a104e2023-02-22 20:04:40 +00002971namespace StructConstructor {
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002972using builder::CreatePtrs;
2973using builder::CreatePtrsFor;
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002974
2975constexpr CreatePtrs all_types[] = {
2976 CreatePtrsFor<bool>(), //
2977 CreatePtrsFor<u32>(), //
2978 CreatePtrsFor<i32>(), //
2979 CreatePtrsFor<f32>(), //
Zhaoming Jiang60588822022-06-28 14:03:36 +00002980 CreatePtrsFor<f16>(), //
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002981 CreatePtrsFor<vec4<bool>>(), //
2982 CreatePtrsFor<vec2<i32>>(), //
2983 CreatePtrsFor<vec3<u32>>(), //
2984 CreatePtrsFor<vec4<f32>>(), //
Zhaoming Jiang60588822022-06-28 14:03:36 +00002985 CreatePtrsFor<vec4<f16>>(), //
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002986 CreatePtrsFor<mat2x2<f32>>(), //
2987 CreatePtrsFor<mat3x3<f32>>(), //
Zhaoming Jiang60588822022-06-28 14:03:36 +00002988 CreatePtrsFor<mat4x4<f32>>(), //
2989 CreatePtrsFor<mat2x2<f16>>(), //
2990 CreatePtrsFor<mat3x3<f16>>(), //
2991 CreatePtrsFor<mat4x4<f16>>() //
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002992};
2993
2994auto number_of_members = testing::Values(2u, 32u, 64u);
2995
Ben Clayton54a104e2023-02-22 20:04:40 +00002996using StructConstructorInputsTest =
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002997 ResolverTestWithParam<std::tuple<CreatePtrs, // struct member type
2998 uint32_t>>; // number of struct members
Ben Clayton54a104e2023-02-22 20:04:40 +00002999TEST_P(StructConstructorInputsTest, TooFew) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003000 auto& param = GetParam();
3001 auto& str_params = std::get<0>(param);
3002 uint32_t N = std::get<1>(param);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003003
Ben Claytoncd52f382023-08-07 13:11:08 +00003004 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00003005
dan sinclairbae54e72023-07-28 15:01:54 +00003006 Vector<const ast::StructMember*, 16> members;
3007 Vector<const ast::Expression*, 16> values;
dan sinclair41e4d9a2022-05-01 14:40:55 +00003008 for (uint32_t i = 0; i < N; i++) {
Ben Clayton971318f2023-02-14 13:52:43 +00003009 ast::Type struct_type = str_params.ast(*this);
Ben Clayton783b1692022-08-02 17:03:35 +00003010 members.Push(Member("member_" + std::to_string(i), struct_type));
dan sinclair41e4d9a2022-05-01 14:40:55 +00003011 if (i < N - 1) {
Antonio Maioranob6d524382022-08-31 22:59:08 +00003012 auto* ctor_value_expr = str_params.expr_from_double(*this, 0);
Ben Clayton783b1692022-08-02 17:03:35 +00003013 values.Push(ctor_value_expr);
dan sinclair41e4d9a2022-05-01 14:40:55 +00003014 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003015 }
dan sinclair41e4d9a2022-05-01 14:40:55 +00003016 auto* s = Structure("s", members);
Ben Clayton01ac21c2023-02-07 16:14:25 +00003017 auto* tc = Call(Source{{12, 34}}, ty.Of(s), values);
dan sinclair41e4d9a2022-05-01 14:40:55 +00003018 WrapInFunction(tc);
3019 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00003020 EXPECT_EQ(r()->error(), "12:34 error: structure constructor has too few inputs: expected " +
dan sinclair41e4d9a2022-05-01 14:40:55 +00003021 std::to_string(N) + ", found " + std::to_string(N - 1));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003022}
3023
Ben Clayton54a104e2023-02-22 20:04:40 +00003024TEST_P(StructConstructorInputsTest, TooMany) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003025 auto& param = GetParam();
3026 auto& str_params = std::get<0>(param);
3027 uint32_t N = std::get<1>(param);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003028
Ben Claytoncd52f382023-08-07 13:11:08 +00003029 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00003030
dan sinclairbae54e72023-07-28 15:01:54 +00003031 Vector<const ast::StructMember*, 16> members;
3032 Vector<const ast::Expression*, 8> values;
dan sinclair41e4d9a2022-05-01 14:40:55 +00003033 for (uint32_t i = 0; i < N + 1; i++) {
3034 if (i < N) {
Ben Clayton971318f2023-02-14 13:52:43 +00003035 ast::Type struct_type = str_params.ast(*this);
Ben Clayton783b1692022-08-02 17:03:35 +00003036 members.Push(Member("member_" + std::to_string(i), struct_type));
dan sinclair41e4d9a2022-05-01 14:40:55 +00003037 }
Antonio Maioranob6d524382022-08-31 22:59:08 +00003038 auto* ctor_value_expr = str_params.expr_from_double(*this, 0);
Ben Clayton783b1692022-08-02 17:03:35 +00003039 values.Push(ctor_value_expr);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003040 }
dan sinclair41e4d9a2022-05-01 14:40:55 +00003041 auto* s = Structure("s", members);
Ben Clayton01ac21c2023-02-07 16:14:25 +00003042 auto* tc = Call(Source{{12, 34}}, ty.Of(s), values);
dan sinclair41e4d9a2022-05-01 14:40:55 +00003043 WrapInFunction(tc);
3044 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00003045 EXPECT_EQ(r()->error(), "12:34 error: structure constructor has too many inputs: expected " +
dan sinclair41e4d9a2022-05-01 14:40:55 +00003046 std::to_string(N) + ", found " + std::to_string(N + 1));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003047}
3048
Ben Clayton54a104e2023-02-22 20:04:40 +00003049INSTANTIATE_TEST_SUITE_P(ResolverValueConstructorValidationTest,
3050 StructConstructorInputsTest,
dan sinclair41e4d9a2022-05-01 14:40:55 +00003051 testing::Combine(testing::ValuesIn(all_types), number_of_members));
Ben Clayton54a104e2023-02-22 20:04:40 +00003052using StructConstructorTypeTest =
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003053 ResolverTestWithParam<std::tuple<CreatePtrs, // struct member type
Ben Clayton54a104e2023-02-22 20:04:40 +00003054 CreatePtrs, // constructor value type
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003055 uint32_t>>; // number of struct members
Ben Clayton54a104e2023-02-22 20:04:40 +00003056TEST_P(StructConstructorTypeTest, AllTypes) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003057 auto& param = GetParam();
3058 auto& str_params = std::get<0>(param);
3059 auto& ctor_params = std::get<1>(param);
3060 uint32_t N = std::get<2>(param);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003061
Ben Claytoncd52f382023-08-07 13:11:08 +00003062 Enable(core::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +00003063
dan sinclair41e4d9a2022-05-01 14:40:55 +00003064 if (str_params.ast == ctor_params.ast) {
3065 return;
3066 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003067
dan sinclairbae54e72023-07-28 15:01:54 +00003068 Vector<const ast::StructMember*, 16> members;
3069 Vector<const ast::Expression*, 8> values;
Ben Clayton54a104e2023-02-22 20:04:40 +00003070 // make the last value of the constructor to have a different type
3071 uint32_t constructor_value_with_different_type = N - 1;
dan sinclair41e4d9a2022-05-01 14:40:55 +00003072 for (uint32_t i = 0; i < N; i++) {
Ben Clayton971318f2023-02-14 13:52:43 +00003073 ast::Type struct_type = str_params.ast(*this);
Ben Clayton783b1692022-08-02 17:03:35 +00003074 members.Push(Member("member_" + std::to_string(i), struct_type));
Ben Clayton54a104e2023-02-22 20:04:40 +00003075 auto* ctor_value_expr = (i == constructor_value_with_different_type)
Antonio Maioranob6d524382022-08-31 22:59:08 +00003076 ? ctor_params.expr_from_double(*this, 0)
3077 : str_params.expr_from_double(*this, 0);
Ben Clayton783b1692022-08-02 17:03:35 +00003078 values.Push(ctor_value_expr);
dan sinclair41e4d9a2022-05-01 14:40:55 +00003079 }
3080 auto* s = Structure("s", members);
Ben Clayton01ac21c2023-02-07 16:14:25 +00003081 auto* tc = Call(ty.Of(s), values);
dan sinclair41e4d9a2022-05-01 14:40:55 +00003082 WrapInFunction(tc);
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003083
dan sinclairbae54e72023-07-28 15:01:54 +00003084 StringStream err;
Ben Clayton54a104e2023-02-22 20:04:40 +00003085 err << "error: type in structure constructor does not match struct member ";
Ben Clayton971318f2023-02-14 13:52:43 +00003086 err << "type: expected '" << str_params.name() << "', found '" << ctor_params.name() << "'";
dan sinclair41e4d9a2022-05-01 14:40:55 +00003087 EXPECT_FALSE(r()->Resolve());
3088 EXPECT_EQ(r()->error(), err.str());
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003089}
3090
Ben Clayton54a104e2023-02-22 20:04:40 +00003091INSTANTIATE_TEST_SUITE_P(ResolverValueConstructorValidationTest,
3092 StructConstructorTypeTest,
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003093 testing::Combine(testing::ValuesIn(all_types),
3094 testing::ValuesIn(all_types),
3095 number_of_members));
3096
Ben Clayton54a104e2023-02-22 20:04:40 +00003097TEST_F(ResolverValueConstructorValidationTest, Struct_Nested) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003098 auto* inner_m = Member("m", ty.i32());
dan sinclairbae54e72023-07-28 15:01:54 +00003099 auto* inner_s = Structure("inner_s", Vector{inner_m});
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003100
dan sinclair41e4d9a2022-05-01 14:40:55 +00003101 auto* m0 = Member("m0", ty.i32());
3102 auto* m1 = Member("m1", ty.Of(inner_s));
3103 auto* m2 = Member("m2", ty.i32());
dan sinclairbae54e72023-07-28 15:01:54 +00003104 auto* s = Structure("s", Vector{m0, m1, m2});
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003105
Ben Clayton01ac21c2023-02-07 16:14:25 +00003106 auto* tc = Call(Source{{12, 34}}, ty.Of(s), 1_i, 1_i, 1_i);
dan sinclair41e4d9a2022-05-01 14:40:55 +00003107 WrapInFunction(tc);
3108 EXPECT_FALSE(r()->Resolve());
3109 EXPECT_EQ(r()->error(),
Ben Clayton54a104e2023-02-22 20:04:40 +00003110 "error: type in structure constructor does not match struct member "
dan sinclair41e4d9a2022-05-01 14:40:55 +00003111 "type: expected 'inner_s', found 'i32'");
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003112}
3113
Ben Clayton54a104e2023-02-22 20:04:40 +00003114TEST_F(ResolverValueConstructorValidationTest, Struct) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003115 auto* m = Member("m", ty.i32());
dan sinclairbae54e72023-07-28 15:01:54 +00003116 auto* s = Structure("MyInputs", Vector{m});
Ben Clayton01ac21c2023-02-07 16:14:25 +00003117 auto* tc = Call(Source{{12, 34}}, ty.Of(s));
dan sinclair41e4d9a2022-05-01 14:40:55 +00003118 WrapInFunction(tc);
3119 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003120}
3121
Ben Clayton54a104e2023-02-22 20:04:40 +00003122TEST_F(ResolverValueConstructorValidationTest, Struct_Empty) {
dan sinclairbae54e72023-07-28 15:01:54 +00003123 auto* str = Structure("S", Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +00003124 Member("a", ty.i32()),
3125 Member("b", ty.f32()),
3126 Member("c", ty.vec3<i32>()),
3127 });
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003128
Ben Clayton01ac21c2023-02-07 16:14:25 +00003129 WrapInFunction(Call(ty.Of(str)));
dan sinclair41e4d9a2022-05-01 14:40:55 +00003130 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003131}
Ben Clayton54a104e2023-02-22 20:04:40 +00003132} // namespace StructConstructor
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003133
Ben Clayton54a104e2023-02-22 20:04:40 +00003134TEST_F(ResolverValueConstructorValidationTest, NonConstructibleType_Atomic) {
Ben Clayton01ac21c2023-02-07 16:14:25 +00003135 WrapInFunction(Assign(Phony(), Call(Source{{12, 34}}, ty.atomic(ty.i32()))));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003136
dan sinclair41e4d9a2022-05-01 14:40:55 +00003137 EXPECT_FALSE(r()->Resolve());
3138 EXPECT_EQ(r()->error(), "12:34 error: type is not constructible");
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003139}
3140
Ben Clayton54a104e2023-02-22 20:04:40 +00003141TEST_F(ResolverValueConstructorValidationTest, NonConstructibleType_AtomicArray) {
Ben Clayton01ac21c2023-02-07 16:14:25 +00003142 WrapInFunction(Assign(Phony(), Call(Source{{12, 34}}, ty.array(ty.atomic(ty.i32()), 4_i))));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003143
dan sinclair41e4d9a2022-05-01 14:40:55 +00003144 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00003145 EXPECT_EQ(r()->error(), "12:34 error: array constructor has non-constructible element type");
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003146}
3147
Ben Clayton54a104e2023-02-22 20:04:40 +00003148TEST_F(ResolverValueConstructorValidationTest, NonConstructibleType_AtomicStructMember) {
dan sinclairbae54e72023-07-28 15:01:54 +00003149 auto* str = Structure("S", Vector{Member("a", ty.atomic(ty.i32()))});
Ben Clayton01ac21c2023-02-07 16:14:25 +00003150 WrapInFunction(Assign(Phony(), Call(Source{{12, 34}}, ty.Of(str))));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003151
dan sinclair41e4d9a2022-05-01 14:40:55 +00003152 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00003153 EXPECT_EQ(r()->error(), "12:34 error: structure constructor has non-constructible type");
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003154}
3155
Ben Clayton54a104e2023-02-22 20:04:40 +00003156TEST_F(ResolverValueConstructorValidationTest, NonConstructibleType_Sampler) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003157 WrapInFunction(
dan sinclaircedcdf32023-08-10 02:39:48 +00003158 Assign(Phony(), Call(Source{{12, 34}}, ty.sampler(core::type::SamplerKind::kSampler))));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003159
dan sinclair41e4d9a2022-05-01 14:40:55 +00003160 EXPECT_FALSE(r()->Resolve());
3161 EXPECT_EQ(r()->error(), "12:34 error: type is not constructible");
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003162}
3163
Ben Clayton54a104e2023-02-22 20:04:40 +00003164TEST_F(ResolverValueConstructorValidationTest, BuilinTypeConstructorAsStatement) {
Ben Clayton66805b02023-06-14 22:00:01 +00003165 WrapInFunction(CallStmt(Call<vec2<f32>>(Source{{12, 34}}, 1_f, 2_f)));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003166
dan sinclair41e4d9a2022-05-01 14:40:55 +00003167 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00003168 EXPECT_EQ(r()->error(), "12:34 error: value constructor evaluated but not used");
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003169}
3170
Ben Clayton54a104e2023-02-22 20:04:40 +00003171TEST_F(ResolverValueConstructorValidationTest, StructConstructorAsStatement) {
dan sinclairbae54e72023-07-28 15:01:54 +00003172 Structure("S", Vector{Member("m", ty.i32())});
Ben Claytoneb30a0d2023-02-09 23:19:42 +00003173 WrapInFunction(CallStmt(Call(Source{{12, 34}}, "S", 1_a)));
3174
3175 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00003176 EXPECT_EQ(r()->error(), "12:34 error: value constructor evaluated but not used");
Ben Claytoneb30a0d2023-02-09 23:19:42 +00003177}
3178
Ben Clayton54a104e2023-02-22 20:04:40 +00003179TEST_F(ResolverValueConstructorValidationTest, AliasConstructorAsStatement) {
Ben Claytoneb30a0d2023-02-09 23:19:42 +00003180 Alias("A", ty.i32());
3181 WrapInFunction(CallStmt(Call(Source{{12, 34}}, "A", 1_i)));
3182
3183 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00003184 EXPECT_EQ(r()->error(), "12:34 error: value constructor evaluated but not used");
Ben Claytoneb30a0d2023-02-09 23:19:42 +00003185}
3186
Ben Clayton54a104e2023-02-22 20:04:40 +00003187TEST_F(ResolverValueConstructorValidationTest, BuilinTypeConversionAsStatement) {
Ben Clayton01ac21c2023-02-07 16:14:25 +00003188 WrapInFunction(CallStmt(Call(Source{{12, 34}}, ty.f32(), 1_i)));
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003189
dan sinclair41e4d9a2022-05-01 14:40:55 +00003190 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00003191 EXPECT_EQ(r()->error(), "12:34 error: value conversion evaluated but not used");
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003192}
3193
Ben Clayton54a104e2023-02-22 20:04:40 +00003194TEST_F(ResolverValueConstructorValidationTest, AliasConversionAsStatement) {
Ben Claytoneb30a0d2023-02-09 23:19:42 +00003195 Alias("A", ty.i32());
3196 WrapInFunction(CallStmt(Call(Source{{12, 34}}, "A", 1_f)));
3197
3198 EXPECT_FALSE(r()->Resolve());
Ben Clayton54a104e2023-02-22 20:04:40 +00003199 EXPECT_EQ(r()->error(), "12:34 error: value conversion evaluated but not used");
Ben Claytoneb30a0d2023-02-09 23:19:42 +00003200}
3201
Ryan Harrisondbc13af2022-02-21 15:19:07 +00003202} // namespace
dan sinclaird2093792022-04-07 17:45:45 +00003203} // namespace tint::resolver