Support the group decoration.

This CL changes the set decoration to a group decoration. We still parse
`set` until downstream users can be updated.

Bug: tint:338
Change-Id: I610d1ed769b3a26c117ad6d875f8a99a3d5b7754
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/37920
Auto-Submit: dan sinclair <dsinclair@chromium.org>
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
diff --git a/BUILD.gn b/BUILD.gn
index d51ecb4..d93cb69 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -282,6 +282,8 @@
     "src/ast/function.h",
     "src/ast/function_decoration.cc",
     "src/ast/function_decoration.h",
+    "src/ast/group_decoration.cc",
+    "src/ast/group_decoration.h",
     "src/ast/identifier_expression.cc",
     "src/ast/identifier_expression.h",
     "src/ast/if_statement.cc",
@@ -310,8 +312,6 @@
     "src/ast/return_statement.h",
     "src/ast/scalar_constructor_expression.cc",
     "src/ast/scalar_constructor_expression.h",
-    "src/ast/set_decoration.cc",
-    "src/ast/set_decoration.h",
     "src/ast/sint_literal.cc",
     "src/ast/sint_literal.h",
     "src/ast/stage_decoration.cc",
@@ -780,6 +780,7 @@
     "src/ast/fallthrough_statement_test.cc",
     "src/ast/float_literal_test.cc",
     "src/ast/function_test.cc",
+    "src/ast/group_decoration_test.cc",
     "src/ast/identifier_expression_test.cc",
     "src/ast/if_statement_test.cc",
     "src/ast/int_literal_test.cc",
@@ -793,7 +794,6 @@
     "src/ast/null_literal_test.cc",
     "src/ast/return_statement_test.cc",
     "src/ast/scalar_constructor_expression_test.cc",
-    "src/ast/set_decoration_test.cc",
     "src/ast/sint_literal_test.cc",
     "src/ast/stage_decoration_test.cc",
     "src/ast/stride_decoration_test.cc",
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index adc89af..d23d6bf 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -96,6 +96,8 @@
   ast/function.h
   ast/function_decoration.cc
   ast/function_decoration.h
+  ast/group_decoration.cc
+  ast/group_decoration.h
   ast/identifier_expression.cc
   ast/identifier_expression.h
   ast/if_statement.cc
@@ -124,8 +126,6 @@
   ast/return_statement.h
   ast/scalar_constructor_expression.cc
   ast/scalar_constructor_expression.h
-  ast/set_decoration.cc
-  ast/set_decoration.h
   ast/sint_literal.cc
   ast/sint_literal.h
   ast/stage_decoration.cc
@@ -409,6 +409,7 @@
     ast/fallthrough_statement_test.cc
     ast/float_literal_test.cc
     ast/function_test.cc
+    ast/group_decoration_test.cc
     ast/identifier_expression_test.cc
     ast/if_statement_test.cc
     ast/intrinsic_texture_helper_test.cc
@@ -423,7 +424,6 @@
     ast/binary_expression_test.cc
     ast/return_statement_test.cc
     ast/scalar_constructor_expression_test.cc
-    ast/set_decoration_test.cc
     ast/sint_literal_test.cc
     ast/stage_decoration_test.cc
     ast/stride_decoration_test.cc
diff --git a/src/ast/binding_decoration_test.cc b/src/ast/binding_decoration_test.cc
index 08cde4c..ddeff33 100644
--- a/src/ast/binding_decoration_test.cc
+++ b/src/ast/binding_decoration_test.cc
@@ -34,7 +34,7 @@
   EXPECT_FALSE(d->Is<BuiltinDecoration>());
   EXPECT_FALSE(d->Is<ConstantIdDecoration>());
   EXPECT_FALSE(d->Is<LocationDecoration>());
-  EXPECT_FALSE(d->Is<SetDecoration>());
+  EXPECT_FALSE(d->Is<GroupDecoration>());
 }
 
 TEST_F(BindingDecorationTest, ToStr) {
diff --git a/src/ast/builtin_decoration_test.cc b/src/ast/builtin_decoration_test.cc
index bee20b4..df10ec7 100644
--- a/src/ast/builtin_decoration_test.cc
+++ b/src/ast/builtin_decoration_test.cc
@@ -34,7 +34,7 @@
   EXPECT_TRUE(d->Is<BuiltinDecoration>());
   EXPECT_FALSE(d->Is<ConstantIdDecoration>());
   EXPECT_FALSE(d->Is<LocationDecoration>());
-  EXPECT_FALSE(d->Is<SetDecoration>());
+  EXPECT_FALSE(d->Is<GroupDecoration>());
 }
 
 TEST_F(BuiltinDecorationTest, ToStr) {
diff --git a/src/ast/constant_id_decoration_test.cc b/src/ast/constant_id_decoration_test.cc
index 2da917a..ea38af3 100644
--- a/src/ast/constant_id_decoration_test.cc
+++ b/src/ast/constant_id_decoration_test.cc
@@ -33,7 +33,7 @@
   EXPECT_FALSE(d->Is<BuiltinDecoration>());
   EXPECT_TRUE(d->Is<ConstantIdDecoration>());
   EXPECT_FALSE(d->Is<LocationDecoration>());
-  EXPECT_FALSE(d->Is<SetDecoration>());
+  EXPECT_FALSE(d->Is<GroupDecoration>());
 }
 
 TEST_F(ConstantIdDecorationTest, ToStr) {
diff --git a/src/ast/function.cc b/src/ast/function.cc
index 723cb85..ebd21d1 100644
--- a/src/ast/function.cc
+++ b/src/ast/function.cc
@@ -108,19 +108,19 @@
     }
 
     BindingDecoration* binding = nullptr;
-    SetDecoration* set = nullptr;
+    GroupDecoration* group = nullptr;
     for (auto* deco : var->decorations()) {
       if (auto* b = deco->As<BindingDecoration>()) {
         binding = b;
-      } else if (auto* s = deco->As<SetDecoration>()) {
-        set = s;
+      } else if (auto* g = deco->As<GroupDecoration>()) {
+        group = g;
       }
     }
-    if (binding == nullptr || set == nullptr) {
+    if (binding == nullptr || group == nullptr) {
       continue;
     }
 
-    ret.push_back({var, BindingInfo{binding, set}});
+    ret.push_back({var, BindingInfo{binding, group}});
   }
   return ret;
 }
@@ -135,19 +135,19 @@
     }
 
     BindingDecoration* binding = nullptr;
-    SetDecoration* set = nullptr;
+    GroupDecoration* group = nullptr;
     for (auto* deco : var->decorations()) {
       if (auto* b = deco->As<BindingDecoration>()) {
         binding = b;
-      } else if (auto* s = deco->As<SetDecoration>()) {
-        set = s;
+      } else if (auto* s = deco->As<GroupDecoration>()) {
+        group = s;
       }
     }
-    if (binding == nullptr || set == nullptr) {
+    if (binding == nullptr || group == nullptr) {
       continue;
     }
 
-    ret.push_back({var, BindingInfo{binding, set}});
+    ret.push_back({var, BindingInfo{binding, group}});
   }
   return ret;
 }
@@ -305,20 +305,20 @@
     }
 
     BindingDecoration* binding = nullptr;
-    SetDecoration* set = nullptr;
+    GroupDecoration* group = nullptr;
     for (auto* deco : var->decorations()) {
       if (auto* b = deco->As<BindingDecoration>()) {
         binding = b;
       }
-      if (auto* s = deco->As<SetDecoration>()) {
-        set = s;
+      if (auto* s = deco->As<GroupDecoration>()) {
+        group = s;
       }
     }
-    if (binding == nullptr || set == nullptr) {
+    if (binding == nullptr || group == nullptr) {
       continue;
     }
 
-    ret.push_back({var, BindingInfo{binding, set}});
+    ret.push_back({var, BindingInfo{binding, group}});
   }
   return ret;
 }
@@ -342,19 +342,19 @@
     }
 
     BindingDecoration* binding = nullptr;
-    SetDecoration* set = nullptr;
+    GroupDecoration* group = nullptr;
     for (auto* deco : var->decorations()) {
       if (auto* b = deco->As<BindingDecoration>()) {
         binding = b;
-      } else if (auto* s = deco->As<SetDecoration>()) {
-        set = s;
+      } else if (auto* s = deco->As<GroupDecoration>()) {
+        group = s;
       }
     }
-    if (binding == nullptr || set == nullptr) {
+    if (binding == nullptr || group == nullptr) {
       continue;
     }
 
-    ret.push_back({var, BindingInfo{binding, set}});
+    ret.push_back({var, BindingInfo{binding, group}});
   }
 
   return ret;
diff --git a/src/ast/function.h b/src/ast/function.h
index 7dbda87..19fb034 100644
--- a/src/ast/function.h
+++ b/src/ast/function.h
@@ -27,10 +27,10 @@
 #include "src/ast/builtin_decoration.h"
 #include "src/ast/expression.h"
 #include "src/ast/function_decoration.h"
+#include "src/ast/group_decoration.h"
 #include "src/ast/location_decoration.h"
 #include "src/ast/node.h"
 #include "src/ast/pipeline_stage.h"
-#include "src/ast/set_decoration.h"
 #include "src/ast/statement.h"
 #include "src/ast/type/sampler_type.h"
 #include "src/ast/type/type.h"
@@ -47,8 +47,8 @@
   struct BindingInfo {
     /// The binding decoration
     BindingDecoration* binding = nullptr;
-    /// The set decoration
-    SetDecoration* set = nullptr;
+    /// The group decoration
+    GroupDecoration* group = nullptr;
   };
 
   /// Create a function
@@ -114,32 +114,32 @@
   const std::vector<std::pair<Variable*, BuiltinDecoration*>>
   referenced_builtin_variables() const;
   /// Retrieves any referenced uniform variables. Note, the variables must be
-  /// decorated with both binding and set decorations.
+  /// decorated with both binding and group decorations.
   /// @returns the referenced uniforms
   const std::vector<std::pair<Variable*, Function::BindingInfo>>
   referenced_uniform_variables() const;
   /// Retrieves any referenced storagebuffer variables. Note, the variables
-  /// must be decorated with both binding and set decorations.
+  /// must be decorated with both binding and group decorations.
   /// @returns the referenced storagebuffers
   const std::vector<std::pair<Variable*, Function::BindingInfo>>
   referenced_storagebuffer_variables() const;
   /// Retrieves any referenced regular Sampler variables. Note, the
-  /// variables must be decorated with both binding and set decorations.
+  /// variables must be decorated with both binding and group decorations.
   /// @returns the referenced storagebuffers
   const std::vector<std::pair<Variable*, Function::BindingInfo>>
   referenced_sampler_variables() const;
   /// Retrieves any referenced comparison Sampler variables. Note, the
-  /// variables must be decorated with both binding and set decorations.
+  /// variables must be decorated with both binding and group decorations.
   /// @returns the referenced storagebuffers
   const std::vector<std::pair<Variable*, Function::BindingInfo>>
   referenced_comparison_sampler_variables() const;
   /// Retrieves any referenced sampled textures variables. Note, the
-  /// variables must be decorated with both binding and set decorations.
+  /// variables must be decorated with both binding and group decorations.
   /// @returns the referenced sampled textures
   const std::vector<std::pair<Variable*, Function::BindingInfo>>
   referenced_sampled_texture_variables() const;
   /// Retrieves any referenced multisampled textures variables. Note, the
-  /// variables must be decorated with both binding and set decorations.
+  /// variables must be decorated with both binding and group decorations.
   /// @returns the referenced sampled textures
   const std::vector<std::pair<Variable*, Function::BindingInfo>>
   referenced_multisampled_texture_variables() const;
diff --git a/src/ast/set_decoration.cc b/src/ast/group_decoration.cc
similarity index 62%
rename from src/ast/set_decoration.cc
rename to src/ast/group_decoration.cc
index 3f6607c..3bbd372 100644
--- a/src/ast/set_decoration.cc
+++ b/src/ast/group_decoration.cc
@@ -12,28 +12,28 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/ast/set_decoration.h"
+#include "src/ast/group_decoration.h"
 
 #include "src/ast/clone_context.h"
 #include "src/ast/module.h"
 
-TINT_INSTANTIATE_CLASS_ID(tint::ast::SetDecoration);
+TINT_INSTANTIATE_CLASS_ID(tint::ast::GroupDecoration);
 
 namespace tint {
 namespace ast {
 
-SetDecoration::SetDecoration(const Source& source, uint32_t val)
+GroupDecoration::GroupDecoration(const Source& source, uint32_t val)
     : Base(source), value_(val) {}
 
-SetDecoration::~SetDecoration() = default;
+GroupDecoration::~GroupDecoration() = default;
 
-void SetDecoration::to_str(std::ostream& out, size_t indent) const {
+void GroupDecoration::to_str(std::ostream& out, size_t indent) const {
   make_indent(out, indent);
-  out << "SetDecoration{" << value_ << "}" << std::endl;
+  out << "GroupDecoration{" << value_ << "}" << std::endl;
 }
 
-SetDecoration* SetDecoration::Clone(CloneContext* ctx) const {
-  return ctx->mod->create<SetDecoration>(ctx->Clone(source()), value_);
+GroupDecoration* GroupDecoration::Clone(CloneContext* ctx) const {
+  return ctx->mod->create<GroupDecoration>(ctx->Clone(source()), value_);
 }
 
 }  // namespace ast
diff --git a/src/ast/set_decoration.h b/src/ast/group_decoration.h
similarity index 76%
rename from src/ast/set_decoration.h
rename to src/ast/group_decoration.h
index ec97a32..323012d 100644
--- a/src/ast/set_decoration.h
+++ b/src/ast/group_decoration.h
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_AST_SET_DECORATION_H_
-#define SRC_AST_SET_DECORATION_H_
+#ifndef SRC_AST_GROUP_DECORATION_H_
+#define SRC_AST_GROUP_DECORATION_H_
 
 #include <stddef.h>
 
@@ -22,16 +22,16 @@
 namespace tint {
 namespace ast {
 
-/// A set decoration
-class SetDecoration : public Castable<SetDecoration, VariableDecoration> {
+/// A group decoration
+class GroupDecoration : public Castable<GroupDecoration, VariableDecoration> {
  public:
   /// constructor
-  /// @param value the set value
+  /// @param value the group value
   /// @param source the source of this decoration
-  SetDecoration(const Source& source, uint32_t value);
-  ~SetDecoration() override;
+  GroupDecoration(const Source& source, uint32_t value);
+  ~GroupDecoration() override;
 
-  /// @returns the set value
+  /// @returns the group value
   uint32_t value() const { return value_; }
 
   /// Outputs the decoration to the given stream
@@ -45,7 +45,7 @@
   /// information is not cloned.
   /// @param ctx the clone context
   /// @return the newly cloned node
-  SetDecoration* Clone(CloneContext* ctx) const override;
+  GroupDecoration* Clone(CloneContext* ctx) const override;
 
  private:
   uint32_t const value_;
@@ -54,4 +54,4 @@
 }  // namespace ast
 }  // namespace tint
 
-#endif  // SRC_AST_SET_DECORATION_H_
+#endif  // SRC_AST_GROUP_DECORATION_H_
diff --git a/src/ast/set_decoration_test.cc b/src/ast/group_decoration_test.cc
similarity index 72%
rename from src/ast/set_decoration_test.cc
rename to src/ast/group_decoration_test.cc
index b5ae138..95625d3 100644
--- a/src/ast/set_decoration_test.cc
+++ b/src/ast/group_decoration_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/ast/set_decoration.h"
+#include "src/ast/group_decoration.h"
 
 #include "src/ast/constant_id_decoration.h"
 #include "src/ast/test_helper.h"
@@ -21,27 +21,27 @@
 namespace ast {
 namespace {
 
-using SetDecorationTest = TestHelper;
+using GroupDecorationTest = TestHelper;
 
-TEST_F(SetDecorationTest, Creation) {
-  auto* d = create<SetDecoration>(2);
+TEST_F(GroupDecorationTest, Creation) {
+  auto* d = create<GroupDecoration>(2);
   EXPECT_EQ(2u, d->value());
 }
 
-TEST_F(SetDecorationTest, Is) {
-  Decoration* d = create<SetDecoration>(2);
+TEST_F(GroupDecorationTest, Is) {
+  Decoration* d = create<GroupDecoration>(2);
   EXPECT_FALSE(d->Is<BindingDecoration>());
   EXPECT_FALSE(d->Is<BuiltinDecoration>());
   EXPECT_FALSE(d->Is<ConstantIdDecoration>());
   EXPECT_FALSE(d->Is<LocationDecoration>());
-  EXPECT_TRUE(d->Is<SetDecoration>());
+  EXPECT_TRUE(d->Is<GroupDecoration>());
 }
 
-TEST_F(SetDecorationTest, ToStr) {
-  auto* d = create<SetDecoration>(2);
+TEST_F(GroupDecorationTest, ToStr) {
+  auto* d = create<GroupDecoration>(2);
   std::ostringstream out;
   d->to_str(out, 0);
-  EXPECT_EQ(out.str(), R"(SetDecoration{2}
+  EXPECT_EQ(out.str(), R"(GroupDecoration{2}
 )");
 }
 
diff --git a/src/ast/intrinsic_texture_helper_test.cc b/src/ast/intrinsic_texture_helper_test.cc
index 00a2d05..256de22 100644
--- a/src/ast/intrinsic_texture_helper_test.cc
+++ b/src/ast/intrinsic_texture_helper_test.cc
@@ -155,7 +155,7 @@
   auto* datatype = resultVectorComponentType(b);
 
   VariableDecorationList decos = {
-      b->create<ast::SetDecoration>(0),
+      b->create<ast::GroupDecoration>(0),
       b->create<ast::BindingDecoration>(0),
   };
   switch (texture_kind) {
@@ -194,7 +194,7 @@
 ast::Variable* TextureOverloadCase::buildSamplerVariable(
     ast::Builder* b) const {
   VariableDecorationList decos = {
-      b->create<ast::SetDecoration>(0),
+      b->create<ast::GroupDecoration>(0),
       b->create<ast::BindingDecoration>(1),
   };
   return b->Var("sampler", ast::StorageClass::kUniformConstant,
diff --git a/src/ast/location_decoration_test.cc b/src/ast/location_decoration_test.cc
index fef2647..b8084e3 100644
--- a/src/ast/location_decoration_test.cc
+++ b/src/ast/location_decoration_test.cc
@@ -36,7 +36,7 @@
   EXPECT_FALSE(d->Is<BuiltinDecoration>());
   EXPECT_FALSE(d->Is<ConstantIdDecoration>());
   EXPECT_TRUE(d->Is<LocationDecoration>());
-  EXPECT_FALSE(d->Is<SetDecoration>());
+  EXPECT_FALSE(d->Is<GroupDecoration>());
 }
 
 TEST_F(LocationDecorationTest, ToStr) {
diff --git a/src/ast/module_clone_test.cc b/src/ast/module_clone_test.cc
index a434f93..4e61aca 100644
--- a/src/ast/module_clone_test.cc
+++ b/src/ast/module_clone_test.cc
@@ -51,10 +51,10 @@
 var<uniform> g6 : [[access(write)]] texture_storage_2d<rg32float>;
 
 [[builtin(position)]] var<uniform> g7 : vec3<f32>;
-[[set(10), binding(20)]] var<storage_buffer> g7 : S;
-[[set(10), binding(20)]] var<storage_buffer> g8 : [[access(read)]]
+[[group(10), binding(20)]] var<storage_buffer> g7 : S;
+[[group(10), binding(20)]] var<storage_buffer> g8 : [[access(read)]]
 S;
-[[set(10), binding(20)]] var<storage_buffer> g9 : [[access(read_write)]]
+[[group(10), binding(20)]] var<storage_buffer> g9 : [[access(read_write)]]
 S;
 
 fn f0(p0 : bool) -> f32 {
diff --git a/src/ast/variable_test.cc b/src/ast/variable_test.cc
index 925415d..e6475c1 100644
--- a/src/ast/variable_test.cc
+++ b/src/ast/variable_test.cc
@@ -138,7 +138,7 @@
   auto* var = Var("my_var", StorageClass::kFunction, ty.f32, Expr("expr"),
                   VariableDecorationList{
                       create<BindingDecoration>(2),
-                      create<SetDecoration>(1),
+                      create<GroupDecoration>(1),
                   });
 
   std::ostringstream out;
@@ -146,7 +146,7 @@
   EXPECT_EQ(demangle(out.str()), R"(  Variable{
     Decorations{
       BindingDecoration{2}
-      SetDecoration{1}
+      GroupDecoration{1}
     }
     my_var
     function
diff --git a/src/inspector/inspector.cc b/src/inspector/inspector.cc
index 67fbc7a..eca911d 100644
--- a/src/inspector/inspector.cc
+++ b/src/inspector/inspector.cc
@@ -187,7 +187,7 @@
       continue;
     }
 
-    entry.bind_group = binding_info.set->value();
+    entry.bind_group = binding_info.group->value();
     entry.binding = binding_info.binding->value();
     entry.min_buffer_binding_size = var->type()->MinBufferBindingSize(
         ast::type::MemoryLayout::kUniformBuffer);
@@ -224,7 +224,7 @@
     ast::Function::BindingInfo binding_info;
     std::tie(var, binding_info) = rs;
 
-    entry.bind_group = binding_info.set->value();
+    entry.bind_group = binding_info.group->value();
     entry.binding = binding_info.binding->value();
 
     result.push_back(entry);
@@ -248,7 +248,7 @@
     ast::Function::BindingInfo binding_info;
     std::tie(var, binding_info) = rcs;
 
-    entry.bind_group = binding_info.set->value();
+    entry.bind_group = binding_info.group->value();
     entry.binding = binding_info.binding->value();
 
     result.push_back(entry);
@@ -310,7 +310,7 @@
       continue;
     }
 
-    entry.bind_group = binding_info.set->value();
+    entry.bind_group = binding_info.group->value();
     entry.binding = binding_info.binding->value();
     entry.min_buffer_binding_size = var->type()->MinBufferBindingSize(
         ast::type::MemoryLayout::kStorageBuffer);
@@ -339,7 +339,7 @@
     ast::Function::BindingInfo binding_info;
     std::tie(var, binding_info) = ref;
 
-    entry.bind_group = binding_info.set->value();
+    entry.bind_group = binding_info.group->value();
     entry.binding = binding_info.binding->value();
 
     auto* texture_type =
diff --git a/src/inspector/inspector_test.cc b/src/inspector/inspector_test.cc
index 4de2319..8be535e 100644
--- a/src/inspector/inspector_test.cc
+++ b/src/inspector/inspector_test.cc
@@ -319,17 +319,17 @@
   /// @param name the name of the variable
   /// @param type the type to use
   /// @param storage_class the storage class to use
-  /// @param set the binding group/set to use for the uniform buffer
+  /// @param group the binding and group to use for the uniform buffer
   /// @param binding the binding number to use for the uniform buffer
   void AddBinding(const std::string& name,
                   ast::type::Type* type,
                   ast::StorageClass storage_class,
-                  uint32_t set,
+                  uint32_t group,
                   uint32_t binding) {
     auto* var = Var(name, storage_class, type, nullptr,
                     ast::VariableDecorationList{
                         create<ast::BindingDecoration>(binding),
-                        create<ast::SetDecoration>(set),
+                        create<ast::GroupDecoration>(group),
                     });
 
     mod->AddGlobalVariable(var);
@@ -338,25 +338,25 @@
   /// Adds an uniform buffer variable to the module
   /// @param name the name of the variable
   /// @param type the type to use
-  /// @param set the binding group/set to use for the uniform buffer
+  /// @param group the binding/group/ to use for the uniform buffer
   /// @param binding the binding number to use for the uniform buffer
   void AddUniformBuffer(const std::string& name,
                         ast::type::Type* type,
-                        uint32_t set,
+                        uint32_t group,
                         uint32_t binding) {
-    AddBinding(name, type, ast::StorageClass::kUniform, set, binding);
+    AddBinding(name, type, ast::StorageClass::kUniform, group, binding);
   }
 
   /// Adds a storage buffer variable to the module
   /// @param name the name of the variable
   /// @param type the type to use
-  /// @param set the binding group/set to use for the storage buffer
+  /// @param group the binding/group to use for the storage buffer
   /// @param binding the binding number to use for the storage buffer
   void AddStorageBuffer(const std::string& name,
                         ast::type::Type* type,
-                        uint32_t set,
+                        uint32_t group,
                         uint32_t binding) {
-    AddBinding(name, type, ast::StorageClass::kStorageBuffer, set, binding);
+    AddBinding(name, type, ast::StorageClass::kStorageBuffer, group, binding);
   }
 
   /// Generates a function that references a specific struct variable
@@ -398,22 +398,22 @@
 
   /// Adds a regular sampler variable to the module
   /// @param name the name of the variable
-  /// @param set the binding group/set to use for the storage buffer
+  /// @param group the binding/group to use for the storage buffer
   /// @param binding the binding number to use for the storage buffer
-  void AddSampler(const std::string& name, uint32_t set, uint32_t binding) {
-    AddBinding(name, sampler_type(), ast::StorageClass::kUniformConstant, set,
+  void AddSampler(const std::string& name, uint32_t group, uint32_t binding) {
+    AddBinding(name, sampler_type(), ast::StorageClass::kUniformConstant, group,
                binding);
   }
 
   /// Adds a comparison sampler variable to the module
   /// @param name the name of the variable
-  /// @param set the binding group/set to use for the storage buffer
+  /// @param group the binding/group to use for the storage buffer
   /// @param binding the binding number to use for the storage buffer
   void AddComparisonSampler(const std::string& name,
-                            uint32_t set,
+                            uint32_t group,
                             uint32_t binding) {
     AddBinding(name, comparison_sampler_type(),
-               ast::StorageClass::kUniformConstant, set, binding);
+               ast::StorageClass::kUniformConstant, group, binding);
   }
 
   /// Generates a SampledTexture appropriate for the params
@@ -447,25 +447,25 @@
   /// Adds a sampled texture variable to the module
   /// @param name the name of the variable
   /// @param type the type to use
-  /// @param set the binding group/set to use for the sampled texture
+  /// @param group the binding/group to use for the sampled texture
   /// @param binding the binding number to use for the sampled texture
   void AddSampledTexture(const std::string& name,
                          ast::type::Type* type,
-                         uint32_t set,
+                         uint32_t group,
                          uint32_t binding) {
-    AddBinding(name, type, ast::StorageClass::kUniformConstant, set, binding);
+    AddBinding(name, type, ast::StorageClass::kUniformConstant, group, binding);
   }
 
   /// Adds a multi-sampled texture variable to the module
   /// @param name the name of the variable
   /// @param type the type to use
-  /// @param set the binding group/set to use for the multi-sampled texture
+  /// @param group the binding/group to use for the multi-sampled texture
   /// @param binding the binding number to use for the multi-sampled texture
   void AddMultisampledTexture(const std::string& name,
                               ast::type::Type* type,
-                              uint32_t set,
+                              uint32_t group,
                               uint32_t binding) {
-    AddBinding(name, type, ast::StorageClass::kUniformConstant, set, binding);
+    AddBinding(name, type, ast::StorageClass::kUniformConstant, group, binding);
   }
 
   void AddGlobalVariable(const std::string& name, ast::type::Type* type) {
diff --git a/src/reader/spirv/parser_impl.cc b/src/reader/spirv/parser_impl.cc
index 54af127..93c685e 100644
--- a/src/reader/spirv/parser_impl.cc
+++ b/src/reader/spirv/parser_impl.cc
@@ -42,8 +42,8 @@
 #include "src/ast/builtin_decoration.h"
 #include "src/ast/constant_id_decoration.h"
 #include "src/ast/float_literal.h"
+#include "src/ast/group_decoration.h"
 #include "src/ast/scalar_constructor_expression.h"
-#include "src/ast/set_decoration.h"
 #include "src/ast/sint_literal.h"
 #include "src/ast/stride_decoration.h"
 #include "src/ast/struct.h"
@@ -1295,7 +1295,7 @@
                << ": has no operand";
         return nullptr;
       }
-      decorations.emplace_back(create<ast::SetDecoration>(Source{}, deco[1]));
+      decorations.emplace_back(create<ast::GroupDecoration>(Source{}, deco[1]));
     }
     if (deco[0] == SpvDecorationBinding) {
       if (deco.size() == 1) {
diff --git a/src/reader/spirv/parser_impl_handle_test.cc b/src/reader/spirv/parser_impl_handle_test.cc
index 281380c..8c4d6da 100644
--- a/src/reader/spirv/parser_impl_handle_test.cc
+++ b/src/reader/spirv/parser_impl_handle_test.cc
@@ -1145,7 +1145,7 @@
                                                           R"(
   Variable{
     Decorations{
-      SetDecoration{0}
+      GroupDecoration{0}
       BindingDecoration{0}
     }
     x_10
@@ -1163,7 +1163,7 @@
                                                           R"(
   Variable{
     Decorations{
-      SetDecoration{0}
+      GroupDecoration{0}
       BindingDecoration{0}
     }
     x_10
@@ -1179,7 +1179,7 @@
                                                           R"(
   Variable{
     Decorations{
-      SetDecoration{0}
+      GroupDecoration{0}
       BindingDecoration{0}
     }
     x_10
@@ -1195,7 +1195,7 @@
                                                           R"(
   Variable{
     Decorations{
-      SetDecoration{0}
+      GroupDecoration{0}
       BindingDecoration{0}
     }
     x_10
@@ -1352,7 +1352,7 @@
                         R"(
   Variable{
     Decorations{
-      SetDecoration{0}
+      GroupDecoration{0}
       BindingDecoration{0}
     }
     x_10
@@ -1361,7 +1361,7 @@
   }
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -1385,7 +1385,7 @@
                         R"(
   Variable{
     Decorations{
-      SetDecoration{0}
+      GroupDecoration{0}
       BindingDecoration{0}
     }
     x_10
@@ -1394,7 +1394,7 @@
   }
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -1429,7 +1429,7 @@
             R"(
   Variable{
     Decorations{
-      SetDecoration{0}
+      GroupDecoration{0}
       BindingDecoration{0}
     }
     x_10
@@ -1438,7 +1438,7 @@
   }
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -1464,7 +1464,7 @@
             R"(
   Variable{
     Decorations{
-      SetDecoration{0}
+      GroupDecoration{0}
       BindingDecoration{0}
     }
     x_10
@@ -1473,7 +1473,7 @@
   }
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -1508,7 +1508,7 @@
                         R"(
   Variable{
     Decorations{
-      SetDecoration{0}
+      GroupDecoration{0}
       BindingDecoration{0}
     }
     x_10
@@ -1517,7 +1517,7 @@
   }
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -1542,7 +1542,7 @@
                         R"(
   Variable{
     Decorations{
-      SetDecoration{0}
+      GroupDecoration{0}
       BindingDecoration{0}
     }
     x_10
@@ -1551,7 +1551,7 @@
   }
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -1587,7 +1587,7 @@
                         R"(
   Variable{
     Decorations{
-      SetDecoration{0}
+      GroupDecoration{0}
       BindingDecoration{0}
     }
     x_10
@@ -1596,7 +1596,7 @@
   }
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -1624,7 +1624,7 @@
                         R"(
   Variable{
     Decorations{
-      SetDecoration{0}
+      GroupDecoration{0}
       BindingDecoration{0}
     }
     x_10
@@ -1633,7 +1633,7 @@
   }
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -1662,7 +1662,7 @@
                         R"(
   Variable{
     Decorations{
-      SetDecoration{0}
+      GroupDecoration{0}
       BindingDecoration{0}
     }
     x_10
@@ -1671,7 +1671,7 @@
   }
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -1719,7 +1719,7 @@
                         R"(
   Variable{
     Decorations{
-      SetDecoration{0}
+      GroupDecoration{0}
       BindingDecoration{0}
     }
     x_10
@@ -1728,7 +1728,7 @@
   }
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -1737,7 +1737,7 @@
   }
   Variable{
     Decorations{
-      SetDecoration{0}
+      GroupDecoration{0}
       BindingDecoration{1}
     }
     x_30
@@ -1798,7 +1798,7 @@
                         R"(
   Variable{
     Decorations{
-      SetDecoration{0}
+      GroupDecoration{0}
       BindingDecoration{0}
     }
     x_10
@@ -1807,7 +1807,7 @@
   }
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -1831,7 +1831,7 @@
                         R"(
   Variable{
     Decorations{
-      SetDecoration{0}
+      GroupDecoration{0}
       BindingDecoration{0}
     }
     x_10
@@ -1840,7 +1840,7 @@
   }
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -1875,7 +1875,7 @@
             R"(
   Variable{
     Decorations{
-      SetDecoration{0}
+      GroupDecoration{0}
       BindingDecoration{0}
     }
     x_10
@@ -1884,7 +1884,7 @@
   }
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -1910,7 +1910,7 @@
             R"(
   Variable{
     Decorations{
-      SetDecoration{0}
+      GroupDecoration{0}
       BindingDecoration{0}
     }
     x_10
@@ -1919,7 +1919,7 @@
   }
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -1960,7 +1960,7 @@
                         R"(
   Variable{
     Decorations{
-      SetDecoration{0}
+      GroupDecoration{0}
       BindingDecoration{0}
     }
     x_10
@@ -1969,7 +1969,7 @@
   }
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -1994,7 +1994,7 @@
                         R"(
   Variable{
     Decorations{
-      SetDecoration{0}
+      GroupDecoration{0}
       BindingDecoration{0}
     }
     x_10
@@ -2003,7 +2003,7 @@
   }
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -2039,7 +2039,7 @@
                         R"(
   Variable{
     Decorations{
-      SetDecoration{0}
+      GroupDecoration{0}
       BindingDecoration{0}
     }
     x_10
@@ -2048,7 +2048,7 @@
   }
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -2076,7 +2076,7 @@
                         R"(
   Variable{
     Decorations{
-      SetDecoration{0}
+      GroupDecoration{0}
       BindingDecoration{0}
     }
     x_10
@@ -2085,7 +2085,7 @@
   }
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -2115,7 +2115,7 @@
                         R"(
   Variable{
     Decorations{
-      SetDecoration{0}
+      GroupDecoration{0}
       BindingDecoration{0}
     }
     x_10
@@ -2124,7 +2124,7 @@
   }
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -2161,7 +2161,7 @@
             R"(
   Variable{
     Decorations{
-      SetDecoration{0}
+      GroupDecoration{0}
       BindingDecoration{0}
     }
     x_10
@@ -2170,7 +2170,7 @@
   }
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -2197,7 +2197,7 @@
             R"(
   Variable{
     Decorations{
-      SetDecoration{0}
+      GroupDecoration{0}
       BindingDecoration{0}
     }
     x_10
@@ -2206,7 +2206,7 @@
   }
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -2243,7 +2243,7 @@
                         R"(
   Variable{
     Decorations{
-      SetDecoration{0}
+      GroupDecoration{0}
       BindingDecoration{0}
     }
     x_10
@@ -2252,7 +2252,7 @@
   }
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -2280,7 +2280,7 @@
                         R"(
   Variable{
     Decorations{
-      SetDecoration{0}
+      GroupDecoration{0}
       BindingDecoration{0}
     }
     x_10
@@ -2289,7 +2289,7 @@
   }
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -2320,7 +2320,7 @@
                         R"(
   Variable{
     Decorations{
-      SetDecoration{0}
+      GroupDecoration{0}
       BindingDecoration{0}
     }
     x_10
@@ -2329,7 +2329,7 @@
   }
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -2368,7 +2368,7 @@
                         R"(
   Variable{
     Decorations{
-      SetDecoration{0}
+      GroupDecoration{0}
       BindingDecoration{0}
     }
     x_10
@@ -2377,7 +2377,7 @@
   }
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -2427,7 +2427,7 @@
          R"(
   Variable{
     Decorations{
-      SetDecoration{0}
+      GroupDecoration{0}
       BindingDecoration{0}
     }
     x_10
@@ -2436,7 +2436,7 @@
   }
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -2460,7 +2460,7 @@
          R"(
   Variable{
     Decorations{
-      SetDecoration{0}
+      GroupDecoration{0}
       BindingDecoration{0}
     }
     x_10
@@ -2469,7 +2469,7 @@
   }
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -2573,7 +2573,7 @@
                               R"(
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -2601,7 +2601,7 @@
          R"(
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -2621,7 +2621,7 @@
          R"(
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -2644,7 +2644,7 @@
          R"(
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -2667,7 +2667,7 @@
          R"(
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -2690,7 +2690,7 @@
          R"(
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -2710,7 +2710,7 @@
          R"(
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -2733,7 +2733,7 @@
          R"(
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -2757,7 +2757,7 @@
          R"(
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -2923,7 +2923,7 @@
          R"(
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -2943,7 +2943,7 @@
          R"(
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -2965,7 +2965,7 @@
          R"(
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -2987,7 +2987,7 @@
          R"(
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -3011,7 +3011,7 @@
                               "%99 = OpImageRead %v4float %im %vi12",
                               R"(Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -3043,7 +3043,7 @@
         {"%float 2D 0 0 0 1 Unknown", "%99 = OpImageFetch %v4float %im %vi12",
          R"(Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -3071,7 +3071,7 @@
          "%99 = OpImageFetch %v4float %im %vi12 Lod %int_3",
          R"(Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -3108,7 +3108,7 @@
                               "%99 = OpImageFetch %v4float %im %vi12 ",
                               R"(Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -3150,7 +3150,7 @@
          "%99 = OpImageFetch %v4float %im %vi12 Sample %i1",
          R"(Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -3179,7 +3179,7 @@
          "%99 = OpImageFetch %v4float %im %vi123 Sample %i1",
          R"(Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -3219,7 +3219,7 @@
          "%99 = OpImageFetch %v4float %im %vi12 Sample %u1",
          R"(Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -3269,7 +3269,7 @@
         {"%float 2D 0 0 0 1 Unknown", "%99 = OpImageFetch %v4float %im %vi12",
          R"(Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -3296,7 +3296,7 @@
         {"%uint 2D 0 0 0 1 Unknown", "%99 = OpImageFetch %v4uint %im %vi12",
          R"(Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -3323,7 +3323,7 @@
         {"%uint 2D 0 0 0 1 Unknown", "%99 = OpImageFetch %v4int %im %vi12",
          R"(Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -3352,7 +3352,7 @@
         {"%int 2D 0 0 0 1 Unknown", "%99 = OpImageFetch %v4int %im %vi12",
          R"(Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -3379,7 +3379,7 @@
         {"%int 2D 0 0 0 1 Unknown", "%99 = OpImageFetch %v4uint %im %vi12",
          R"(Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -3413,7 +3413,7 @@
         {"%float 2D 0 0 0 1 Rgba32f", "%99 = OpImageRead %v4float %im %vi12",
          R"(Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -3440,7 +3440,7 @@
         {"%uint 2D 0 0 0 1 Rgba32ui", "%99 = OpImageRead %v4uint %im %vi12",
          R"(Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -3467,7 +3467,7 @@
         {"%uint 2D 0 0 0 1 Rgba32ui", "%99 = OpImageRead %v4int %im %vi12",
          R"(Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -3496,7 +3496,7 @@
         {"%int 2D 0 0 0 1 Rgba32i", "%99 = OpImageRead %v4int %im %vi12",
          R"(Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -3523,7 +3523,7 @@
         {"%int 2D 0 0 0 1 Rgba32i", "%99 = OpImageRead %v4uint %im %vi12",
          R"(Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
@@ -3561,7 +3561,7 @@
          R"(
   Variable{
     Decorations{
-      SetDecoration{0}
+      GroupDecoration{0}
       BindingDecoration{0}
     }
     x_10
@@ -3570,7 +3570,7 @@
   }
   Variable{
     Decorations{
-      SetDecoration{2}
+      GroupDecoration{2}
       BindingDecoration{1}
     }
     x_20
diff --git a/src/reader/spirv/parser_impl_module_var_test.cc b/src/reader/spirv/parser_impl_module_var_test.cc
index b39f219..f4ce510 100644
--- a/src/reader/spirv/parser_impl_module_var_test.cc
+++ b/src/reader/spirv/parser_impl_module_var_test.cc
@@ -1571,7 +1571,7 @@
          "instruction, found '4'."));
 }
 
-TEST_F(SpvModuleScopeVarParserTest, DescriptorSetDecoration_Valid) {
+TEST_F(SpvModuleScopeVarParserTest, DescriptorGroupDecoration_Valid) {
   auto p = parser(test::Assemble(R"(
      OpName %myvar "myvar"
      OpDecorate %myvar DescriptorSet 3
@@ -1587,7 +1587,7 @@
   EXPECT_THAT(module_str, HasSubstr(R"(
   Variable{
     Decorations{
-      SetDecoration{3}
+      GroupDecoration{3}
     }
     myvar
     storage_buffer
@@ -1597,7 +1597,7 @@
 }
 
 TEST_F(SpvModuleScopeVarParserTest,
-       DescriptorSetDecoration_MissingOperandWontAssemble) {
+       DescriptorGroupDecoration_MissingOperandWontAssemble) {
   const auto assembly = R"(
      OpName %myvar "myvar"
      OpDecorate %myvar DescriptorSet
@@ -1611,7 +1611,7 @@
 }
 
 TEST_F(SpvModuleScopeVarParserTest,
-       DescriptorSetDecoration_TwoOperandsWontAssemble) {
+       DescriptorGroupDecoration_TwoOperandsWontAssemble) {
   const auto assembly = R"(
      OpName %myvar "myvar"
      OpDecorate %myvar DescriptorSet 3 4
diff --git a/src/reader/wgsl/parser_impl.cc b/src/reader/wgsl/parser_impl.cc
index 50d6f17..6900f23 100644
--- a/src/reader/wgsl/parser_impl.cc
+++ b/src/reader/wgsl/parser_impl.cc
@@ -32,13 +32,13 @@
 #include "src/ast/else_statement.h"
 #include "src/ast/fallthrough_statement.h"
 #include "src/ast/float_literal.h"
+#include "src/ast/group_decoration.h"
 #include "src/ast/identifier_expression.h"
 #include "src/ast/if_statement.h"
 #include "src/ast/location_decoration.h"
 #include "src/ast/member_accessor_expression.h"
 #include "src/ast/return_statement.h"
 #include "src/ast/scalar_constructor_expression.h"
-#include "src/ast/set_decoration.h"
 #include "src/ast/sint_literal.h"
 #include "src/ast/stage_decoration.h"
 #include "src/ast/stride_decoration.h"
@@ -134,6 +134,7 @@
 const char kBindingDecoration[] = "binding";
 const char kBlockDecoration[] = "block";
 const char kBuiltinDecoration[] = "builtin";
+const char kGroupDecoration[] = "group";
 const char kLocationDecoration[] = "location";
 const char kOffsetDecoration[] = "offset";
 const char kSetDecoration[] = "set";
@@ -149,8 +150,9 @@
   return s == kAccessDecoration || s == kBindingDecoration ||
          s == kBlockDecoration || s == kBuiltinDecoration ||
          s == kLocationDecoration || s == kOffsetDecoration ||
-         s == kSetDecoration || s == kStageDecoration ||
-         s == kStrideDecoration || s == kWorkgroupSizeDecoration;
+         s == kSetDecoration || s == kGroupDecoration ||
+         s == kStageDecoration || s == kStrideDecoration ||
+         s == kWorkgroupSizeDecoration;
 }
 
 /// Enter-exit counters for block token types.
@@ -2863,7 +2865,7 @@
 
       if (is_decoration(peek())) {
         // We have two decorations in a bracket without a separating comma.
-        // e.g. [[location(1) set(2)]]
+        // e.g. [[location(1) group(2)]]
         //                    ^^^ expected comma
         expect(use, Token::Type::kComma);
         return Failure::kErrored;
@@ -2934,14 +2936,14 @@
     });
   }
 
-  if (s == kSetDecoration) {
-    const char* use = "set decoration";
+  if (s == kSetDecoration || s == kGroupDecoration) {
+    const char* use = "group decoration";
     return expect_paren_block(use, [&]() -> Result {
       auto val = expect_positive_sint(use);
       if (val.errored)
         return Failure::kErrored;
 
-      return create<ast::SetDecoration>(val.source, val.value);
+      return create<ast::GroupDecoration>(val.source, val.value);
     });
   }
 
diff --git a/src/reader/wgsl/parser_impl_error_msg_test.cc b/src/reader/wgsl/parser_impl_error_msg_test.cc
index f24eed4..ae6890c 100644
--- a/src/reader/wgsl/parser_impl_error_msg_test.cc
+++ b/src/reader/wgsl/parser_impl_error_msg_test.cc
@@ -941,10 +941,10 @@
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarDecoListMissingComma) {
-  EXPECT("[[location(1) set(2)]] var i : i32;",
+  EXPECT("[[location(1) group(2)]] var i : i32;",
          "test.wgsl:1:15 error: expected ',' for decoration list\n"
-         "[[location(1) set(2)]] var i : i32;\n"
-         "              ^^^\n");
+         "[[location(1) group(2)]] var i : i32;\n"
+         "              ^^^^^\n");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarDecoListMissingEnd) {
@@ -1026,26 +1026,26 @@
          "          ^\n");
 }
 
-TEST_F(ParserImplErrorTest, GlobalDeclVarDecoSetMissingLParen) {
-  EXPECT("[[set 1]] var i : i32;",
-         "test.wgsl:1:7 error: expected '(' for set decoration\n"
-         "[[set 1]] var i : i32;\n"
-         "      ^\n");
+TEST_F(ParserImplErrorTest, GlobalDeclVarDecoGroupMissingLParen) {
+  EXPECT("[[group 1]] var i : i32;",
+         "test.wgsl:1:9 error: expected '(' for group decoration\n"
+         "[[group 1]] var i : i32;\n"
+         "        ^\n");
 }
 
-TEST_F(ParserImplErrorTest, GlobalDeclVarDecoSetMissingRParen) {
-  EXPECT("[[set(1]] var i : i32;",
-         "test.wgsl:1:8 error: expected ')' for set decoration\n"
-         "[[set(1]] var i : i32;\n"
-         "       ^^\n");
+TEST_F(ParserImplErrorTest, GlobalDeclVarDecoGroupMissingRParen) {
+  EXPECT("[[group(1]] var i : i32;",
+         "test.wgsl:1:10 error: expected ')' for group decoration\n"
+         "[[group(1]] var i : i32;\n"
+         "         ^^\n");
 }
 
-TEST_F(ParserImplErrorTest, GlobalDeclVarDecoBindingSetValue) {
-  EXPECT("[[set(x)]] var i : i32;",
-         "test.wgsl:1:7 error: expected signed integer literal for set "
+TEST_F(ParserImplErrorTest, GlobalDeclVarDecoBindingGroupValue) {
+  EXPECT("[[group(x)]] var i : i32;",
+         "test.wgsl:1:9 error: expected signed integer literal for group "
          "decoration\n"
-         "[[set(x)]] var i : i32;\n"
-         "      ^\n");
+         "[[group(x)]] var i : i32;\n"
+         "        ^\n");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarInvalidIdentifier) {
diff --git a/src/reader/wgsl/parser_impl_global_variable_decl_test.cc b/src/reader/wgsl/parser_impl_global_variable_decl_test.cc
index be1199a..f17ceca 100644
--- a/src/reader/wgsl/parser_impl_global_variable_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_global_variable_decl_test.cc
@@ -74,7 +74,7 @@
 }
 
 TEST_F(ParserImplTest, GlobalVariableDecl_WithDecoration) {
-  auto p = parser("[[binding(2), set(1)]] var<out> a : f32");
+  auto p = parser("[[binding(2), group(1)]] var<out> a : f32");
   auto decos = p->decoration_list();
   EXPECT_FALSE(decos.errored);
   EXPECT_TRUE(decos.matched);
@@ -90,20 +90,20 @@
   EXPECT_EQ(e->storage_class(), ast::StorageClass::kOutput);
 
   EXPECT_EQ(e->source().range.begin.line, 1u);
-  EXPECT_EQ(e->source().range.begin.column, 33u);
+  EXPECT_EQ(e->source().range.begin.column, 35u);
   EXPECT_EQ(e->source().range.end.line, 1u);
-  EXPECT_EQ(e->source().range.end.column, 34u);
+  EXPECT_EQ(e->source().range.end.column, 36u);
 
   ASSERT_EQ(e->constructor(), nullptr);
 
   auto& decorations = e->decorations();
   ASSERT_EQ(decorations.size(), 2u);
   ASSERT_TRUE(decorations[0]->Is<ast::BindingDecoration>());
-  ASSERT_TRUE(decorations[1]->Is<ast::SetDecoration>());
+  ASSERT_TRUE(decorations[1]->Is<ast::GroupDecoration>());
 }
 
 TEST_F(ParserImplTest, GlobalVariableDecl_WithDecoration_MulitpleGroups) {
-  auto p = parser("[[binding(2)]] [[set(1)]] var<out> a : f32");
+  auto p = parser("[[binding(2)]] [[group(1)]] var<out> a : f32");
   auto decos = p->decoration_list();
   EXPECT_FALSE(decos.errored);
   EXPECT_TRUE(decos.matched);
@@ -120,16 +120,16 @@
   EXPECT_EQ(e->storage_class(), ast::StorageClass::kOutput);
 
   EXPECT_EQ(e->source().range.begin.line, 1u);
-  EXPECT_EQ(e->source().range.begin.column, 36u);
+  EXPECT_EQ(e->source().range.begin.column, 38u);
   EXPECT_EQ(e->source().range.end.line, 1u);
-  EXPECT_EQ(e->source().range.end.column, 37u);
+  EXPECT_EQ(e->source().range.end.column, 39u);
 
   ASSERT_EQ(e->constructor(), nullptr);
 
   auto& decorations = e->decorations();
   ASSERT_EQ(decorations.size(), 2u);
   ASSERT_TRUE(decorations[0]->Is<ast::BindingDecoration>());
-  ASSERT_TRUE(decorations[1]->Is<ast::SetDecoration>());
+  ASSERT_TRUE(decorations[1]->Is<ast::GroupDecoration>());
 }
 
 TEST_F(ParserImplTest, GlobalVariableDecl_InvalidDecoration) {
diff --git a/src/reader/wgsl/parser_impl_variable_decoration_test.cc b/src/reader/wgsl/parser_impl_variable_decoration_test.cc
index d6b9ac5..aedded4 100644
--- a/src/reader/wgsl/parser_impl_variable_decoration_test.cc
+++ b/src/reader/wgsl/parser_impl_variable_decoration_test.cc
@@ -15,8 +15,8 @@
 #include "gtest/gtest.h"
 #include "src/ast/binding_decoration.h"
 #include "src/ast/builtin_decoration.h"
+#include "src/ast/group_decoration.h"
 #include "src/ast/location_decoration.h"
-#include "src/ast/set_decoration.h"
 #include "src/reader/wgsl/parser_impl.h"
 #include "src/reader/wgsl/parser_impl_test_helper.h"
 
@@ -231,6 +231,7 @@
             "1:9: expected signed integer literal for binding decoration");
 }
 
+// DEPRECATED
 TEST_F(ParserImplTest, VariableDecoration_set) {
   auto p = parser("set(4)");
   auto deco = p->decoration();
@@ -240,52 +241,67 @@
   auto* var_deco = deco.value->As<ast::VariableDecoration>();
   ASSERT_FALSE(p->has_error());
   ASSERT_NE(var_deco, nullptr);
-  ASSERT_TRUE(var_deco->Is<ast::SetDecoration>());
+  ASSERT_TRUE(var_deco->Is<ast::GroupDecoration>());
 
-  auto* set = var_deco->As<ast::SetDecoration>();
-  EXPECT_EQ(set->value(), 4u);
+  auto* group = var_deco->As<ast::GroupDecoration>();
+  EXPECT_EQ(group->value(), 4u);
 }
 
-TEST_F(ParserImplTest, VariableDecoration_Set_MissingLeftParen) {
-  auto p = parser("set 2)");
+TEST_F(ParserImplTest, VariableDecoration_group) {
+  auto p = parser("group(4)");
+  auto deco = p->decoration();
+  EXPECT_TRUE(deco.matched);
+  EXPECT_FALSE(deco.errored);
+  ASSERT_NE(deco.value, nullptr);
+  auto* var_deco = deco.value->As<ast::VariableDecoration>();
+  ASSERT_FALSE(p->has_error());
+  ASSERT_NE(var_deco, nullptr);
+  ASSERT_TRUE(var_deco->Is<ast::GroupDecoration>());
+
+  auto* group = var_deco->As<ast::GroupDecoration>();
+  EXPECT_EQ(group->value(), 4u);
+}
+
+TEST_F(ParserImplTest, VariableDecoration_Group_MissingLeftParen) {
+  auto p = parser("group 2)");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
   EXPECT_EQ(deco.value, nullptr);
   EXPECT_TRUE(p->has_error());
-  EXPECT_EQ(p->error(), "1:5: expected '(' for set decoration");
+  EXPECT_EQ(p->error(), "1:7: expected '(' for group decoration");
 }
 
-TEST_F(ParserImplTest, VariableDecoration_Set_MissingRightParen) {
-  auto p = parser("set(2");
+TEST_F(ParserImplTest, VariableDecoration_Group_MissingRightParen) {
+  auto p = parser("group(2");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
   EXPECT_EQ(deco.value, nullptr);
   EXPECT_TRUE(p->has_error());
-  EXPECT_EQ(p->error(), "1:6: expected ')' for set decoration");
+  EXPECT_EQ(p->error(), "1:8: expected ')' for group decoration");
 }
 
-TEST_F(ParserImplTest, VariableDecoration_Set_MissingValue) {
-  auto p = parser("set()");
+TEST_F(ParserImplTest, VariableDecoration_Group_MissingValue) {
+  auto p = parser("group()");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
   EXPECT_EQ(deco.value, nullptr);
   EXPECT_TRUE(p->has_error());
   EXPECT_EQ(p->error(),
-            "1:5: expected signed integer literal for set decoration");
+            "1:7: expected signed integer literal for group decoration");
 }
 
-TEST_F(ParserImplTest, VariableDecoration_Set_MissingInvalid) {
-  auto p = parser("set(nan)");
+TEST_F(ParserImplTest, VariableDecoration_Group_MissingInvalid) {
+  auto p = parser("group(nan)");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
   EXPECT_EQ(deco.value, nullptr);
   EXPECT_TRUE(p->has_error());
   EXPECT_EQ(p->error(),
-            "1:5: expected signed integer literal for set decoration");
+            "1:7: expected signed integer literal for group decoration");
 }
 
 }  // namespace
diff --git a/src/transform/first_index_offset.cc b/src/transform/first_index_offset.cc
index 8158857..adc4680 100644
--- a/src/transform/first_index_offset.cc
+++ b/src/transform/first_index_offset.cc
@@ -76,8 +76,8 @@
 
 }  // namespace
 
-FirstIndexOffset::FirstIndexOffset(uint32_t binding, uint32_t set)
-    : binding_(binding), set_(set) {}
+FirstIndexOffset::FirstIndexOffset(uint32_t binding, uint32_t group)
+    : binding_(binding), group_(group) {}
 
 FirstIndexOffset::~FirstIndexOffset() = default;
 
@@ -237,7 +237,7 @@
       nullptr,                           // constructor
       ast::VariableDecorationList{
           mod->create<ast::BindingDecoration>(Source{}, binding_),
-          mod->create<ast::SetDecoration>(Source{}, set_),
+          mod->create<ast::GroupDecoration>(Source{}, group_),
       });  // decorations
 
   mod->AddGlobalVariable(idx_var);
diff --git a/src/transform/first_index_offset.h b/src/transform/first_index_offset.h
index 64ad7a3..587412b 100644
--- a/src/transform/first_index_offset.h
+++ b/src/transform/first_index_offset.h
@@ -52,7 +52,7 @@
 ///     [[offset(4)]] tint_first_instance_index : u32;
 ///   };
 ///   [[builtin(vertex_index)]] var<in> tint_first_index_offset_vert_idx : u32;
-///   [[binding(N), set(M)]] var<uniform> tint_first_index_data :
+///   [[binding(N), group(M)]] var<uniform> tint_first_index_data :
 ///                                                    TintFirstIndexOffsetData;
 ///   fn func() -> u32 {
 ///     const vert_idx = (tint_first_index_offset_vert_idx +
@@ -64,8 +64,8 @@
  public:
   /// Constructor
   /// @param binding the binding() for firstVertex/Instance uniform
-  /// @param set the set() for firstVertex/Instance uniform
-  FirstIndexOffset(uint32_t binding, uint32_t set);
+  /// @param group the group() for firstVertex/Instance uniform
+  FirstIndexOffset(uint32_t binding, uint32_t group);
   ~FirstIndexOffset() override;
 
   /// Runs the transform on `module`, returning the transformation result.
@@ -104,7 +104,7 @@
       ast::Module* module);
 
   uint32_t binding_;
-  uint32_t set_;
+  uint32_t group_;
 
   bool has_vertex_index_ = false;
   bool has_instance_index_ = false;
diff --git a/src/transform/first_index_offset_test.cc b/src/transform/first_index_offset_test.cc
index c739810..91726c4 100644
--- a/src/transform/first_index_offset_test.cc
+++ b/src/transform/first_index_offset_test.cc
@@ -83,7 +83,7 @@
 };
 
 [[builtin(vertex_idx)]] var<in> tint_first_index_offset_vert_idx : u32;
-[[binding(1), set(2)]] var<uniform> tint_first_index_data : TintFirstIndexOffsetData;
+[[binding(1), group(2)]] var<uniform> tint_first_index_data : TintFirstIndexOffsetData;
 
 fn test() -> u32 {
   const vert_idx : u32 = (tint_first_index_offset_vert_idx + tint_first_index_data.tint_first_vertex_index);
@@ -123,7 +123,7 @@
 };
 
 [[builtin(instance_idx)]] var<in> tint_first_index_offset_inst_idx : u32;
-[[binding(1), set(7)]] var<uniform> tint_first_index_data : TintFirstIndexOffsetData;
+[[binding(1), group(7)]] var<uniform> tint_first_index_data : TintFirstIndexOffsetData;
 
 fn test() -> u32 {
   const inst_idx : u32 = (tint_first_index_offset_inst_idx + tint_first_index_data.tint_first_instance_index);
@@ -167,7 +167,7 @@
 
 [[builtin(instance_idx)]] var<in> tint_first_index_offset_instance_idx : u32;
 [[builtin(vertex_idx)]] var<in> tint_first_index_offset_vert_idx : u32;
-[[binding(1), set(2)]] var<uniform> tint_first_index_data : TintFirstIndexOffsetData;
+[[binding(1), group(2)]] var<uniform> tint_first_index_data : TintFirstIndexOffsetData;
 
 fn test() -> u32 {
   const instance_idx : u32 = (tint_first_index_offset_instance_idx + tint_first_index_data.tint_first_instance_index);
@@ -212,7 +212,7 @@
 };
 
 [[builtin(vertex_idx)]] var<in> tint_first_index_offset_vert_idx : u32;
-[[binding(1), set(2)]] var<uniform> tint_first_index_data : TintFirstIndexOffsetData;
+[[binding(1), group(2)]] var<uniform> tint_first_index_data : TintFirstIndexOffsetData;
 
 fn func1() -> u32 {
   const vert_idx : u32 = (tint_first_index_offset_vert_idx + tint_first_index_data.tint_first_vertex_index);
diff --git a/src/transform/vertex_pulling.cc b/src/transform/vertex_pulling.cc
index a0d9a7e..a06fe5d 100644
--- a/src/transform/vertex_pulling.cc
+++ b/src/transform/vertex_pulling.cc
@@ -65,8 +65,12 @@
   cfg.entry_point_name = std::move(entry_point);
 }
 
+void VertexPulling::SetPullingBufferBindingGroup(uint32_t number) {
+  cfg.pulling_group = number;
+}
+
 void VertexPulling::SetPullingBufferBindingSet(uint32_t number) {
-  cfg.pulling_set = number;
+  cfg.pulling_group = number;
 }
 
 Transform::Output VertexPulling::Run(ast::Module* in) {
@@ -293,7 +297,7 @@
         ast::VariableDecorationList{
             // decorations
             out->create<ast::BindingDecoration>(Source{}, i),
-            out->create<ast::SetDecoration>(Source{}, cfg.pulling_set),
+            out->create<ast::GroupDecoration>(Source{}, cfg.pulling_group),
         });
     out->AddGlobalVariable(var);
   }
diff --git a/src/transform/vertex_pulling.h b/src/transform/vertex_pulling.h
index 6d4f23c..2233678 100644
--- a/src/transform/vertex_pulling.h
+++ b/src/transform/vertex_pulling.h
@@ -151,8 +151,13 @@
 
   /// Sets the "set" we will put all our vertex buffers into (as storage
   /// buffers)
+  /// DEPRECATED
   /// @param number the set number we will use
   void SetPullingBufferBindingSet(uint32_t number);
+  /// Sets the "group" we will put all our vertex buffers into (as storage
+  /// buffers)
+  /// @param number the group number we will use
+  void SetPullingBufferBindingGroup(uint32_t number);
 
   /// Runs the transform on `module`, returning the transformation result.
   /// @note Users of Tint should register the transform with transform manager
@@ -171,8 +176,8 @@
     std::string entry_point_name;
     VertexStateDescriptor vertex_state;
     bool vertex_state_set = false;
-    // Default to 4 as it is past the limits of user-accessible sets
-    uint32_t pulling_set = 4u;
+    // Default to 4 as it is past the limits of user-accessible groups
+    uint32_t pulling_group = 4u;
   };
 
   Config cfg;
diff --git a/src/transform/vertex_pulling_test.cc b/src/transform/vertex_pulling_test.cc
index 87e9a0c..88594cc 100644
--- a/src/transform/vertex_pulling_test.cc
+++ b/src/transform/vertex_pulling_test.cc
@@ -134,7 +134,7 @@
 };
 
 [[builtin(vertex_idx)]] var<in> _tint_pulling_vertex_index : i32;
-[[binding(0), set(4)]] var<storage_buffer> _tint_pulling_vertex_buffer_0 : TintVertexData;
+[[binding(0), group(4)]] var<storage_buffer> _tint_pulling_vertex_buffer_0 : TintVertexData;
 var<private> var_a : f32;
 
 [[stage(vertex)]]
@@ -173,7 +173,7 @@
 };
 
 [[builtin(instance_idx)]] var<in> _tint_pulling_instance_index : i32;
-[[binding(0), set(4)]] var<storage_buffer> _tint_pulling_vertex_buffer_0 : TintVertexData;
+[[binding(0), group(4)]] var<storage_buffer> _tint_pulling_vertex_buffer_0 : TintVertexData;
 var<private> var_a : f32;
 
 [[stage(vertex)]]
@@ -212,7 +212,7 @@
 };
 
 [[builtin(vertex_idx)]] var<in> _tint_pulling_vertex_index : i32;
-[[binding(0), set(5)]] var<storage_buffer> _tint_pulling_vertex_buffer_0 : TintVertexData;
+[[binding(0), group(5)]] var<storage_buffer> _tint_pulling_vertex_buffer_0 : TintVertexData;
 var<private> var_a : f32;
 
 [[stage(vertex)]]
@@ -255,8 +255,8 @@
   _tint_vertex_data : [[stride(4)]] array<u32>;
 };
 
-[[binding(0), set(4)]] var<storage_buffer> _tint_pulling_vertex_buffer_0 : TintVertexData;
-[[binding(1), set(4)]] var<storage_buffer> _tint_pulling_vertex_buffer_1 : TintVertexData;
+[[binding(0), group(4)]] var<storage_buffer> _tint_pulling_vertex_buffer_0 : TintVertexData;
+[[binding(1), group(4)]] var<storage_buffer> _tint_pulling_vertex_buffer_1 : TintVertexData;
 var<private> var_a : f32;
 var<private> var_b : f32;
 [[builtin(vertex_idx)]] var<in> custom_vertex_index : i32;
@@ -302,7 +302,7 @@
 };
 
 [[builtin(vertex_idx)]] var<in> _tint_pulling_vertex_index : i32;
-[[binding(0), set(4)]] var<storage_buffer> _tint_pulling_vertex_buffer_0 : TintVertexData;
+[[binding(0), group(4)]] var<storage_buffer> _tint_pulling_vertex_buffer_0 : TintVertexData;
 var<private> var_a : f32;
 var<private> var_b : array<f32, 4>;
 
@@ -348,9 +348,9 @@
 };
 
 [[builtin(vertex_idx)]] var<in> _tint_pulling_vertex_index : i32;
-[[binding(0), set(4)]] var<storage_buffer> _tint_pulling_vertex_buffer_0 : TintVertexData;
-[[binding(1), set(4)]] var<storage_buffer> _tint_pulling_vertex_buffer_1 : TintVertexData;
-[[binding(2), set(4)]] var<storage_buffer> _tint_pulling_vertex_buffer_2 : TintVertexData;
+[[binding(0), group(4)]] var<storage_buffer> _tint_pulling_vertex_buffer_0 : TintVertexData;
+[[binding(1), group(4)]] var<storage_buffer> _tint_pulling_vertex_buffer_1 : TintVertexData;
+[[binding(2), group(4)]] var<storage_buffer> _tint_pulling_vertex_buffer_2 : TintVertexData;
 var<private> var_a : array<f32, 2>;
 var<private> var_b : array<f32, 3>;
 var<private> var_c : array<f32, 4>;
diff --git a/src/writer/hlsl/generator_impl_function_test.cc b/src/writer/hlsl/generator_impl_function_test.cc
index af20ff1..557a35b 100644
--- a/src/writer/hlsl/generator_impl_function_test.cc
+++ b/src/writer/hlsl/generator_impl_function_test.cc
@@ -18,6 +18,7 @@
 #include "src/ast/call_expression.h"
 #include "src/ast/float_literal.h"
 #include "src/ast/function.h"
+#include "src/ast/group_decoration.h"
 #include "src/ast/identifier_expression.h"
 #include "src/ast/if_statement.h"
 #include "src/ast/location_decoration.h"
@@ -26,7 +27,6 @@
 #include "src/ast/pipeline_stage.h"
 #include "src/ast/return_statement.h"
 #include "src/ast/scalar_constructor_expression.h"
-#include "src/ast/set_decoration.h"
 #include "src/ast/sint_literal.h"
 #include "src/ast/stage_decoration.h"
 #include "src/ast/struct.h"
@@ -285,7 +285,7 @@
       Var("coord", ast::StorageClass::kUniform, ty.vec4<f32>(), nullptr,
           ast::VariableDecorationList{
               create<ast::BindingDecoration>(0),
-              create<ast::SetDecoration>(1),
+              create<ast::GroupDecoration>(1),
           });
 
   td.RegisterVariableForTesting(coord_var);
@@ -331,7 +331,7 @@
   auto* coord_var = Var("uniforms", ast::StorageClass::kUniform, s, nullptr,
                         ast::VariableDecorationList{
                             create<ast::BindingDecoration>(0),
-                            create<ast::SetDecoration>(1),
+                            create<ast::GroupDecoration>(1),
                         });
 
   mod->AddConstructedType(s);
@@ -386,7 +386,7 @@
       Var("coord", ast::StorageClass::kStorageBuffer, &ac, nullptr,
           ast::VariableDecorationList{
               create<ast::BindingDecoration>(0),
-              create<ast::SetDecoration>(1),
+              create<ast::GroupDecoration>(1),
           });
 
   td.RegisterVariableForTesting(coord_var);
@@ -434,7 +434,7 @@
           ast::VariableDecorationList{
               // decorations
               create<ast::BindingDecoration>(0),
-              create<ast::SetDecoration>(1),
+              create<ast::GroupDecoration>(1),
           });
 
   td.RegisterVariableForTesting(coord_var);
@@ -481,7 +481,7 @@
       Var("coord", ast::StorageClass::kStorageBuffer, &ac, nullptr,
           ast::VariableDecorationList{
               create<ast::BindingDecoration>(0),
-              create<ast::SetDecoration>(1),
+              create<ast::GroupDecoration>(1),
           });
 
   td.RegisterVariableForTesting(coord_var);
@@ -723,7 +723,7 @@
       Var("coord", ast::StorageClass::kUniform, ty.vec4<f32>(), nullptr,
           ast::VariableDecorationList{
               create<ast::BindingDecoration>(0),
-              create<ast::SetDecoration>(1),
+              create<ast::GroupDecoration>(1),
           });
 
   td.RegisterVariableForTesting(coord_var);
@@ -781,7 +781,7 @@
       Var("coord", ast::StorageClass::kStorageBuffer, &ac, nullptr,
           ast::VariableDecorationList{
               create<ast::BindingDecoration>(0),
-              create<ast::SetDecoration>(1),
+              create<ast::GroupDecoration>(1),
           });
 
   td.RegisterVariableForTesting(coord_var);
@@ -969,7 +969,7 @@
   // [[block]] struct Data {
   //   [[offset(0)]] d : f32;
   // };
-  // [[binding(0), set(0)]] var<storage_buffer> data : Data;
+  // [[binding(0), group(0)]] var<storage_buffer> data : Data;
   //
   // [[stage(compute)]]
   // fn a() -> void {
@@ -991,7 +991,7 @@
   auto* data_var = Var("data", ast::StorageClass::kStorageBuffer, &ac, nullptr,
                        ast::VariableDecorationList{
                            create<ast::BindingDecoration>(0),
-                           create<ast::SetDecoration>(0),
+                           create<ast::GroupDecoration>(0),
                        });
 
   mod->AddConstructedType(s);
diff --git a/src/writer/msl/generator_impl_function_test.cc b/src/writer/msl/generator_impl_function_test.cc
index 210d202..0c3cd3b 100644
--- a/src/writer/msl/generator_impl_function_test.cc
+++ b/src/writer/msl/generator_impl_function_test.cc
@@ -19,6 +19,7 @@
 #include "src/ast/call_expression.h"
 #include "src/ast/float_literal.h"
 #include "src/ast/function.h"
+#include "src/ast/group_decoration.h"
 #include "src/ast/identifier_expression.h"
 #include "src/ast/if_statement.h"
 #include "src/ast/location_decoration.h"
@@ -27,7 +28,6 @@
 #include "src/ast/pipeline_stage.h"
 #include "src/ast/return_statement.h"
 #include "src/ast/scalar_constructor_expression.h"
-#include "src/ast/set_decoration.h"
 #include "src/ast/sint_literal.h"
 #include "src/ast/stage_decoration.h"
 #include "src/ast/struct.h"
@@ -287,7 +287,7 @@
   auto* coord_var =
       Var("coord", ast::StorageClass::kUniform, ty.vec4<f32>(), nullptr,
           ast::VariableDecorationList{create<ast::BindingDecoration>(0),
-                                      create<ast::SetDecoration>(1)});
+                                      create<ast::GroupDecoration>(1)});
 
   td.RegisterVariableForTesting(coord_var);
 
@@ -336,7 +336,7 @@
   auto* coord_var =
       Var("coord", ast::StorageClass::kStorageBuffer, &ac, nullptr,
           ast::VariableDecorationList{create<ast::BindingDecoration>(0),
-                                      create<ast::SetDecoration>(1)});
+                                      create<ast::GroupDecoration>(1)});
 
   td.RegisterVariableForTesting(coord_var);
 
@@ -388,7 +388,7 @@
   auto* coord_var =
       Var("coord", ast::StorageClass::kStorageBuffer, &ac, nullptr,
           ast::VariableDecorationList{create<ast::BindingDecoration>(0),
-                                      create<ast::SetDecoration>(1)});
+                                      create<ast::GroupDecoration>(1)});
 
   td.RegisterVariableForTesting(coord_var);
   mod->AddGlobalVariable(coord_var);
@@ -629,7 +629,7 @@
   auto* coord_var =
       Var("coord", ast::StorageClass::kUniform, ty.vec4<f32>(), nullptr,
           ast::VariableDecorationList{create<ast::BindingDecoration>(0),
-                                      create<ast::SetDecoration>(1)});
+                                      create<ast::GroupDecoration>(1)});
 
   td.RegisterVariableForTesting(coord_var);
   mod->AddGlobalVariable(coord_var);
@@ -693,7 +693,7 @@
   auto* coord_var =
       Var("coord", ast::StorageClass::kStorageBuffer, &ac, nullptr,
           ast::VariableDecorationList{create<ast::BindingDecoration>(0),
-                                      create<ast::SetDecoration>(1)});
+                                      create<ast::GroupDecoration>(1)});
 
   td.RegisterVariableForTesting(coord_var);
   mod->AddGlobalVariable(coord_var);
@@ -760,7 +760,7 @@
   auto* coord_var =
       Var("coord", ast::StorageClass::kStorageBuffer, &ac, nullptr,
           ast::VariableDecorationList{create<ast::BindingDecoration>(0),
-                                      create<ast::SetDecoration>(1)});
+                                      create<ast::GroupDecoration>(1)});
 
   td.RegisterVariableForTesting(coord_var);
   mod->AddGlobalVariable(coord_var);
@@ -914,7 +914,7 @@
   // [[block]] struct Data {
   //   [[offset(0)]] d : f32;
   // };
-  // [[binding(0), set(0)]] var<storage_buffer> data : Data;
+  // [[binding(0), group(0)]] var<storage_buffer> data : Data;
   //
   // [[stage(compute)]]
   // fn a() -> void {
@@ -938,7 +938,7 @@
   auto* data_var =
       Var("data", ast::StorageClass::kStorageBuffer, &ac, nullptr,
           ast::VariableDecorationList{create<ast::BindingDecoration>(0),
-                                      create<ast::SetDecoration>(0)});
+                                      create<ast::GroupDecoration>(0)});
 
   mod->AddConstructedType(s);
   td.RegisterVariableForTesting(data_var);
diff --git a/src/writer/spirv/builder.cc b/src/writer/spirv/builder.cc
index e6d11fd..a37daf1 100644
--- a/src/writer/spirv/builder.cc
+++ b/src/writer/spirv/builder.cc
@@ -37,6 +37,7 @@
 #include "src/ast/else_statement.h"
 #include "src/ast/fallthrough_statement.h"
 #include "src/ast/float_literal.h"
+#include "src/ast/group_decoration.h"
 #include "src/ast/identifier_expression.h"
 #include "src/ast/if_statement.h"
 #include "src/ast/intrinsic.h"
@@ -46,7 +47,6 @@
 #include "src/ast/null_literal.h"
 #include "src/ast/return_statement.h"
 #include "src/ast/scalar_constructor_expression.h"
-#include "src/ast/set_decoration.h"
 #include "src/ast/sint_literal.h"
 #include "src/ast/struct.h"
 #include "src/ast/struct_member.h"
@@ -816,10 +816,10 @@
       push_annot(spv::Op::OpDecorate,
                  {Operand::Int(var_id), Operand::Int(SpvDecorationBinding),
                   Operand::Int(binding->value())});
-    } else if (auto* set = deco->As<ast::SetDecoration>()) {
+    } else if (auto* group = deco->As<ast::GroupDecoration>()) {
       push_annot(spv::Op::OpDecorate, {Operand::Int(var_id),
                                        Operand::Int(SpvDecorationDescriptorSet),
-                                       Operand::Int(set->value())});
+                                       Operand::Int(group->value())});
     } else if (deco->Is<ast::ConstantIdDecoration>()) {
       // Spec constants are handled elsewhere
     } else {
diff --git a/src/writer/spirv/builder_function_test.cc b/src/writer/spirv/builder_function_test.cc
index a50017b..8c19bb3 100644
--- a/src/writer/spirv/builder_function_test.cc
+++ b/src/writer/spirv/builder_function_test.cc
@@ -198,7 +198,7 @@
   // [[block]] struct Data {
   //   [[offset(0)]] d : f32;
   // };
-  // [[binding(0), set(0)]] var<storage_buffer> data : Data;
+  // [[binding(0), group(0)]] var<storage_buffer> data : Data;
   //
   // [[stage(compute)]]
   // fn a() -> void {
@@ -222,7 +222,7 @@
   auto* data_var = Var("data", ast::StorageClass::kStorageBuffer, &ac, nullptr,
                        ast::VariableDecorationList{
                            create<ast::BindingDecoration>(0),
-                           create<ast::SetDecoration>(0),
+                           create<ast::GroupDecoration>(0),
                        });
 
   mod->AddConstructedType(s);
diff --git a/src/writer/spirv/builder_function_variable_test.cc b/src/writer/spirv/builder_function_variable_test.cc
index fef4b90..a113faa 100644
--- a/src/writer/spirv/builder_function_variable_test.cc
+++ b/src/writer/spirv/builder_function_variable_test.cc
@@ -20,9 +20,9 @@
 #include "src/ast/builtin.h"
 #include "src/ast/builtin_decoration.h"
 #include "src/ast/float_literal.h"
+#include "src/ast/group_decoration.h"
 #include "src/ast/location_decoration.h"
 #include "src/ast/scalar_constructor_expression.h"
-#include "src/ast/set_decoration.h"
 #include "src/ast/storage_class.h"
 #include "src/ast/struct.h"
 #include "src/ast/type/access_control_type.h"
diff --git a/src/writer/spirv/builder_global_variable_test.cc b/src/writer/spirv/builder_global_variable_test.cc
index 8d3585b..d05beb2 100644
--- a/src/writer/spirv/builder_global_variable_test.cc
+++ b/src/writer/spirv/builder_global_variable_test.cc
@@ -21,10 +21,10 @@
 #include "src/ast/builtin_decoration.h"
 #include "src/ast/constant_id_decoration.h"
 #include "src/ast/float_literal.h"
+#include "src/ast/group_decoration.h"
 #include "src/ast/location_decoration.h"
 #include "src/ast/module.h"
 #include "src/ast/scalar_constructor_expression.h"
-#include "src/ast/set_decoration.h"
 #include "src/ast/storage_class.h"
 #include "src/ast/struct.h"
 #include "src/ast/type/access_control_type.h"
@@ -194,11 +194,11 @@
 )");
 }
 
-TEST_F(BuilderTest, GlobalVar_WithBindingAndSet) {
+TEST_F(BuilderTest, GlobalVar_WithBindingAndGroup) {
   auto* v = Var("var", ast::StorageClass::kOutput, ty.f32, nullptr,
                 ast::VariableDecorationList{
                     create<ast::BindingDecoration>(2),
-                    create<ast::SetDecoration>(3),
+                    create<ast::GroupDecoration>(3),
                 });
 
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
diff --git a/src/writer/wgsl/generator_impl.cc b/src/writer/wgsl/generator_impl.cc
index aabb8fd..a0f2c6c 100644
--- a/src/writer/wgsl/generator_impl.cc
+++ b/src/writer/wgsl/generator_impl.cc
@@ -34,6 +34,7 @@
 #include "src/ast/continue_statement.h"
 #include "src/ast/else_statement.h"
 #include "src/ast/float_literal.h"
+#include "src/ast/group_decoration.h"
 #include "src/ast/identifier_expression.h"
 #include "src/ast/if_statement.h"
 #include "src/ast/location_decoration.h"
@@ -41,7 +42,6 @@
 #include "src/ast/member_accessor_expression.h"
 #include "src/ast/return_statement.h"
 #include "src/ast/scalar_constructor_expression.h"
-#include "src/ast/set_decoration.h"
 #include "src/ast/sint_literal.h"
 #include "src/ast/stage_decoration.h"
 #include "src/ast/statement.h"
@@ -620,8 +620,8 @@
 
     if (auto* binding = deco->As<ast::BindingDecoration>()) {
       out_ << "binding(" << binding->value() << ")";
-    } else if (auto* set = deco->As<ast::SetDecoration>()) {
-      out_ << "set(" << set->value() << ")";
+    } else if (auto* group = deco->As<ast::GroupDecoration>()) {
+      out_ << "group(" << group->value() << ")";
     } else if (auto* location = deco->As<ast::LocationDecoration>()) {
       out_ << "location(" << location->value() << ")";
     } else if (auto* builtin = deco->As<ast::BuiltinDecoration>()) {
diff --git a/src/writer/wgsl/generator_impl_function_test.cc b/src/writer/wgsl/generator_impl_function_test.cc
index 37d61cb..e3cf06e 100644
--- a/src/writer/wgsl/generator_impl_function_test.cc
+++ b/src/writer/wgsl/generator_impl_function_test.cc
@@ -153,7 +153,7 @@
   // [[block]] struct Data {
   //   [[offset(0)]] d : f32;
   // };
-  // [[binding(0), set(0)]] var<storage_buffer> data : Data;
+  // [[binding(0), group(0)]] var<storage_buffer> data : Data;
   //
   // [[stage(compute)]]
   // fn a() -> void {
@@ -178,7 +178,7 @@
                        ast::VariableDecorationList{
                            // decorations
                            create<ast::BindingDecoration>(0),
-                           create<ast::SetDecoration>(0),
+                           create<ast::GroupDecoration>(0),
                        });
 
   mod->AddConstructedType(s);
@@ -233,7 +233,7 @@
   d : f32;
 };
 
-[[binding(0), set(0)]] var<storage_buffer> data : [[access(read_write)]]
+[[binding(0), group(0)]] var<storage_buffer> data : [[access(read_write)]]
 Data;
 
 [[stage(compute)]]
diff --git a/src/writer/wgsl/generator_impl_variable_test.cc b/src/writer/wgsl/generator_impl_variable_test.cc
index 52a7542..501c880 100644
--- a/src/writer/wgsl/generator_impl_variable_test.cc
+++ b/src/writer/wgsl/generator_impl_variable_test.cc
@@ -18,8 +18,8 @@
 #include "src/ast/binding_decoration.h"
 #include "src/ast/builtin_decoration.h"
 #include "src/ast/constant_id_decoration.h"
+#include "src/ast/group_decoration.h"
 #include "src/ast/location_decoration.h"
-#include "src/ast/set_decoration.h"
 #include "src/ast/type/f32_type.h"
 #include "src/ast/variable.h"
 #include "src/ast/variable_decoration.h"
@@ -65,7 +65,7 @@
                 ast::VariableDecorationList{
                     create<ast::BuiltinDecoration>(ast::Builtin::kPosition),
                     create<ast::BindingDecoration>(0),
-                    create<ast::SetDecoration>(1),
+                    create<ast::GroupDecoration>(1),
                     create<ast::LocationDecoration>(2),
                     create<ast::ConstantIdDecoration>(42),
                 });
@@ -73,7 +73,7 @@
   ASSERT_TRUE(gen.EmitVariable(v)) << gen.error();
   EXPECT_EQ(
       gen.result(),
-      R"([[builtin(position), binding(0), set(1), location(2), constant_id(42)]] var a : f32;
+      R"([[builtin(position), binding(0), group(1), location(2), constant_id(42)]] var a : f32;
 )");
 }
 
diff --git a/test/compute_boids.wgsl b/test/compute_boids.wgsl
index 9b0059e..db76200 100644
--- a/test/compute_boids.wgsl
+++ b/test/compute_boids.wgsl
@@ -56,9 +56,9 @@
   [[offset(0)]] particles : [[stride(16)]] array<Particle, 5>;
 };
 
-[[binding(0), set(0)]] var<uniform> params : [[access(read)]] SimParams;
-[[binding(1), set(0)]] var<storage_buffer> particlesA : [[access(read_write)]] Particles;
-[[binding(2), set(0)]] var<storage_buffer> particlesB : [[access(read_write)]] Particles;
+[[binding(0), group(0)]] var<uniform> params : [[access(read)]] SimParams;
+[[binding(1), group(0)]] var<storage_buffer> particlesA : [[access(read_write)]] Particles;
+[[binding(2), group(0)]] var<storage_buffer> particlesB : [[access(read_write)]] Particles;
 
 [[builtin(global_invocation_id)]] var<in> gl_GlobalInvocationID : vec3<u32>;
 
diff --git a/test/cube.wgsl b/test/cube.wgsl
index 0e0377b..908756c 100644
--- a/test/cube.wgsl
+++ b/test/cube.wgsl
@@ -17,7 +17,7 @@
   [[offset(0)]] modelViewProjectionMatrix : mat4x4<f32>;
 };
 
-[[binding(0), set(0)]] var<uniform> uniforms : [[access(read)]] Uniforms;
+[[binding(0), group(0)]] var<uniform> uniforms : [[access(read)]] Uniforms;
 
 [[location(0)]] var<in> cur_position : vec4<f32>;
 [[location(1)]] var<in> color : vec4<f32>;