Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 1 | // Copyright 2021 The Tint Authors. |
| 2 | // |
| 3 | // Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 | // you may not use this file except in compliance with the License. |
| 5 | // You may obtain a copy of the License at |
| 6 | // |
| 7 | // http://www.apache.org/licenses/LICENSE-2.0 |
| 8 | // |
| 9 | // Unless required by applicable law or agreed to in writing, software |
| 10 | // distributed under the License is distributed on an "AS IS" BASIS, |
| 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 12 | // See the License for the specific language governing permissions and |
| 13 | // limitations under the License. |
| 14 | |
| 15 | #include "src/tint/writer/append_vector.h" |
Ben Clayton | 971318f | 2023-02-14 13:52:43 +0000 | [diff] [blame] | 16 | #include "src/tint/ast/test_helper.h" |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 17 | #include "src/tint/program_builder.h" |
| 18 | #include "src/tint/resolver/resolver.h" |
Ben Clayton | 54a104e | 2023-02-22 20:04:40 +0000 | [diff] [blame] | 19 | #include "src/tint/sem/value_constructor.h" |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 20 | |
dan sinclair | 86216f5 | 2023-03-22 16:47:44 +0000 | [diff] [blame] | 21 | #include "gmock/gmock.h" |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 22 | |
Ben Clayton | 0ce9ab0 | 2022-05-05 20:23:40 +0000 | [diff] [blame] | 23 | using namespace tint::number_suffixes; // NOLINT |
| 24 | |
dan sinclair | 67e79fe | 2022-04-07 14:43:05 +0000 | [diff] [blame] | 25 | namespace tint::writer { |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 26 | namespace { |
| 27 | |
| 28 | class AppendVectorTest : public ::testing::Test, public ProgramBuilder {}; |
| 29 | |
| 30 | // AppendVector(vec2<i32>(1, 2), 3) -> vec3<i32>(1, 2, 3) |
| 31 | TEST_F(AppendVectorTest, Vec2i32_i32) { |
Ben Clayton | 0ce9ab0 | 2022-05-05 20:23:40 +0000 | [diff] [blame] | 32 | auto* scalar_1 = Expr(1_i); |
| 33 | auto* scalar_2 = Expr(2_i); |
| 34 | auto* scalar_3 = Expr(3_i); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 35 | auto* vec_12 = vec2<i32>(scalar_1, scalar_2); |
| 36 | WrapInFunction(vec_12, scalar_3); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 37 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 38 | resolver::Resolver resolver(this); |
dan sinclair | 86216f5 | 2023-03-22 16:47:44 +0000 | [diff] [blame] | 39 | EXPECT_TRUE(resolver.Resolve()); |
| 40 | ASSERT_THAT(resolver.Diagnostics(), testing::IsEmpty()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 41 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 42 | auto* append = AppendVector(this, vec_12, scalar_3); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 43 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 44 | auto* vec_123 = As<ast::CallExpression>(append->Declaration()); |
| 45 | ASSERT_NE(vec_123, nullptr); |
Ben Clayton | 783b169 | 2022-08-02 17:03:35 +0000 | [diff] [blame] | 46 | ASSERT_EQ(vec_123->args.Length(), 3u); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 47 | EXPECT_EQ(vec_123->args[0], scalar_1); |
| 48 | EXPECT_EQ(vec_123->args[1], scalar_2); |
| 49 | EXPECT_EQ(vec_123->args[2], scalar_3); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 50 | |
Ben Clayton | e5a67ac | 2022-05-19 21:50:59 +0000 | [diff] [blame] | 51 | auto* call = Sem().Get<sem::Call>(vec_123); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 52 | ASSERT_NE(call, nullptr); |
Ben Clayton | 958a464 | 2022-07-26 07:55:24 +0000 | [diff] [blame] | 53 | ASSERT_EQ(call->Arguments().Length(), 3u); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 54 | EXPECT_EQ(call->Arguments()[0], Sem().Get(scalar_1)); |
| 55 | EXPECT_EQ(call->Arguments()[1], Sem().Get(scalar_2)); |
| 56 | EXPECT_EQ(call->Arguments()[2], Sem().Get(scalar_3)); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 57 | |
Ben Clayton | 54a104e | 2023-02-22 20:04:40 +0000 | [diff] [blame] | 58 | auto* ctor = call->Target()->As<sem::ValueConstructor>(); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 59 | ASSERT_NE(ctor, nullptr); |
dan sinclair | 0e780da | 2022-12-08 22:21:24 +0000 | [diff] [blame] | 60 | ASSERT_TRUE(ctor->ReturnType()->Is<type::Vector>()); |
| 61 | EXPECT_EQ(ctor->ReturnType()->As<type::Vector>()->Width(), 3u); |
| 62 | EXPECT_TRUE(ctor->ReturnType()->As<type::Vector>()->type()->Is<type::I32>()); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 63 | EXPECT_EQ(ctor->ReturnType(), call->Type()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 64 | |
Ben Clayton | 958a464 | 2022-07-26 07:55:24 +0000 | [diff] [blame] | 65 | ASSERT_EQ(ctor->Parameters().Length(), 3u); |
dan sinclair | d37ecf9 | 2022-12-08 16:39:59 +0000 | [diff] [blame] | 66 | EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::I32>()); |
| 67 | EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>()); |
| 68 | EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::I32>()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 69 | } |
| 70 | |
| 71 | // AppendVector(vec2<i32>(1, 2), 3u) -> vec3<i32>(1, 2, i32(3u)) |
| 72 | TEST_F(AppendVectorTest, Vec2i32_u32) { |
Ben Clayton | 0ce9ab0 | 2022-05-05 20:23:40 +0000 | [diff] [blame] | 73 | auto* scalar_1 = Expr(1_i); |
| 74 | auto* scalar_2 = Expr(2_i); |
| 75 | auto* scalar_3 = Expr(3_u); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 76 | auto* vec_12 = vec2<i32>(scalar_1, scalar_2); |
| 77 | WrapInFunction(vec_12, scalar_3); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 78 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 79 | resolver::Resolver resolver(this); |
dan sinclair | 86216f5 | 2023-03-22 16:47:44 +0000 | [diff] [blame] | 80 | EXPECT_TRUE(resolver.Resolve()); |
| 81 | ASSERT_THAT(resolver.Diagnostics(), testing::IsEmpty()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 82 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 83 | auto* append = AppendVector(this, vec_12, scalar_3); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 84 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 85 | auto* vec_123 = As<ast::CallExpression>(append->Declaration()); |
| 86 | ASSERT_NE(vec_123, nullptr); |
Ben Clayton | 783b169 | 2022-08-02 17:03:35 +0000 | [diff] [blame] | 87 | ASSERT_EQ(vec_123->args.Length(), 3u); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 88 | EXPECT_EQ(vec_123->args[0], scalar_1); |
| 89 | EXPECT_EQ(vec_123->args[1], scalar_2); |
| 90 | auto* u32_to_i32 = vec_123->args[2]->As<ast::CallExpression>(); |
| 91 | ASSERT_NE(u32_to_i32, nullptr); |
dan sinclair | d026e13 | 2023-04-18 19:38:25 +0000 | [diff] [blame] | 92 | ast::CheckIdentifier(u32_to_i32->target, "i32"); |
Ben Clayton | 6e0a515 | 2023-02-09 23:33:24 +0000 | [diff] [blame] | 93 | |
Ben Clayton | 783b169 | 2022-08-02 17:03:35 +0000 | [diff] [blame] | 94 | ASSERT_EQ(u32_to_i32->args.Length(), 1u); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 95 | EXPECT_EQ(u32_to_i32->args[0], scalar_3); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 96 | |
Ben Clayton | e5a67ac | 2022-05-19 21:50:59 +0000 | [diff] [blame] | 97 | auto* call = Sem().Get<sem::Call>(vec_123); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 98 | ASSERT_NE(call, nullptr); |
Ben Clayton | 958a464 | 2022-07-26 07:55:24 +0000 | [diff] [blame] | 99 | ASSERT_EQ(call->Arguments().Length(), 3u); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 100 | EXPECT_EQ(call->Arguments()[0], Sem().Get(scalar_1)); |
| 101 | EXPECT_EQ(call->Arguments()[1], Sem().Get(scalar_2)); |
| 102 | EXPECT_EQ(call->Arguments()[2], Sem().Get(u32_to_i32)); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 103 | |
Ben Clayton | 54a104e | 2023-02-22 20:04:40 +0000 | [diff] [blame] | 104 | auto* ctor = call->Target()->As<sem::ValueConstructor>(); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 105 | ASSERT_NE(ctor, nullptr); |
dan sinclair | 0e780da | 2022-12-08 22:21:24 +0000 | [diff] [blame] | 106 | ASSERT_TRUE(ctor->ReturnType()->Is<type::Vector>()); |
| 107 | EXPECT_EQ(ctor->ReturnType()->As<type::Vector>()->Width(), 3u); |
| 108 | EXPECT_TRUE(ctor->ReturnType()->As<type::Vector>()->type()->Is<type::I32>()); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 109 | EXPECT_EQ(ctor->ReturnType(), call->Type()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 110 | |
Ben Clayton | 958a464 | 2022-07-26 07:55:24 +0000 | [diff] [blame] | 111 | ASSERT_EQ(ctor->Parameters().Length(), 3u); |
dan sinclair | d37ecf9 | 2022-12-08 16:39:59 +0000 | [diff] [blame] | 112 | EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::I32>()); |
| 113 | EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>()); |
| 114 | EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::I32>()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 115 | } |
| 116 | |
| 117 | // AppendVector(vec2<i32>(vec2<u32>(1u, 2u)), 3u) -> |
| 118 | // vec3<i32>(vec2<i32>(vec2<u32>(1u, 2u)), i32(3u)) |
| 119 | TEST_F(AppendVectorTest, Vec2i32FromVec2u32_u32) { |
Ben Clayton | 0ce9ab0 | 2022-05-05 20:23:40 +0000 | [diff] [blame] | 120 | auto* scalar_1 = Expr(1_u); |
| 121 | auto* scalar_2 = Expr(2_u); |
| 122 | auto* scalar_3 = Expr(3_u); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 123 | auto* uvec_12 = vec2<u32>(scalar_1, scalar_2); |
| 124 | auto* vec_12 = vec2<i32>(uvec_12); |
| 125 | WrapInFunction(vec_12, scalar_3); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 126 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 127 | resolver::Resolver resolver(this); |
dan sinclair | 86216f5 | 2023-03-22 16:47:44 +0000 | [diff] [blame] | 128 | EXPECT_TRUE(resolver.Resolve()); |
| 129 | ASSERT_THAT(resolver.Diagnostics(), testing::IsEmpty()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 130 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 131 | auto* append = AppendVector(this, vec_12, scalar_3); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 132 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 133 | auto* vec_123 = As<ast::CallExpression>(append->Declaration()); |
| 134 | ASSERT_NE(vec_123, nullptr); |
Ben Clayton | 783b169 | 2022-08-02 17:03:35 +0000 | [diff] [blame] | 135 | ASSERT_EQ(vec_123->args.Length(), 2u); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 136 | auto* v2u32_to_v2i32 = vec_123->args[0]->As<ast::CallExpression>(); |
| 137 | ASSERT_NE(v2u32_to_v2i32, nullptr); |
Ben Clayton | 971318f | 2023-02-14 13:52:43 +0000 | [diff] [blame] | 138 | |
dan sinclair | d026e13 | 2023-04-18 19:38:25 +0000 | [diff] [blame] | 139 | ast::CheckIdentifier(v2u32_to_v2i32->target, ast::Template("vec2", "i32")); |
Ben Clayton | 783b169 | 2022-08-02 17:03:35 +0000 | [diff] [blame] | 140 | EXPECT_EQ(v2u32_to_v2i32->args.Length(), 1u); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 141 | EXPECT_EQ(v2u32_to_v2i32->args[0], uvec_12); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 142 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 143 | auto* u32_to_i32 = vec_123->args[1]->As<ast::CallExpression>(); |
| 144 | ASSERT_NE(u32_to_i32, nullptr); |
dan sinclair | d026e13 | 2023-04-18 19:38:25 +0000 | [diff] [blame] | 145 | ast::CheckIdentifier(u32_to_i32->target, "i32"); |
Ben Clayton | 783b169 | 2022-08-02 17:03:35 +0000 | [diff] [blame] | 146 | ASSERT_EQ(u32_to_i32->args.Length(), 1u); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 147 | EXPECT_EQ(u32_to_i32->args[0], scalar_3); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 148 | |
Ben Clayton | e5a67ac | 2022-05-19 21:50:59 +0000 | [diff] [blame] | 149 | auto* call = Sem().Get<sem::Call>(vec_123); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 150 | ASSERT_NE(call, nullptr); |
Ben Clayton | 958a464 | 2022-07-26 07:55:24 +0000 | [diff] [blame] | 151 | ASSERT_EQ(call->Arguments().Length(), 2u); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 152 | EXPECT_EQ(call->Arguments()[0], Sem().Get(vec_12)); |
| 153 | EXPECT_EQ(call->Arguments()[1], Sem().Get(u32_to_i32)); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 154 | |
Ben Clayton | 54a104e | 2023-02-22 20:04:40 +0000 | [diff] [blame] | 155 | auto* ctor = call->Target()->As<sem::ValueConstructor>(); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 156 | ASSERT_NE(ctor, nullptr); |
Ben Clayton | 971318f | 2023-02-14 13:52:43 +0000 | [diff] [blame] | 157 | |
dan sinclair | 0e780da | 2022-12-08 22:21:24 +0000 | [diff] [blame] | 158 | ASSERT_TRUE(ctor->ReturnType()->Is<type::Vector>()); |
| 159 | EXPECT_EQ(ctor->ReturnType()->As<type::Vector>()->Width(), 3u); |
| 160 | EXPECT_TRUE(ctor->ReturnType()->As<type::Vector>()->type()->Is<type::I32>()); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 161 | EXPECT_EQ(ctor->ReturnType(), call->Type()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 162 | |
Ben Clayton | 958a464 | 2022-07-26 07:55:24 +0000 | [diff] [blame] | 163 | ASSERT_EQ(ctor->Parameters().Length(), 2u); |
dan sinclair | 0e780da | 2022-12-08 22:21:24 +0000 | [diff] [blame] | 164 | EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::Vector>()); |
dan sinclair | d37ecf9 | 2022-12-08 16:39:59 +0000 | [diff] [blame] | 165 | EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 166 | } |
| 167 | |
| 168 | // AppendVector(vec2<i32>(1, 2), 3.0f) -> vec3<i32>(1, 2, i32(3.0f)) |
| 169 | TEST_F(AppendVectorTest, Vec2i32_f32) { |
Ben Clayton | 0ce9ab0 | 2022-05-05 20:23:40 +0000 | [diff] [blame] | 170 | auto* scalar_1 = Expr(1_i); |
| 171 | auto* scalar_2 = Expr(2_i); |
Ben Clayton | 0a3cda9 | 2022-05-10 17:30:15 +0000 | [diff] [blame] | 172 | auto* scalar_3 = Expr(3_f); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 173 | auto* vec_12 = vec2<i32>(scalar_1, scalar_2); |
| 174 | WrapInFunction(vec_12, scalar_3); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 175 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 176 | resolver::Resolver resolver(this); |
dan sinclair | 86216f5 | 2023-03-22 16:47:44 +0000 | [diff] [blame] | 177 | EXPECT_TRUE(resolver.Resolve()); |
| 178 | ASSERT_THAT(resolver.Diagnostics(), testing::IsEmpty()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 179 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 180 | auto* append = AppendVector(this, vec_12, scalar_3); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 181 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 182 | auto* vec_123 = As<ast::CallExpression>(append->Declaration()); |
| 183 | ASSERT_NE(vec_123, nullptr); |
Ben Clayton | 783b169 | 2022-08-02 17:03:35 +0000 | [diff] [blame] | 184 | ASSERT_EQ(vec_123->args.Length(), 3u); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 185 | EXPECT_EQ(vec_123->args[0], scalar_1); |
| 186 | EXPECT_EQ(vec_123->args[1], scalar_2); |
| 187 | auto* f32_to_i32 = vec_123->args[2]->As<ast::CallExpression>(); |
| 188 | ASSERT_NE(f32_to_i32, nullptr); |
dan sinclair | d026e13 | 2023-04-18 19:38:25 +0000 | [diff] [blame] | 189 | ast::CheckIdentifier(f32_to_i32->target, "i32"); |
Ben Clayton | 783b169 | 2022-08-02 17:03:35 +0000 | [diff] [blame] | 190 | ASSERT_EQ(f32_to_i32->args.Length(), 1u); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 191 | EXPECT_EQ(f32_to_i32->args[0], scalar_3); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 192 | |
Ben Clayton | e5a67ac | 2022-05-19 21:50:59 +0000 | [diff] [blame] | 193 | auto* call = Sem().Get<sem::Call>(vec_123); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 194 | ASSERT_NE(call, nullptr); |
Ben Clayton | 958a464 | 2022-07-26 07:55:24 +0000 | [diff] [blame] | 195 | ASSERT_EQ(call->Arguments().Length(), 3u); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 196 | EXPECT_EQ(call->Arguments()[0], Sem().Get(scalar_1)); |
| 197 | EXPECT_EQ(call->Arguments()[1], Sem().Get(scalar_2)); |
| 198 | EXPECT_EQ(call->Arguments()[2], Sem().Get(f32_to_i32)); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 199 | |
Ben Clayton | 54a104e | 2023-02-22 20:04:40 +0000 | [diff] [blame] | 200 | auto* ctor = call->Target()->As<sem::ValueConstructor>(); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 201 | ASSERT_NE(ctor, nullptr); |
dan sinclair | 0e780da | 2022-12-08 22:21:24 +0000 | [diff] [blame] | 202 | ASSERT_TRUE(ctor->ReturnType()->Is<type::Vector>()); |
| 203 | EXPECT_EQ(ctor->ReturnType()->As<type::Vector>()->Width(), 3u); |
| 204 | EXPECT_TRUE(ctor->ReturnType()->As<type::Vector>()->type()->Is<type::I32>()); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 205 | EXPECT_EQ(ctor->ReturnType(), call->Type()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 206 | |
Ben Clayton | 958a464 | 2022-07-26 07:55:24 +0000 | [diff] [blame] | 207 | ASSERT_EQ(ctor->Parameters().Length(), 3u); |
dan sinclair | d37ecf9 | 2022-12-08 16:39:59 +0000 | [diff] [blame] | 208 | EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::I32>()); |
| 209 | EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>()); |
| 210 | EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::I32>()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 211 | } |
| 212 | |
| 213 | // AppendVector(vec3<i32>(1, 2, 3), 4) -> vec4<i32>(1, 2, 3, 4) |
| 214 | TEST_F(AppendVectorTest, Vec3i32_i32) { |
Ben Clayton | 0ce9ab0 | 2022-05-05 20:23:40 +0000 | [diff] [blame] | 215 | auto* scalar_1 = Expr(1_i); |
| 216 | auto* scalar_2 = Expr(2_i); |
| 217 | auto* scalar_3 = Expr(3_i); |
| 218 | auto* scalar_4 = Expr(4_i); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 219 | auto* vec_123 = vec3<i32>(scalar_1, scalar_2, scalar_3); |
| 220 | WrapInFunction(vec_123, scalar_4); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 221 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 222 | resolver::Resolver resolver(this); |
dan sinclair | 86216f5 | 2023-03-22 16:47:44 +0000 | [diff] [blame] | 223 | EXPECT_TRUE(resolver.Resolve()); |
| 224 | ASSERT_THAT(resolver.Diagnostics(), testing::IsEmpty()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 225 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 226 | auto* append = AppendVector(this, vec_123, scalar_4); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 227 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 228 | auto* vec_1234 = As<ast::CallExpression>(append->Declaration()); |
| 229 | ASSERT_NE(vec_1234, nullptr); |
Ben Clayton | 783b169 | 2022-08-02 17:03:35 +0000 | [diff] [blame] | 230 | ASSERT_EQ(vec_1234->args.Length(), 4u); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 231 | EXPECT_EQ(vec_1234->args[0], scalar_1); |
| 232 | EXPECT_EQ(vec_1234->args[1], scalar_2); |
| 233 | EXPECT_EQ(vec_1234->args[2], scalar_3); |
| 234 | EXPECT_EQ(vec_1234->args[3], scalar_4); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 235 | |
Ben Clayton | e5a67ac | 2022-05-19 21:50:59 +0000 | [diff] [blame] | 236 | auto* call = Sem().Get<sem::Call>(vec_1234); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 237 | ASSERT_NE(call, nullptr); |
Ben Clayton | 958a464 | 2022-07-26 07:55:24 +0000 | [diff] [blame] | 238 | ASSERT_EQ(call->Arguments().Length(), 4u); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 239 | EXPECT_EQ(call->Arguments()[0], Sem().Get(scalar_1)); |
| 240 | EXPECT_EQ(call->Arguments()[1], Sem().Get(scalar_2)); |
| 241 | EXPECT_EQ(call->Arguments()[2], Sem().Get(scalar_3)); |
| 242 | EXPECT_EQ(call->Arguments()[3], Sem().Get(scalar_4)); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 243 | |
Ben Clayton | 54a104e | 2023-02-22 20:04:40 +0000 | [diff] [blame] | 244 | auto* ctor = call->Target()->As<sem::ValueConstructor>(); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 245 | ASSERT_NE(ctor, nullptr); |
dan sinclair | 0e780da | 2022-12-08 22:21:24 +0000 | [diff] [blame] | 246 | ASSERT_TRUE(ctor->ReturnType()->Is<type::Vector>()); |
| 247 | EXPECT_EQ(ctor->ReturnType()->As<type::Vector>()->Width(), 4u); |
| 248 | EXPECT_TRUE(ctor->ReturnType()->As<type::Vector>()->type()->Is<type::I32>()); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 249 | EXPECT_EQ(ctor->ReturnType(), call->Type()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 250 | |
Ben Clayton | 958a464 | 2022-07-26 07:55:24 +0000 | [diff] [blame] | 251 | ASSERT_EQ(ctor->Parameters().Length(), 4u); |
dan sinclair | d37ecf9 | 2022-12-08 16:39:59 +0000 | [diff] [blame] | 252 | EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::I32>()); |
| 253 | EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>()); |
| 254 | EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::I32>()); |
| 255 | EXPECT_TRUE(ctor->Parameters()[3]->Type()->Is<type::I32>()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 256 | } |
| 257 | |
| 258 | // AppendVector(vec_12, 3) -> vec3<i32>(vec_12, 3) |
| 259 | TEST_F(AppendVectorTest, Vec2i32Var_i32) { |
dan sinclair | 2a65163 | 2023-02-19 04:03:55 +0000 | [diff] [blame] | 260 | GlobalVar("vec_12", ty.vec2<i32>(), builtin::AddressSpace::kPrivate); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 261 | auto* vec_12 = Expr("vec_12"); |
Ben Clayton | 0ce9ab0 | 2022-05-05 20:23:40 +0000 | [diff] [blame] | 262 | auto* scalar_3 = Expr(3_i); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 263 | WrapInFunction(vec_12, scalar_3); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 264 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 265 | resolver::Resolver resolver(this); |
dan sinclair | 86216f5 | 2023-03-22 16:47:44 +0000 | [diff] [blame] | 266 | EXPECT_TRUE(resolver.Resolve()); |
| 267 | ASSERT_THAT(resolver.Diagnostics(), testing::IsEmpty()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 268 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 269 | auto* append = AppendVector(this, vec_12, scalar_3); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 270 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 271 | auto* vec_123 = As<ast::CallExpression>(append->Declaration()); |
| 272 | ASSERT_NE(vec_123, nullptr); |
Ben Clayton | 783b169 | 2022-08-02 17:03:35 +0000 | [diff] [blame] | 273 | ASSERT_EQ(vec_123->args.Length(), 2u); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 274 | EXPECT_EQ(vec_123->args[0], vec_12); |
| 275 | EXPECT_EQ(vec_123->args[1], scalar_3); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 276 | |
Ben Clayton | e5a67ac | 2022-05-19 21:50:59 +0000 | [diff] [blame] | 277 | auto* call = Sem().Get<sem::Call>(vec_123); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 278 | ASSERT_NE(call, nullptr); |
Ben Clayton | 958a464 | 2022-07-26 07:55:24 +0000 | [diff] [blame] | 279 | ASSERT_EQ(call->Arguments().Length(), 2u); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 280 | EXPECT_EQ(call->Arguments()[0], Sem().Get(vec_12)); |
| 281 | EXPECT_EQ(call->Arguments()[1], Sem().Get(scalar_3)); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 282 | |
Ben Clayton | 54a104e | 2023-02-22 20:04:40 +0000 | [diff] [blame] | 283 | auto* ctor = call->Target()->As<sem::ValueConstructor>(); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 284 | ASSERT_NE(ctor, nullptr); |
dan sinclair | 0e780da | 2022-12-08 22:21:24 +0000 | [diff] [blame] | 285 | ASSERT_TRUE(ctor->ReturnType()->Is<type::Vector>()); |
| 286 | EXPECT_EQ(ctor->ReturnType()->As<type::Vector>()->Width(), 3u); |
| 287 | EXPECT_TRUE(ctor->ReturnType()->As<type::Vector>()->type()->Is<type::I32>()); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 288 | EXPECT_EQ(ctor->ReturnType(), call->Type()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 289 | |
Ben Clayton | 958a464 | 2022-07-26 07:55:24 +0000 | [diff] [blame] | 290 | ASSERT_EQ(ctor->Parameters().Length(), 2u); |
dan sinclair | 0e780da | 2022-12-08 22:21:24 +0000 | [diff] [blame] | 291 | EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::Vector>()); |
dan sinclair | d37ecf9 | 2022-12-08 16:39:59 +0000 | [diff] [blame] | 292 | EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 293 | } |
| 294 | |
| 295 | // AppendVector(1, 2, scalar_3) -> vec3<i32>(1, 2, scalar_3) |
| 296 | TEST_F(AppendVectorTest, Vec2i32_i32Var) { |
dan sinclair | 2a65163 | 2023-02-19 04:03:55 +0000 | [diff] [blame] | 297 | GlobalVar("scalar_3", ty.i32(), builtin::AddressSpace::kPrivate); |
Ben Clayton | 0ce9ab0 | 2022-05-05 20:23:40 +0000 | [diff] [blame] | 298 | auto* scalar_1 = Expr(1_i); |
| 299 | auto* scalar_2 = Expr(2_i); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 300 | auto* scalar_3 = Expr("scalar_3"); |
| 301 | auto* vec_12 = vec2<i32>(scalar_1, scalar_2); |
| 302 | WrapInFunction(vec_12, scalar_3); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 303 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 304 | resolver::Resolver resolver(this); |
dan sinclair | 86216f5 | 2023-03-22 16:47:44 +0000 | [diff] [blame] | 305 | EXPECT_TRUE(resolver.Resolve()); |
| 306 | ASSERT_THAT(resolver.Diagnostics(), testing::IsEmpty()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 307 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 308 | auto* append = AppendVector(this, vec_12, scalar_3); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 309 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 310 | auto* vec_123 = As<ast::CallExpression>(append->Declaration()); |
| 311 | ASSERT_NE(vec_123, nullptr); |
Ben Clayton | 783b169 | 2022-08-02 17:03:35 +0000 | [diff] [blame] | 312 | ASSERT_EQ(vec_123->args.Length(), 3u); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 313 | EXPECT_EQ(vec_123->args[0], scalar_1); |
| 314 | EXPECT_EQ(vec_123->args[1], scalar_2); |
| 315 | EXPECT_EQ(vec_123->args[2], scalar_3); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 316 | |
Ben Clayton | e5a67ac | 2022-05-19 21:50:59 +0000 | [diff] [blame] | 317 | auto* call = Sem().Get<sem::Call>(vec_123); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 318 | ASSERT_NE(call, nullptr); |
Ben Clayton | 958a464 | 2022-07-26 07:55:24 +0000 | [diff] [blame] | 319 | ASSERT_EQ(call->Arguments().Length(), 3u); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 320 | EXPECT_EQ(call->Arguments()[0], Sem().Get(scalar_1)); |
| 321 | EXPECT_EQ(call->Arguments()[1], Sem().Get(scalar_2)); |
| 322 | EXPECT_EQ(call->Arguments()[2], Sem().Get(scalar_3)); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 323 | |
Ben Clayton | 54a104e | 2023-02-22 20:04:40 +0000 | [diff] [blame] | 324 | auto* ctor = call->Target()->As<sem::ValueConstructor>(); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 325 | ASSERT_NE(ctor, nullptr); |
dan sinclair | 0e780da | 2022-12-08 22:21:24 +0000 | [diff] [blame] | 326 | ASSERT_TRUE(ctor->ReturnType()->Is<type::Vector>()); |
| 327 | EXPECT_EQ(ctor->ReturnType()->As<type::Vector>()->Width(), 3u); |
| 328 | EXPECT_TRUE(ctor->ReturnType()->As<type::Vector>()->type()->Is<type::I32>()); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 329 | EXPECT_EQ(ctor->ReturnType(), call->Type()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 330 | |
Ben Clayton | 958a464 | 2022-07-26 07:55:24 +0000 | [diff] [blame] | 331 | ASSERT_EQ(ctor->Parameters().Length(), 3u); |
dan sinclair | d37ecf9 | 2022-12-08 16:39:59 +0000 | [diff] [blame] | 332 | EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::I32>()); |
| 333 | EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>()); |
| 334 | EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::I32>()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 335 | } |
| 336 | |
| 337 | // AppendVector(vec_12, scalar_3) -> vec3<i32>(vec_12, scalar_3) |
| 338 | TEST_F(AppendVectorTest, Vec2i32Var_i32Var) { |
dan sinclair | 2a65163 | 2023-02-19 04:03:55 +0000 | [diff] [blame] | 339 | GlobalVar("vec_12", ty.vec2<i32>(), builtin::AddressSpace::kPrivate); |
| 340 | GlobalVar("scalar_3", ty.i32(), builtin::AddressSpace::kPrivate); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 341 | auto* vec_12 = Expr("vec_12"); |
| 342 | auto* scalar_3 = Expr("scalar_3"); |
| 343 | WrapInFunction(vec_12, scalar_3); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 344 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 345 | resolver::Resolver resolver(this); |
dan sinclair | 86216f5 | 2023-03-22 16:47:44 +0000 | [diff] [blame] | 346 | EXPECT_TRUE(resolver.Resolve()); |
| 347 | ASSERT_THAT(resolver.Diagnostics(), testing::IsEmpty()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 348 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 349 | auto* append = AppendVector(this, vec_12, scalar_3); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 350 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 351 | auto* vec_123 = As<ast::CallExpression>(append->Declaration()); |
| 352 | ASSERT_NE(vec_123, nullptr); |
Ben Clayton | 783b169 | 2022-08-02 17:03:35 +0000 | [diff] [blame] | 353 | ASSERT_EQ(vec_123->args.Length(), 2u); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 354 | EXPECT_EQ(vec_123->args[0], vec_12); |
| 355 | EXPECT_EQ(vec_123->args[1], scalar_3); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 356 | |
Ben Clayton | e5a67ac | 2022-05-19 21:50:59 +0000 | [diff] [blame] | 357 | auto* call = Sem().Get<sem::Call>(vec_123); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 358 | ASSERT_NE(call, nullptr); |
Ben Clayton | 958a464 | 2022-07-26 07:55:24 +0000 | [diff] [blame] | 359 | ASSERT_EQ(call->Arguments().Length(), 2u); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 360 | EXPECT_EQ(call->Arguments()[0], Sem().Get(vec_12)); |
| 361 | EXPECT_EQ(call->Arguments()[1], Sem().Get(scalar_3)); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 362 | |
Ben Clayton | 54a104e | 2023-02-22 20:04:40 +0000 | [diff] [blame] | 363 | auto* ctor = call->Target()->As<sem::ValueConstructor>(); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 364 | ASSERT_NE(ctor, nullptr); |
dan sinclair | 0e780da | 2022-12-08 22:21:24 +0000 | [diff] [blame] | 365 | ASSERT_TRUE(ctor->ReturnType()->Is<type::Vector>()); |
| 366 | EXPECT_EQ(ctor->ReturnType()->As<type::Vector>()->Width(), 3u); |
| 367 | EXPECT_TRUE(ctor->ReturnType()->As<type::Vector>()->type()->Is<type::I32>()); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 368 | EXPECT_EQ(ctor->ReturnType(), call->Type()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 369 | |
Ben Clayton | 958a464 | 2022-07-26 07:55:24 +0000 | [diff] [blame] | 370 | ASSERT_EQ(ctor->Parameters().Length(), 2u); |
dan sinclair | 0e780da | 2022-12-08 22:21:24 +0000 | [diff] [blame] | 371 | EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::Vector>()); |
dan sinclair | d37ecf9 | 2022-12-08 16:39:59 +0000 | [diff] [blame] | 372 | EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 373 | } |
| 374 | |
| 375 | // AppendVector(vec_12, scalar_3) -> vec3<i32>(vec_12, i32(scalar_3)) |
| 376 | TEST_F(AppendVectorTest, Vec2i32Var_f32Var) { |
dan sinclair | 2a65163 | 2023-02-19 04:03:55 +0000 | [diff] [blame] | 377 | GlobalVar("vec_12", ty.vec2<i32>(), builtin::AddressSpace::kPrivate); |
| 378 | GlobalVar("scalar_3", ty.f32(), builtin::AddressSpace::kPrivate); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 379 | auto* vec_12 = Expr("vec_12"); |
| 380 | auto* scalar_3 = Expr("scalar_3"); |
| 381 | WrapInFunction(vec_12, scalar_3); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 382 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 383 | resolver::Resolver resolver(this); |
dan sinclair | 86216f5 | 2023-03-22 16:47:44 +0000 | [diff] [blame] | 384 | EXPECT_TRUE(resolver.Resolve()); |
| 385 | ASSERT_THAT(resolver.Diagnostics(), testing::IsEmpty()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 386 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 387 | auto* append = AppendVector(this, vec_12, scalar_3); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 388 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 389 | auto* vec_123 = As<ast::CallExpression>(append->Declaration()); |
| 390 | ASSERT_NE(vec_123, nullptr); |
Ben Clayton | 783b169 | 2022-08-02 17:03:35 +0000 | [diff] [blame] | 391 | ASSERT_EQ(vec_123->args.Length(), 2u); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 392 | EXPECT_EQ(vec_123->args[0], vec_12); |
| 393 | auto* f32_to_i32 = vec_123->args[1]->As<ast::CallExpression>(); |
| 394 | ASSERT_NE(f32_to_i32, nullptr); |
dan sinclair | d026e13 | 2023-04-18 19:38:25 +0000 | [diff] [blame] | 395 | ast::CheckIdentifier(f32_to_i32->target, "i32"); |
Ben Clayton | 783b169 | 2022-08-02 17:03:35 +0000 | [diff] [blame] | 396 | ASSERT_EQ(f32_to_i32->args.Length(), 1u); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 397 | EXPECT_EQ(f32_to_i32->args[0], scalar_3); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 398 | |
Ben Clayton | e5a67ac | 2022-05-19 21:50:59 +0000 | [diff] [blame] | 399 | auto* call = Sem().Get<sem::Call>(vec_123); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 400 | ASSERT_NE(call, nullptr); |
Ben Clayton | 958a464 | 2022-07-26 07:55:24 +0000 | [diff] [blame] | 401 | ASSERT_EQ(call->Arguments().Length(), 2u); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 402 | EXPECT_EQ(call->Arguments()[0], Sem().Get(vec_12)); |
| 403 | EXPECT_EQ(call->Arguments()[1], Sem().Get(f32_to_i32)); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 404 | |
Ben Clayton | 54a104e | 2023-02-22 20:04:40 +0000 | [diff] [blame] | 405 | auto* ctor = call->Target()->As<sem::ValueConstructor>(); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 406 | ASSERT_NE(ctor, nullptr); |
dan sinclair | 0e780da | 2022-12-08 22:21:24 +0000 | [diff] [blame] | 407 | ASSERT_TRUE(ctor->ReturnType()->Is<type::Vector>()); |
| 408 | EXPECT_EQ(ctor->ReturnType()->As<type::Vector>()->Width(), 3u); |
| 409 | EXPECT_TRUE(ctor->ReturnType()->As<type::Vector>()->type()->Is<type::I32>()); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 410 | EXPECT_EQ(ctor->ReturnType(), call->Type()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 411 | |
Ben Clayton | 958a464 | 2022-07-26 07:55:24 +0000 | [diff] [blame] | 412 | ASSERT_EQ(ctor->Parameters().Length(), 2u); |
dan sinclair | 0e780da | 2022-12-08 22:21:24 +0000 | [diff] [blame] | 413 | EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::Vector>()); |
dan sinclair | d37ecf9 | 2022-12-08 16:39:59 +0000 | [diff] [blame] | 414 | EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 415 | } |
| 416 | |
| 417 | // AppendVector(vec_12, scalar_3) -> vec3<bool>(vec_12, scalar_3) |
| 418 | TEST_F(AppendVectorTest, Vec2boolVar_boolVar) { |
dan sinclair | 2a65163 | 2023-02-19 04:03:55 +0000 | [diff] [blame] | 419 | GlobalVar("vec_12", ty.vec2<bool>(), builtin::AddressSpace::kPrivate); |
| 420 | GlobalVar("scalar_3", ty.bool_(), builtin::AddressSpace::kPrivate); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 421 | auto* vec_12 = Expr("vec_12"); |
| 422 | auto* scalar_3 = Expr("scalar_3"); |
| 423 | WrapInFunction(vec_12, scalar_3); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 424 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 425 | resolver::Resolver resolver(this); |
dan sinclair | 86216f5 | 2023-03-22 16:47:44 +0000 | [diff] [blame] | 426 | EXPECT_TRUE(resolver.Resolve()); |
| 427 | ASSERT_THAT(resolver.Diagnostics(), testing::IsEmpty()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 428 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 429 | auto* append = AppendVector(this, vec_12, scalar_3); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 430 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 431 | auto* vec_123 = As<ast::CallExpression>(append->Declaration()); |
| 432 | ASSERT_NE(vec_123, nullptr); |
Ben Clayton | 783b169 | 2022-08-02 17:03:35 +0000 | [diff] [blame] | 433 | ASSERT_EQ(vec_123->args.Length(), 2u); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 434 | EXPECT_EQ(vec_123->args[0], vec_12); |
| 435 | EXPECT_EQ(vec_123->args[1], scalar_3); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 436 | |
Ben Clayton | e5a67ac | 2022-05-19 21:50:59 +0000 | [diff] [blame] | 437 | auto* call = Sem().Get<sem::Call>(vec_123); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 438 | ASSERT_NE(call, nullptr); |
Ben Clayton | 958a464 | 2022-07-26 07:55:24 +0000 | [diff] [blame] | 439 | ASSERT_EQ(call->Arguments().Length(), 2u); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 440 | EXPECT_EQ(call->Arguments()[0], Sem().Get(vec_12)); |
| 441 | EXPECT_EQ(call->Arguments()[1], Sem().Get(scalar_3)); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 442 | |
Ben Clayton | 54a104e | 2023-02-22 20:04:40 +0000 | [diff] [blame] | 443 | auto* ctor = call->Target()->As<sem::ValueConstructor>(); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 444 | ASSERT_NE(ctor, nullptr); |
dan sinclair | 0e780da | 2022-12-08 22:21:24 +0000 | [diff] [blame] | 445 | ASSERT_TRUE(ctor->ReturnType()->Is<type::Vector>()); |
| 446 | EXPECT_EQ(ctor->ReturnType()->As<type::Vector>()->Width(), 3u); |
| 447 | EXPECT_TRUE(ctor->ReturnType()->As<type::Vector>()->type()->Is<type::Bool>()); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 448 | EXPECT_EQ(ctor->ReturnType(), call->Type()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 449 | |
Ben Clayton | 958a464 | 2022-07-26 07:55:24 +0000 | [diff] [blame] | 450 | ASSERT_EQ(ctor->Parameters().Length(), 2u); |
dan sinclair | 0e780da | 2022-12-08 22:21:24 +0000 | [diff] [blame] | 451 | EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::Vector>()); |
dan sinclair | d37ecf9 | 2022-12-08 16:39:59 +0000 | [diff] [blame] | 452 | EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::Bool>()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 453 | } |
| 454 | |
| 455 | // AppendVector(vec3<i32>(), 4) -> vec3<bool>(0, 0, 0, 4) |
| 456 | TEST_F(AppendVectorTest, ZeroVec3i32_i32) { |
Ben Clayton | 0ce9ab0 | 2022-05-05 20:23:40 +0000 | [diff] [blame] | 457 | auto* scalar = Expr(4_i); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 458 | auto* vec000 = vec3<i32>(); |
| 459 | WrapInFunction(vec000, scalar); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 460 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 461 | resolver::Resolver resolver(this); |
dan sinclair | 86216f5 | 2023-03-22 16:47:44 +0000 | [diff] [blame] | 462 | EXPECT_TRUE(resolver.Resolve()); |
| 463 | ASSERT_THAT(resolver.Diagnostics(), testing::IsEmpty()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 464 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 465 | auto* append = AppendVector(this, vec000, scalar); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 466 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 467 | auto* vec_0004 = As<ast::CallExpression>(append->Declaration()); |
| 468 | ASSERT_NE(vec_0004, nullptr); |
Ben Clayton | 783b169 | 2022-08-02 17:03:35 +0000 | [diff] [blame] | 469 | ASSERT_EQ(vec_0004->args.Length(), 4u); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 470 | for (size_t i = 0; i < 3; i++) { |
Ben Clayton | 8822e29 | 2022-05-04 22:18:49 +0000 | [diff] [blame] | 471 | auto* literal = As<ast::IntLiteralExpression>(vec_0004->args[i]); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 472 | ASSERT_NE(literal, nullptr); |
| 473 | EXPECT_EQ(literal->value, 0); |
| 474 | } |
| 475 | EXPECT_EQ(vec_0004->args[3], scalar); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 476 | |
Ben Clayton | e5a67ac | 2022-05-19 21:50:59 +0000 | [diff] [blame] | 477 | auto* call = Sem().Get<sem::Call>(vec_0004); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 478 | ASSERT_NE(call, nullptr); |
Ben Clayton | 958a464 | 2022-07-26 07:55:24 +0000 | [diff] [blame] | 479 | ASSERT_EQ(call->Arguments().Length(), 4u); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 480 | EXPECT_EQ(call->Arguments()[0], Sem().Get(vec_0004->args[0])); |
| 481 | EXPECT_EQ(call->Arguments()[1], Sem().Get(vec_0004->args[1])); |
| 482 | EXPECT_EQ(call->Arguments()[2], Sem().Get(vec_0004->args[2])); |
| 483 | EXPECT_EQ(call->Arguments()[3], Sem().Get(scalar)); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 484 | |
Ben Clayton | 54a104e | 2023-02-22 20:04:40 +0000 | [diff] [blame] | 485 | auto* ctor = call->Target()->As<sem::ValueConstructor>(); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 486 | ASSERT_NE(ctor, nullptr); |
dan sinclair | 0e780da | 2022-12-08 22:21:24 +0000 | [diff] [blame] | 487 | ASSERT_TRUE(ctor->ReturnType()->Is<type::Vector>()); |
| 488 | EXPECT_EQ(ctor->ReturnType()->As<type::Vector>()->Width(), 4u); |
| 489 | EXPECT_TRUE(ctor->ReturnType()->As<type::Vector>()->type()->Is<type::I32>()); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 490 | EXPECT_EQ(ctor->ReturnType(), call->Type()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 491 | |
Ben Clayton | 958a464 | 2022-07-26 07:55:24 +0000 | [diff] [blame] | 492 | ASSERT_EQ(ctor->Parameters().Length(), 4u); |
dan sinclair | d37ecf9 | 2022-12-08 16:39:59 +0000 | [diff] [blame] | 493 | EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::I32>()); |
| 494 | EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>()); |
| 495 | EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::I32>()); |
| 496 | EXPECT_TRUE(ctor->Parameters()[3]->Type()->Is<type::I32>()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 497 | } |
| 498 | |
| 499 | } // namespace |
dan sinclair | 67e79fe | 2022-04-07 14:43:05 +0000 | [diff] [blame] | 500 | } // namespace tint::writer |