reader/wgsl: Deprecate the [[block]] attribute

Bug: tint:1324
Change-Id: Ic8e9cd4a2e924498397659b5d23d6ac6d602588d
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/72088
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
diff --git a/docs/origin-trial-changes.md b/docs/origin-trial-changes.md
index 154c510..100dac5 100644
--- a/docs/origin-trial-changes.md
+++ b/docs/origin-trial-changes.md
@@ -11,6 +11,7 @@
 ### Deprecated Features
 
 * The `isNan()`, `isInf()`, `isFinite()` and `isNormal()` builtins has been deprecated and will be removed in M101. [tint:1312](https://crbug.com/tint/1312)
+* The `[[block]]` attribute has been deprecated and will be removed in M101. [tint:1324](https://crbug.com/tint/1324)
 
 ### New Features
 
diff --git a/src/reader/wgsl/parser_impl.cc b/src/reader/wgsl/parser_impl.cc
index 6845fbd..9112b18 100644
--- a/src/reader/wgsl/parser_impl.cc
+++ b/src/reader/wgsl/parser_impl.cc
@@ -3133,6 +3133,7 @@
   }
 
   if (s == kBlockDecoration) {
+    deprecated(t.source(), "[[block]] attributes have been removed from WGSL");
     return create<ast::StructBlockDecoration>(t.source());
   }
 
diff --git a/src/reader/wgsl/parser_impl_error_msg_test.cc b/src/reader/wgsl/parser_impl_error_msg_test.cc
index 79ab884..7c1d391 100644
--- a/src/reader/wgsl/parser_impl_error_msg_test.cc
+++ b/src/reader/wgsl/parser_impl_error_msg_test.cc
@@ -52,10 +52,10 @@
 }
 
 TEST_F(ParserImplErrorTest, AliasDeclInvalidDeco) {
-  EXPECT("[[block]]type e=u32;",
+  EXPECT("[[override]]type e=u32;",
          "test.wgsl:1:3 error: unexpected decorations\n"
-         "[[block]]type e=u32;\n"
-         "  ^^^^^\n");
+         "[[override]]type e=u32;\n"
+         "  ^^^^^^^^\n");
 }
 
 TEST_F(ParserImplErrorTest, IndexExprInvalidExpr) {
@@ -605,15 +605,25 @@
          "                           ^\n");
 }
 
+// TODO(crbug.com/tint/1324): DEPRECATED: Remove when [[block]] is removed.
 TEST_F(ParserImplErrorTest, GlobalDeclStructDecoMissingStruct) {
   EXPECT("[[block]];",
+         "test.wgsl:1:3 warning: use of deprecated language feature: [[block]] "
+         "attributes have been removed from WGSL\n"
+         "[[block]];\n"
+         "  ^^^^^\n\n"
          "test.wgsl:1:10 error: expected declaration after decorations\n"
          "[[block]];\n"
          "         ^\n");
 }
 
+// TODO(crbug.com/tint/1324): DEPRECATED: Remove when [[block]] is removed.
 TEST_F(ParserImplErrorTest, GlobalDeclStructDecoMissingEnd) {
   EXPECT("[[block struct {};",
+         "test.wgsl:1:3 warning: use of deprecated language feature: [[block]] "
+         "attributes have been removed from WGSL\n"
+         "[[block struct {};\n"
+         "  ^^^^^\n\n"
          "test.wgsl:1:9 error: expected ']]' for decoration list\n"
          "[[block struct {};\n"
          "        ^^^^^^\n");
diff --git a/src/reader/wgsl/parser_impl_global_decl_test.cc b/src/reader/wgsl/parser_impl_global_decl_test.cc
index ff21c57..175947c 100644
--- a/src/reader/wgsl/parser_impl_global_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_global_decl_test.cc
@@ -193,6 +193,7 @@
   ASSERT_EQ(stride->As<ast::StrideDecoration>()->stride, 4u);
 }
 
+// TODO(crbug.com/tint/1324): DEPRECATED: Remove when [[block]] is removed.
 TEST_F(ParserImplTest, GlobalDecl_Struct_WithDecoration) {
   auto p = parser("[[block]] struct A { data: f32; };");
   p->expect_global_decl();
@@ -211,17 +212,17 @@
 }
 
 TEST_F(ParserImplTest, GlobalDecl_Struct_Invalid) {
-  auto p = parser("[[block]] A {};");
+  auto p = parser("A {};");
   p->expect_global_decl();
   ASSERT_TRUE(p->has_error());
-  EXPECT_EQ(p->error(), "1:11: expected declaration after decorations");
+  EXPECT_EQ(p->error(), "1:1: unexpected token");
 }
 
 TEST_F(ParserImplTest, GlobalDecl_StructMissing_Semi) {
-  auto p = parser("[[block]] struct A {}");
+  auto p = parser("struct A {}");
   p->expect_global_decl();
   ASSERT_TRUE(p->has_error());
-  EXPECT_EQ(p->error(), "1:22: expected ';' for struct declaration");
+  EXPECT_EQ(p->error(), "1:12: expected ';' for struct declaration");
 }
 
 }  // namespace
diff --git a/src/reader/wgsl/parser_impl_struct_decl_test.cc b/src/reader/wgsl/parser_impl_struct_decl_test.cc
index 4f041b5..8d411ff 100644
--- a/src/reader/wgsl/parser_impl_struct_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_struct_decl_test.cc
@@ -139,6 +139,7 @@
   EXPECT_EQ(p->error(), "1:10: expected '{' for struct declaration");
 }
 
+// TODO(crbug.com/tint/1324): DEPRECATED: Remove when [[block]] is removed.
 TEST_F(ParserImplTest, StructDecl_InvalidDecorationDecl) {
   auto p = parser("[[block struct S { a : i32; }");
   auto decos = p->decoration_list();
@@ -151,9 +152,13 @@
   EXPECT_NE(s.value, nullptr);
 
   EXPECT_TRUE(p->has_error());
-  EXPECT_EQ(p->error(), "1:9: expected ']]' for decoration list");
+  EXPECT_EQ(
+      p->error(),
+      R"(1:3: use of deprecated language feature: [[block]] attributes have been removed from WGSL
+1:9: expected ']]' for decoration list)");
 }
 
+// TODO(crbug.com/tint/1324): DEPRECATED: Remove when [[block]] is removed.
 TEST_F(ParserImplTest, StructDecl_MissingStruct) {
   auto p = parser("[[block]] S {}");
   auto decos = p->decoration_list();
diff --git a/src/reader/wgsl/parser_impl_struct_decoration_decl_test.cc b/src/reader/wgsl/parser_impl_struct_decoration_decl_test.cc
index 05eb0fc..655bb19 100644
--- a/src/reader/wgsl/parser_impl_struct_decoration_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_struct_decoration_decl_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/ast/struct_block_decoration.h"
+#include "src/ast/override_decoration.h"
 #include "src/reader/wgsl/parser_impl_test_helper.h"
 
 namespace tint {
@@ -21,24 +21,24 @@
 namespace {
 
 TEST_F(ParserImplTest, DecorationDecl_Parses) {
-  auto p = parser("[[block]]");
+  auto p = parser("[[override]]");
   auto decos = p->decoration_list();
   EXPECT_FALSE(p->has_error());
   EXPECT_FALSE(decos.errored);
   EXPECT_TRUE(decos.matched);
   ASSERT_EQ(decos.value.size(), 1u);
-  auto* struct_deco = decos.value[0]->As<ast::Decoration>();
-  EXPECT_TRUE(struct_deco->Is<ast::StructBlockDecoration>());
+  auto* override_deco = decos.value[0]->As<ast::Decoration>();
+  EXPECT_TRUE(override_deco->Is<ast::OverrideDecoration>());
 }
 
 TEST_F(ParserImplTest, DecorationDecl_MissingAttrRight) {
-  auto p = parser("[[block");
+  auto p = parser("[[override");
   auto decos = p->decoration_list();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(decos.errored);
   EXPECT_FALSE(decos.matched);
   EXPECT_TRUE(decos.value.empty());
-  EXPECT_EQ(p->error(), "1:8: expected ']]' for decoration list");
+  EXPECT_EQ(p->error(), "1:11: expected ']]' for decoration list");
 }
 
 TEST_F(ParserImplTest, DecorationDecl_InvalidDecoration) {