[resolver] Apply type storage class uses via return types Change-Id: I16cf23af7f6a792d22268e6af45c77d4faeb6918 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/46460 Commit-Queue: James Price <jrprice@google.com> Auto-Submit: James Price <jrprice@google.com> Reviewed-by: Ben Clayton <bclayton@google.com>
diff --git a/src/resolver/resolver.cc b/src/resolver/resolver.cc index d7bb477..3d11a23 100644 --- a/src/resolver/resolver.cc +++ b/src/resolver/resolver.cc
@@ -321,6 +321,14 @@ if (auto* str = func->return_type()->UnwrapAliasIfNeeded()->As<type::Struct>()) { + if (!ApplyStorageClassUsageToType(ast::StorageClass::kNone, str, + func->source())) { + diagnostics_.add_note("while instantiating return type for " + + builder_->Symbols().NameFor(func->symbol()), + func->source()); + return false; + } + auto* info = Structure(str); if (!info) { return false;
diff --git a/src/resolver/struct_storage_class_use_test.cc b/src/resolver/struct_storage_class_use_test.cc index 05db907..8213758 100644 --- a/src/resolver/struct_storage_class_use_test.cc +++ b/src/resolver/struct_storage_class_use_test.cc
@@ -49,6 +49,19 @@ UnorderedElementsAre(ast::StorageClass::kNone)); } +TEST_F(ResolverStorageClassUseTest, StructReachableFromReturnType) { + auto* s = Structure("S", {Member("a", ty.f32())}); + + Func("f", {}, s, {Return(Construct(s))}, {}); + + ASSERT_TRUE(r()->Resolve()) << r()->error(); + + auto* sem = Sem().Get(s); + ASSERT_NE(sem, nullptr); + EXPECT_THAT(sem->StorageClassUsage(), + UnorderedElementsAre(ast::StorageClass::kNone)); +} + TEST_F(ResolverStorageClassUseTest, StructReachableFromGlobal) { auto* s = Structure("S", {Member("a", ty.f32())});