blob: b32c6693eea9f83d01c4527fdbf408623cbe8f78 [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
dan sinclairf9b831c2022-08-29 21:13:00 +000024using namespace tint::number_suffixes; // NOLINT
25
Ryan Harrisondbc13af2022-02-21 15:19:07 +000026using ResolverHostShareableValidationTest = ResolverTest;
27
28TEST_F(ResolverHostShareableValidationTest, BoolMember) {
Ben Claytond205b712022-11-30 01:13:35 +000029 auto* s =
30 Structure("S", utils::Vector{Member(Source{{56, 78}}, "x", ty.bool_(Source{{12, 34}}))});
Ryan Harrisondbc13af2022-02-21 15:19:07 +000031
dan sinclair2a651632023-02-19 04:03:55 +000032 GlobalVar(Source{{90, 12}}, "g", ty.Of(s), builtin::AddressSpace::kStorage,
33 builtin::Access::kRead, Binding(0_a), Group(0_a));
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(),
Ben Claytond205b712022-11-30 01:13:35 +000039 R"(12:34 error: Type 'bool' cannot be used in address space 'storage' as it is non-host-shareable
4056:78 note: while analyzing structure member S.x
4190:12 note: while instantiating 'var' g)");
Ryan Harrisondbc13af2022-02-21 15:19:07 +000042}
43
44TEST_F(ResolverHostShareableValidationTest, BoolVectorMember) {
Ben Claytond205b712022-11-30 01:13:35 +000045 auto* s = Structure(
46 "S", utils::Vector{Member(Source{{56, 78}}, "x", ty.vec3<bool>(Source{{12, 34}}))});
Ryan Harrisondbc13af2022-02-21 15:19:07 +000047
dan sinclair2a651632023-02-19 04:03:55 +000048 GlobalVar(Source{{90, 12}}, "g", ty.Of(s), builtin::AddressSpace::kStorage,
49 builtin::Access::kRead, Binding(0_a), Group(0_a));
Ryan Harrisondbc13af2022-02-21 15:19:07 +000050
dan sinclair41e4d9a2022-05-01 14:40:55 +000051 ASSERT_FALSE(r()->Resolve());
Ryan Harrisondbc13af2022-02-21 15:19:07 +000052
dan sinclair41e4d9a2022-05-01 14:40:55 +000053 EXPECT_EQ(
54 r()->error(),
Ben Claytond205b712022-11-30 01:13:35 +000055 R"(12:34 error: Type 'vec3<bool>' cannot be used in address space 'storage' as it is non-host-shareable
5656:78 note: while analyzing structure member S.x
5790:12 note: while instantiating 'var' g)");
Ryan Harrisondbc13af2022-02-21 15:19:07 +000058}
59
60TEST_F(ResolverHostShareableValidationTest, Aliases) {
Ben Claytond205b712022-11-30 01:13:35 +000061 Alias("a1", ty.bool_());
Ben Clayton2117f802023-02-03 14:01:43 +000062 auto* s =
63 Structure("S", utils::Vector{Member(Source{{56, 78}}, "x", ty(Source{{12, 34}}, "a1"))});
dan sinclair41e4d9a2022-05-01 14:40:55 +000064 auto* a2 = Alias("a2", ty.Of(s));
dan sinclair2a651632023-02-19 04:03:55 +000065 GlobalVar(Source{{90, 12}}, "g", ty.Of(a2), builtin::AddressSpace::kStorage,
dan sinclairb6cc4cb2023-02-19 04:01:29 +000066 builtin::Access::kRead, Binding(0_a), Group(0_a));
Ryan Harrisondbc13af2022-02-21 15:19:07 +000067
dan sinclair41e4d9a2022-05-01 14:40:55 +000068 ASSERT_FALSE(r()->Resolve());
Ryan Harrisondbc13af2022-02-21 15:19:07 +000069
dan sinclair41e4d9a2022-05-01 14:40:55 +000070 EXPECT_EQ(
71 r()->error(),
Ben Claytond205b712022-11-30 01:13:35 +000072 R"(12:34 error: Type 'bool' cannot be used in address space 'storage' as it is non-host-shareable
7356:78 note: while analyzing structure member S.x
7490:12 note: while instantiating 'var' g)");
Ryan Harrisondbc13af2022-02-21 15:19:07 +000075}
76
77TEST_F(ResolverHostShareableValidationTest, NestedStructures) {
Ben Clayton783b1692022-08-02 17:03:35 +000078 auto* i1 = Structure("I1", utils::Vector{Member(Source{{1, 2}}, "x", ty.bool_())});
79 auto* i2 = Structure("I2", utils::Vector{Member(Source{{3, 4}}, "y", ty.Of(i1))});
80 auto* i3 = Structure("I3", utils::Vector{Member(Source{{5, 6}}, "z", ty.Of(i2))});
Ryan Harrisondbc13af2022-02-21 15:19:07 +000081
Ben Clayton783b1692022-08-02 17:03:35 +000082 auto* s = Structure("S", utils::Vector{Member(Source{{7, 8}}, "m", ty.Of(i3))});
Ryan Harrisondbc13af2022-02-21 15:19:07 +000083
dan sinclair2a651632023-02-19 04:03:55 +000084 GlobalVar(Source{{9, 10}}, "g", ty.Of(s), builtin::AddressSpace::kStorage,
85 builtin::Access::kRead, Binding(0_a), Group(0_a));
Ryan Harrisondbc13af2022-02-21 15:19:07 +000086
dan sinclair41e4d9a2022-05-01 14:40:55 +000087 ASSERT_FALSE(r()->Resolve());
Ryan Harrisondbc13af2022-02-21 15:19:07 +000088
dan sinclair41e4d9a2022-05-01 14:40:55 +000089 EXPECT_EQ(
90 r()->error(),
Ben Claytond205b712022-11-30 01:13:35 +000091 R"(error: Type 'bool' cannot be used in address space 'storage' as it is non-host-shareable
Ben Clayton4fe330f2022-10-13 13:33:25 +0000921:2 note: while analyzing structure member I1.x
933:4 note: while analyzing structure member I2.y
945:6 note: while analyzing structure member I3.z
957:8 note: while analyzing structure member S.m
Ben Claytonee49b1e2022-06-20 15:30:41 +0000969:10 note: while instantiating 'var' g)");
Ryan Harrisondbc13af2022-02-21 15:19:07 +000097}
98
99TEST_F(ResolverHostShareableValidationTest, NoError) {
dan sinclaire4039c72023-02-17 21:58:59 +0000100 Enable(builtin::Extension::kF16);
Zhaoming Jiang60588822022-06-28 14:03:36 +0000101
Ben Clayton783b1692022-08-02 17:03:35 +0000102 auto* i1 = Structure("I1", utils::Vector{
Zhaoming Jiang9c711742022-07-08 19:35:05 +0000103 Member(Source{{1, 1}}, "w1", ty.f32()),
Zhaoming Jiang60588822022-06-28 14:03:36 +0000104 Member(Source{{2, 1}}, "x1", ty.f32()),
105 Member(Source{{3, 1}}, "y1", ty.vec3<f32>()),
106 Member(Source{{4, 1}}, "z1", ty.array<i32, 4>()),
dan sinclair41e4d9a2022-05-01 14:40:55 +0000107 });
108 auto* a1 = Alias("a1", ty.Of(i1));
Ben Clayton783b1692022-08-02 17:03:35 +0000109 auto* i2 = Structure("I2", utils::Vector{
Zhaoming Jiang60588822022-06-28 14:03:36 +0000110 Member(Source{{5, 1}}, "x2", ty.mat2x2<f32>()),
Zhaoming Jiang9c711742022-07-08 19:35:05 +0000111 Member(Source{{6, 1}}, "w2", ty.mat3x4<f32>()),
Zhaoming Jiang60588822022-06-28 14:03:36 +0000112 Member(Source{{7, 1}}, "z2", ty.Of(i1)),
dan sinclair41e4d9a2022-05-01 14:40:55 +0000113 });
114 auto* a2 = Alias("a2", ty.Of(i2));
Ben Clayton783b1692022-08-02 17:03:35 +0000115 auto* i3 = Structure("I3", utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +0000116 Member(Source{{4, 1}}, "x3", ty.Of(a1)),
117 Member(Source{{5, 1}}, "y3", ty.Of(i2)),
118 Member(Source{{6, 1}}, "z3", ty.Of(a2)),
119 });
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000120
Ben Clayton783b1692022-08-02 17:03:35 +0000121 auto* s = Structure("S", utils::Vector{Member(Source{{7, 8}}, "m", ty.Of(i3))});
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000122
dan sinclair2a651632023-02-19 04:03:55 +0000123 GlobalVar(Source{{9, 10}}, "g", ty.Of(s), builtin::AddressSpace::kStorage,
124 builtin::Access::kRead, Binding(0_a), Group(0_a));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000125
dan sinclair41e4d9a2022-05-01 14:40:55 +0000126 ASSERT_TRUE(r()->Resolve()) << r()->error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000127}
128
129} // namespace
dan sinclaird2093792022-04-07 17:45:45 +0000130} // namespace tint::resolver