[ir] Require workgroup pointers to be read_write
Fixes a ClusterFuzz test case.
Fixed: 446831128
Change-Id: I5add19f6b0f5f6be82d839c28d90d299bdcf9c78
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/263036
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
Commit-Queue: James Price <jrprice@google.com>
Auto-Submit: James Price <jrprice@google.com>
diff --git a/src/tint/lang/core/ir/validator.cc b/src/tint/lang/core/ir/validator.cc
index b2c278b..09c6782 100644
--- a/src/tint/lang/core/ir/validator.cc
+++ b/src/tint/lang/core/ir/validator.cc
@@ -2033,6 +2033,13 @@
}
}
+ if (ptr->AddressSpace() == AddressSpace::kWorkgroup) {
+ if (ptr->Access() != core::Access::kReadWrite) {
+ diag() << "workgroup pointers must be read_write access";
+ return false;
+ }
+ }
+
if (ptr->AddressSpace() == AddressSpace::kHandle) {
if (!ptr->StoreType()->IsHandle()) {
diag() << "the 'handle' address space can only be used for handle types";
diff --git a/src/tint/lang/core/ir/validator_type_test.cc b/src/tint/lang/core/ir/validator_type_test.cc
index 479592e..9862822 100644
--- a/src/tint/lang/core/ir/validator_type_test.cc
+++ b/src/tint/lang/core/ir/validator_type_test.cc
@@ -1308,23 +1308,34 @@
mod.root_block->Append(v);
}
- auto pass = true;
+ const char* expected_error = nullptr;
switch (access) {
case core::Access::kWrite:
+ if (aspace == AddressSpace::kUniform || aspace == AddressSpace::kHandle) {
+ expected_error = "uniform and handle pointers must be read access";
+ } else if (aspace == AddressSpace::kWorkgroup) {
+ expected_error = "workgroup pointers must be read_write access";
+ }
+ break;
case core::Access::kReadWrite:
- pass = aspace != AddressSpace::kUniform && aspace != AddressSpace::kHandle;
+ if (aspace == AddressSpace::kUniform || aspace == AddressSpace::kHandle) {
+ expected_error = "uniform and handle pointers must be read access";
+ }
break;
case core::Access::kRead:
+ if (aspace == AddressSpace::kWorkgroup) {
+ expected_error = "workgroup pointers must be read_write access";
+ }
+ break;
default:
break;
}
auto res = ir::Validate(mod);
- if (pass) {
+ if (expected_error == nullptr) {
ASSERT_EQ(res, Success);
} else {
ASSERT_NE(res, Success);
- EXPECT_THAT(res.Failure().reason,
- testing::HasSubstr("uniform and handle pointers must be read access"));
+ EXPECT_THAT(res.Failure().reason, testing::HasSubstr(expected_error));
}
}