blob: 85ccd859cbe4638e6643c95a03473634a4e3df5e [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 "src/tint/resolver/resolver.h"
16
17#include "gmock/gmock.h"
Ryan Harrisondbc13af2022-02-21 15:19:07 +000018#include "src/tint/resolver/resolver_test_helper.h"
19#include "src/tint/sem/struct.h"
20
dan sinclaird2093792022-04-07 17:45:45 +000021namespace tint::resolver {
Ryan Harrisondbc13af2022-02-21 15:19:07 +000022namespace {
23
24using ResolverHostShareableValidationTest = ResolverTest;
25
26TEST_F(ResolverHostShareableValidationTest, BoolMember) {
dan sinclair41e4d9a2022-05-01 14:40:55 +000027 auto* s = Structure("S", {Member(Source{{12, 34}}, "x", ty.bool_())});
Ryan Harrisondbc13af2022-02-21 15:19:07 +000028
dan sinclair41e4d9a2022-05-01 14:40:55 +000029 Global(Source{{56, 78}}, "g", ty.Of(s), ast::StorageClass::kStorage, ast::Access::kRead,
30 ast::AttributeList{
31 create<ast::BindingAttribute>(0),
32 create<ast::GroupAttribute>(0),
33 });
Ryan Harrisondbc13af2022-02-21 15:19:07 +000034
dan sinclair41e4d9a2022-05-01 14:40:55 +000035 ASSERT_FALSE(r()->Resolve());
Ryan Harrisondbc13af2022-02-21 15:19:07 +000036
dan sinclair41e4d9a2022-05-01 14:40:55 +000037 EXPECT_EQ(
38 r()->error(),
39 R"(56:78 error: Type 'bool' cannot be used in storage class 'storage' as it is non-host-shareable
Ryan Harrisondbc13af2022-02-21 15:19:07 +00004012:34 note: while analysing structure member S.x
Ben Claytonee49b1e2022-06-20 15:30:41 +00004156:78 note: while instantiating 'var' g)");
Ryan Harrisondbc13af2022-02-21 15:19:07 +000042}
43
44TEST_F(ResolverHostShareableValidationTest, BoolVectorMember) {
dan sinclair41e4d9a2022-05-01 14:40:55 +000045 auto* s = Structure("S", {Member(Source{{12, 34}}, "x", ty.vec3<bool>())});
Ryan Harrisondbc13af2022-02-21 15:19:07 +000046
dan sinclair41e4d9a2022-05-01 14:40:55 +000047 Global(Source{{56, 78}}, "g", ty.Of(s), ast::StorageClass::kStorage, ast::Access::kRead,
48 ast::AttributeList{
49 create<ast::BindingAttribute>(0),
50 create<ast::GroupAttribute>(0),
51 });
Ryan Harrisondbc13af2022-02-21 15:19:07 +000052
dan sinclair41e4d9a2022-05-01 14:40:55 +000053 ASSERT_FALSE(r()->Resolve());
Ryan Harrisondbc13af2022-02-21 15:19:07 +000054
dan sinclair41e4d9a2022-05-01 14:40:55 +000055 EXPECT_EQ(
56 r()->error(),
57 R"(56:78 error: Type 'vec3<bool>' cannot be used in storage class 'storage' as it is non-host-shareable
Ryan Harrisondbc13af2022-02-21 15:19:07 +00005812:34 note: while analysing structure member S.x
Ben Claytonee49b1e2022-06-20 15:30:41 +00005956:78 note: while instantiating 'var' g)");
Ryan Harrisondbc13af2022-02-21 15:19:07 +000060}
61
62TEST_F(ResolverHostShareableValidationTest, Aliases) {
dan sinclair41e4d9a2022-05-01 14:40:55 +000063 auto* a1 = Alias("a1", ty.bool_());
64 auto* s = Structure("S", {Member(Source{{12, 34}}, "x", ty.Of(a1))});
65 auto* a2 = Alias("a2", ty.Of(s));
66 Global(Source{{56, 78}}, "g", ty.Of(a2), ast::StorageClass::kStorage, ast::Access::kRead,
67 ast::AttributeList{
68 create<ast::BindingAttribute>(0),
69 create<ast::GroupAttribute>(0),
70 });
Ryan Harrisondbc13af2022-02-21 15:19:07 +000071
dan sinclair41e4d9a2022-05-01 14:40:55 +000072 ASSERT_FALSE(r()->Resolve());
Ryan Harrisondbc13af2022-02-21 15:19:07 +000073
dan sinclair41e4d9a2022-05-01 14:40:55 +000074 EXPECT_EQ(
75 r()->error(),
76 R"(56:78 error: Type 'bool' cannot be used in storage class 'storage' as it is non-host-shareable
Ryan Harrisondbc13af2022-02-21 15:19:07 +00007712:34 note: while analysing structure member S.x
Ben Claytonee49b1e2022-06-20 15:30:41 +00007856:78 note: while instantiating 'var' g)");
Ryan Harrisondbc13af2022-02-21 15:19:07 +000079}
80
81TEST_F(ResolverHostShareableValidationTest, NestedStructures) {
dan sinclair41e4d9a2022-05-01 14:40:55 +000082 auto* i1 = Structure("I1", {Member(Source{{1, 2}}, "x", ty.bool_())});
83 auto* i2 = Structure("I2", {Member(Source{{3, 4}}, "y", ty.Of(i1))});
84 auto* i3 = Structure("I3", {Member(Source{{5, 6}}, "z", ty.Of(i2))});
Ryan Harrisondbc13af2022-02-21 15:19:07 +000085
dan sinclair41e4d9a2022-05-01 14:40:55 +000086 auto* s = Structure("S", {Member(Source{{7, 8}}, "m", ty.Of(i3))});
Ryan Harrisondbc13af2022-02-21 15:19:07 +000087
dan sinclair41e4d9a2022-05-01 14:40:55 +000088 Global(Source{{9, 10}}, "g", ty.Of(s), ast::StorageClass::kStorage, ast::Access::kRead,
89 ast::AttributeList{
90 create<ast::BindingAttribute>(0),
91 create<ast::GroupAttribute>(0),
92 });
Ryan Harrisondbc13af2022-02-21 15:19:07 +000093
dan sinclair41e4d9a2022-05-01 14:40:55 +000094 ASSERT_FALSE(r()->Resolve());
Ryan Harrisondbc13af2022-02-21 15:19:07 +000095
dan sinclair41e4d9a2022-05-01 14:40:55 +000096 EXPECT_EQ(
97 r()->error(),
98 R"(9:10 error: Type 'bool' cannot be used in storage class 'storage' as it is non-host-shareable
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000991:2 note: while analysing structure member I1.x
1003:4 note: while analysing structure member I2.y
1015:6 note: while analysing structure member I3.z
1027:8 note: while analysing structure member S.m
Ben Claytonee49b1e2022-06-20 15:30:41 +00001039:10 note: while instantiating 'var' g)");
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000104}
105
106TEST_F(ResolverHostShareableValidationTest, NoError) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000107 auto* i1 = Structure("I1", {
108 Member(Source{{1, 1}}, "x1", ty.f32()),
109 Member(Source{{2, 1}}, "y1", ty.vec3<f32>()),
110 Member(Source{{3, 1}}, "z1", ty.array<i32, 4>()),
111 });
112 auto* a1 = Alias("a1", ty.Of(i1));
113 auto* i2 = Structure("I2", {
114 Member(Source{{4, 1}}, "x2", ty.mat2x2<f32>()),
115 Member(Source{{5, 1}}, "y2", ty.Of(i1)),
116 });
117 auto* a2 = Alias("a2", ty.Of(i2));
118 auto* i3 = Structure("I3", {
119 Member(Source{{4, 1}}, "x3", ty.Of(a1)),
120 Member(Source{{5, 1}}, "y3", ty.Of(i2)),
121 Member(Source{{6, 1}}, "z3", ty.Of(a2)),
122 });
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000123
dan sinclair41e4d9a2022-05-01 14:40:55 +0000124 auto* s = Structure("S", {Member(Source{{7, 8}}, "m", ty.Of(i3))});
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000125
dan sinclair41e4d9a2022-05-01 14:40:55 +0000126 Global(Source{{9, 10}}, "g", ty.Of(s), ast::StorageClass::kStorage, ast::Access::kRead,
127 ast::AttributeList{
128 create<ast::BindingAttribute>(0),
129 create<ast::GroupAttribute>(0),
130 });
131 WrapInFunction();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000132
dan sinclair41e4d9a2022-05-01 14:40:55 +0000133 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000134}
135
136} // namespace
dan sinclaird2093792022-04-07 17:45:45 +0000137} // namespace tint::resolver