blob: 821375810004221030c1b3507a89d7a60e6961cf [file] [log] [blame]
Ben Claytona88090b2021-03-17 22:47:33 +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 "src/resolver/resolver.h"
16
17#include "gmock/gmock.h"
18#include "src/resolver/resolver_test_helper.h"
19#include "src/semantic/struct.h"
20
21using ::testing::UnorderedElementsAre;
22
23namespace tint {
24namespace resolver {
25namespace {
26
27using ResolverStorageClassUseTest = ResolverTest;
28
29TEST_F(ResolverStorageClassUseTest, UnreachableStruct) {
30 auto* s = Structure("S", {Member("a", ty.f32())});
31
32 ASSERT_TRUE(r()->Resolve()) << r()->error();
33
34 auto* sem = Sem().Get(s);
35 ASSERT_NE(sem, nullptr);
36 EXPECT_TRUE(sem->StorageClassUsage().empty());
37}
38
Ben Clayton59b28c42021-03-30 20:06:48 +000039TEST_F(ResolverStorageClassUseTest, StructReachableFromParameter) {
40 auto* s = Structure("S", {Member("a", ty.f32())});
41
42 Func("f", {Var("param", s, ast::StorageClass::kNone)}, ty.void_(), {}, {});
43
44 ASSERT_TRUE(r()->Resolve()) << r()->error();
45
46 auto* sem = Sem().Get(s);
47 ASSERT_NE(sem, nullptr);
48 EXPECT_THAT(sem->StorageClassUsage(),
49 UnorderedElementsAre(ast::StorageClass::kNone));
50}
51
James Price5c523f32021-03-31 15:44:07 +000052TEST_F(ResolverStorageClassUseTest, StructReachableFromReturnType) {
53 auto* s = Structure("S", {Member("a", ty.f32())});
54
55 Func("f", {}, s, {Return(Construct(s))}, {});
56
57 ASSERT_TRUE(r()->Resolve()) << r()->error();
58
59 auto* sem = Sem().Get(s);
60 ASSERT_NE(sem, nullptr);
61 EXPECT_THAT(sem->StorageClassUsage(),
62 UnorderedElementsAre(ast::StorageClass::kNone));
63}
64
Ben Claytona88090b2021-03-17 22:47:33 +000065TEST_F(ResolverStorageClassUseTest, StructReachableFromGlobal) {
66 auto* s = Structure("S", {Member("a", ty.f32())});
67
68 Global("g", s, ast::StorageClass::kStorage);
69
70 ASSERT_TRUE(r()->Resolve()) << r()->error();
71
72 auto* sem = Sem().Get(s);
73 ASSERT_NE(sem, nullptr);
74 EXPECT_THAT(sem->StorageClassUsage(),
75 UnorderedElementsAre(ast::StorageClass::kStorage));
76}
77
78TEST_F(ResolverStorageClassUseTest, StructReachableViaGlobalAlias) {
79 auto* s = Structure("S", {Member("a", ty.f32())});
80 auto* a = ty.alias("A", s);
81 Global("g", a, ast::StorageClass::kStorage);
82
83 ASSERT_TRUE(r()->Resolve()) << r()->error();
84
85 auto* sem = Sem().Get(s);
86 ASSERT_NE(sem, nullptr);
87 EXPECT_THAT(sem->StorageClassUsage(),
88 UnorderedElementsAre(ast::StorageClass::kStorage));
89}
90
91TEST_F(ResolverStorageClassUseTest, StructReachableViaGlobalStruct) {
92 auto* s = Structure("S", {Member("a", ty.f32())});
93 auto* o = Structure("O", {Member("a", s)});
94 Global("g", o, ast::StorageClass::kStorage);
95
96 ASSERT_TRUE(r()->Resolve()) << r()->error();
97
98 auto* sem = Sem().Get(s);
99 ASSERT_NE(sem, nullptr);
100 EXPECT_THAT(sem->StorageClassUsage(),
101 UnorderedElementsAre(ast::StorageClass::kStorage));
102}
103
104TEST_F(ResolverStorageClassUseTest, StructReachableViaGlobalArray) {
105 auto* s = Structure("S", {Member("a", ty.f32())});
106 auto* a = ty.array(s, 3);
107 Global("g", a, ast::StorageClass::kStorage);
108
109 ASSERT_TRUE(r()->Resolve()) << r()->error();
110
111 auto* sem = Sem().Get(s);
112 ASSERT_NE(sem, nullptr);
113 EXPECT_THAT(sem->StorageClassUsage(),
114 UnorderedElementsAre(ast::StorageClass::kStorage));
115}
116
117TEST_F(ResolverStorageClassUseTest, StructReachableFromLocal) {
118 auto* s = Structure("S", {Member("a", ty.f32())});
119
120 WrapInFunction(Var("g", s, ast::StorageClass::kFunction));
121
122 ASSERT_TRUE(r()->Resolve()) << r()->error();
123
124 auto* sem = Sem().Get(s);
125 ASSERT_NE(sem, nullptr);
126 EXPECT_THAT(sem->StorageClassUsage(),
127 UnorderedElementsAre(ast::StorageClass::kFunction));
128}
129
130TEST_F(ResolverStorageClassUseTest, StructReachableViaLocalAlias) {
131 auto* s = Structure("S", {Member("a", ty.f32())});
132 auto* a = ty.alias("A", s);
133 WrapInFunction(Var("g", a, ast::StorageClass::kFunction));
134
135 ASSERT_TRUE(r()->Resolve()) << r()->error();
136
137 auto* sem = Sem().Get(s);
138 ASSERT_NE(sem, nullptr);
139 EXPECT_THAT(sem->StorageClassUsage(),
140 UnorderedElementsAre(ast::StorageClass::kFunction));
141}
142
143TEST_F(ResolverStorageClassUseTest, StructReachableViaLocalStruct) {
144 auto* s = Structure("S", {Member("a", ty.f32())});
145 auto* o = Structure("O", {Member("a", s)});
146 WrapInFunction(Var("g", o, ast::StorageClass::kFunction));
147
148 ASSERT_TRUE(r()->Resolve()) << r()->error();
149
150 auto* sem = Sem().Get(s);
151 ASSERT_NE(sem, nullptr);
152 EXPECT_THAT(sem->StorageClassUsage(),
153 UnorderedElementsAre(ast::StorageClass::kFunction));
154}
155
156TEST_F(ResolverStorageClassUseTest, StructReachableViaLocalArray) {
157 auto* s = Structure("S", {Member("a", ty.f32())});
158 auto* a = ty.array(s, 3);
159 WrapInFunction(Var("g", a, ast::StorageClass::kFunction));
160
161 ASSERT_TRUE(r()->Resolve()) << r()->error();
162
163 auto* sem = Sem().Get(s);
164 ASSERT_NE(sem, nullptr);
165 EXPECT_THAT(sem->StorageClassUsage(),
166 UnorderedElementsAre(ast::StorageClass::kFunction));
167}
168
169TEST_F(ResolverStorageClassUseTest, StructMultipleStorageClassUses) {
170 auto* s = Structure("S", {Member("a", ty.f32())});
171 Global("x", s, ast::StorageClass::kStorage);
172 Global("y", s, ast::StorageClass::kUniform);
173 WrapInFunction(Var("g", s, ast::StorageClass::kFunction));
174
175 ASSERT_TRUE(r()->Resolve()) << r()->error();
176
177 auto* sem = Sem().Get(s);
178 ASSERT_NE(sem, nullptr);
179 EXPECT_THAT(sem->StorageClassUsage(),
180 UnorderedElementsAre(ast::StorageClass::kStorage,
181 ast::StorageClass::kUniform,
182 ast::StorageClass::kFunction));
183}
184
185} // namespace
186} // namespace resolver
187} // namespace tint