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/resolver/resolver.h"
16
17 #include "gmock/gmock.h"
18 #include "src/resolver/resolver_test_helper.h"
19 #include "src/sem/atomic_type.h"
20
21 namespace tint {
22 namespace resolver {
23 namespace {
24
25 using ResolverIsStorableTest = ResolverTest;
26
TEST_F(ResolverIsStorableTest,Void)27 TEST_F(ResolverIsStorableTest, Void) {
28 EXPECT_FALSE(r()->IsStorable(create<sem::Void>()));
29 }
30
TEST_F(ResolverIsStorableTest,Scalar)31 TEST_F(ResolverIsStorableTest, Scalar) {
32 EXPECT_TRUE(r()->IsStorable(create<sem::Bool>()));
33 EXPECT_TRUE(r()->IsStorable(create<sem::I32>()));
34 EXPECT_TRUE(r()->IsStorable(create<sem::U32>()));
35 EXPECT_TRUE(r()->IsStorable(create<sem::F32>()));
36 }
37
TEST_F(ResolverIsStorableTest,Vector)38 TEST_F(ResolverIsStorableTest, Vector) {
39 EXPECT_TRUE(r()->IsStorable(create<sem::Vector>(create<sem::I32>(), 2)));
40 EXPECT_TRUE(r()->IsStorable(create<sem::Vector>(create<sem::I32>(), 3)));
41 EXPECT_TRUE(r()->IsStorable(create<sem::Vector>(create<sem::I32>(), 4)));
42 EXPECT_TRUE(r()->IsStorable(create<sem::Vector>(create<sem::U32>(), 2)));
43 EXPECT_TRUE(r()->IsStorable(create<sem::Vector>(create<sem::U32>(), 3)));
44 EXPECT_TRUE(r()->IsStorable(create<sem::Vector>(create<sem::U32>(), 4)));
45 EXPECT_TRUE(r()->IsStorable(create<sem::Vector>(create<sem::F32>(), 2)));
46 EXPECT_TRUE(r()->IsStorable(create<sem::Vector>(create<sem::F32>(), 3)));
47 EXPECT_TRUE(r()->IsStorable(create<sem::Vector>(create<sem::F32>(), 4)));
48 }
49
TEST_F(ResolverIsStorableTest,Matrix)50 TEST_F(ResolverIsStorableTest, Matrix) {
51 auto* vec2 = create<sem::Vector>(create<sem::F32>(), 2);
52 auto* vec3 = create<sem::Vector>(create<sem::F32>(), 3);
53 auto* vec4 = create<sem::Vector>(create<sem::F32>(), 4);
54 EXPECT_TRUE(r()->IsStorable(create<sem::Matrix>(vec2, 2)));
55 EXPECT_TRUE(r()->IsStorable(create<sem::Matrix>(vec2, 3)));
56 EXPECT_TRUE(r()->IsStorable(create<sem::Matrix>(vec2, 4)));
57 EXPECT_TRUE(r()->IsStorable(create<sem::Matrix>(vec3, 2)));
58 EXPECT_TRUE(r()->IsStorable(create<sem::Matrix>(vec3, 3)));
59 EXPECT_TRUE(r()->IsStorable(create<sem::Matrix>(vec3, 4)));
60 EXPECT_TRUE(r()->IsStorable(create<sem::Matrix>(vec4, 2)));
61 EXPECT_TRUE(r()->IsStorable(create<sem::Matrix>(vec4, 3)));
62 EXPECT_TRUE(r()->IsStorable(create<sem::Matrix>(vec4, 4)));
63 }
64
TEST_F(ResolverIsStorableTest,Pointer)65 TEST_F(ResolverIsStorableTest, Pointer) {
66 auto* ptr = create<sem::Pointer>(
67 create<sem::I32>(), ast::StorageClass::kPrivate, ast::Access::kReadWrite);
68 EXPECT_FALSE(r()->IsStorable(ptr));
69 }
70
TEST_F(ResolverIsStorableTest,Atomic)71 TEST_F(ResolverIsStorableTest, Atomic) {
72 EXPECT_TRUE(r()->IsStorable(create<sem::Atomic>(create<sem::I32>())));
73 EXPECT_TRUE(r()->IsStorable(create<sem::Atomic>(create<sem::U32>())));
74 }
75
TEST_F(ResolverIsStorableTest,ArraySizedOfStorable)76 TEST_F(ResolverIsStorableTest, ArraySizedOfStorable) {
77 auto* arr = create<sem::Array>(create<sem::I32>(), 5, 4, 20, 4, 4);
78 EXPECT_TRUE(r()->IsStorable(arr));
79 }
80
TEST_F(ResolverIsStorableTest,ArrayUnsizedOfStorable)81 TEST_F(ResolverIsStorableTest, ArrayUnsizedOfStorable) {
82 auto* arr = create<sem::Array>(create<sem::I32>(), 0, 4, 4, 4, 4);
83 EXPECT_TRUE(r()->IsStorable(arr));
84 }
85
TEST_F(ResolverIsStorableTest,Struct_AllMembersStorable)86 TEST_F(ResolverIsStorableTest, Struct_AllMembersStorable) {
87 Structure("S", {
88 Member("a", ty.i32()),
89 Member("b", ty.f32()),
90 });
91
92 ASSERT_TRUE(r()->Resolve()) << r()->error();
93 }
94
TEST_F(ResolverIsStorableTest,Struct_SomeMembersNonStorable)95 TEST_F(ResolverIsStorableTest, Struct_SomeMembersNonStorable) {
96 Structure("S", {
97 Member("a", ty.i32()),
98 Member("b", ty.pointer<i32>(ast::StorageClass::kPrivate)),
99 });
100
101 EXPECT_FALSE(r()->Resolve());
102 EXPECT_EQ(
103 r()->error(),
104 R"(error: ptr<private, i32, read_write> cannot be used as the type of a structure member)");
105 }
106
TEST_F(ResolverIsStorableTest,Struct_NestedStorable)107 TEST_F(ResolverIsStorableTest, Struct_NestedStorable) {
108 auto* storable = Structure("Storable", {
109 Member("a", ty.i32()),
110 Member("b", ty.f32()),
111 });
112 Structure("S", {
113 Member("a", ty.i32()),
114 Member("b", ty.Of(storable)),
115 });
116
117 ASSERT_TRUE(r()->Resolve()) << r()->error();
118 }
119
TEST_F(ResolverIsStorableTest,Struct_NestedNonStorable)120 TEST_F(ResolverIsStorableTest, Struct_NestedNonStorable) {
121 auto* non_storable =
122 Structure("nonstorable",
123 {
124 Member("a", ty.i32()),
125 Member("b", ty.pointer<i32>(ast::StorageClass::kPrivate)),
126 });
127 Structure("S", {
128 Member("a", ty.i32()),
129 Member("b", ty.Of(non_storable)),
130 });
131
132 EXPECT_FALSE(r()->Resolve());
133 EXPECT_EQ(
134 r()->error(),
135 R"(error: ptr<private, i32, read_write> cannot be used as the type of a structure member)");
136 }
137
138 } // namespace
139 } // namespace resolver
140 } // namespace tint
141