[tint] Pass the valid layout storage into ValidateStorageClassLayouts

This CL changes ValidateStorageClassLayouts to take the
valid_type_storage_layouts_ as a parameter instead of accessing
directly.

Bug: tint:1313
Change-Id: I2eade6abd9b0acf3d8937c08b0453682be8864fa
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/87147
Reviewed-by: Ben Clayton <bclayton@google.com>
Commit-Queue: Dan Sinclair <dsinclair@chromium.org>
diff --git a/src/tint/resolver/resolver.cc b/src/tint/resolver/resolver.cc
index 81a2430..5084d22 100644
--- a/src/tint/resolver/resolver.cc
+++ b/src/tint/resolver/resolver.cc
@@ -554,7 +554,7 @@
 
   // TODO(bclayton): Call this at the end of resolve on all uniform and storage
   // referenced structs
-  if (!ValidateStorageClassLayout(sem)) {
+  if (!ValidateStorageClassLayout(sem, valid_type_storage_layouts_)) {
     return nullptr;
   }
 
diff --git a/src/tint/resolver/resolver.h b/src/tint/resolver/resolver.h
index bcd780e..1e7711f 100644
--- a/src/tint/resolver/resolver.h
+++ b/src/tint/resolver/resolver.h
@@ -106,8 +106,9 @@
   /// Describes the context in which a variable is declared
   enum class VariableKind { kParameter, kLocal, kGlobal };
 
-  std::set<std::pair<const sem::Type*, ast::StorageClass>>
-      valid_type_storage_layouts_;
+  using ValidTypeStorageLayouts =
+      std::set<std::pair<const sem::Type*, ast::StorageClass>>;
+  ValidTypeStorageLayouts valid_type_storage_layouts_;
 
   /// Structure holding semantic information about a block (i.e. scope), such as
   /// parent block and variables declared in the block.
@@ -307,8 +308,10 @@
   bool ValidateNoDuplicateAttributes(const ast::AttributeList& attributes);
   bool ValidateStorageClassLayout(const sem::Type* type,
                                   ast::StorageClass sc,
-                                  Source source);
-  bool ValidateStorageClassLayout(const sem::Variable* var);
+                                  Source source,
+                                  ValidTypeStorageLayouts& layout);
+  bool ValidateStorageClassLayout(const sem::Variable* var,
+                                  ValidTypeStorageLayouts& layout);
 
   /// @returns true if the attribute list contains a
   /// ast::DisableValidationAttribute with the validation mode equal to
diff --git a/src/tint/resolver/resolver_validation.cc b/src/tint/resolver/resolver_validation.cc
index 0ef4ef9..1612049 100644
--- a/src/tint/resolver/resolver_validation.cc
+++ b/src/tint/resolver/resolver_validation.cc
@@ -230,7 +230,8 @@
 
 bool Resolver::ValidateStorageClassLayout(const sem::Type* store_ty,
                                           ast::StorageClass sc,
-                                          Source source) {
+                                          Source source,
+                                          ValidTypeStorageLayouts& layouts) {
   // https://gpuweb.github.io/gpuweb/wgsl/#storage-class-layout-constraints
 
   auto is_uniform_struct_or_array = [sc](const sem::Type* ty) {
@@ -270,8 +271,8 @@
       uint32_t required_align = required_alignment_of(m->Type());
 
       // Recurse into the member type.
-      if (!ValidateStorageClassLayout(m->Type(), sc,
-                                      m->Declaration()->type->source)) {
+      if (!ValidateStorageClassLayout(
+              m->Type(), sc, m->Declaration()->type->source, layouts)) {
         AddNote("see layout of struct:\n" + str->Layout(builder_->Symbols()),
                 str->Declaration()->source);
         return false;
@@ -339,7 +340,7 @@
     // TODO(crbug.com/tint/1388): Ideally we'd pass the source for nested
     // element type here, but we can't easily get that from the semantic node.
     // We should consider recursing through the AST type nodes instead.
-    if (!ValidateStorageClassLayout(arr->ElemType(), sc, source)) {
+    if (!ValidateStorageClassLayout(arr->ElemType(), sc, source, layouts)) {
       return false;
     }
 
@@ -381,10 +382,11 @@
   return true;
 }
 
-bool Resolver::ValidateStorageClassLayout(const sem::Variable* var) {
+bool Resolver::ValidateStorageClassLayout(const sem::Variable* var,
+                                          ValidTypeStorageLayouts& layouts) {
   if (auto* str = var->Type()->UnwrapRef()->As<sem::Struct>()) {
     if (!ValidateStorageClassLayout(str, var->StorageClass(),
-                                    str->Declaration()->source)) {
+                                    str->Declaration()->source, layouts)) {
       AddNote("see declaration of variable", var->Declaration()->source);
       return false;
     }
@@ -394,7 +396,7 @@
       source = var->Declaration()->type->source;
     }
     if (!ValidateStorageClassLayout(var->Type()->UnwrapRef(),
-                                    var->StorageClass(), source)) {
+                                    var->StorageClass(), source, layouts)) {
       return false;
     }
   }