• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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