From c76ec15b4589ba5359789027e78951958102dfe1 Mon Sep 17 00:00:00 2001 From: Ben Clayton Date: Thu, 8 Apr 2021 18:11:27 +0000 Subject: [PATCH] reader/wgsl: Add deprecation warning for [[offset]] Bug: tint:626 Change-Id: I3e1074bbf104d73c3a2f71234ff7821d0481ad1a Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/47142 Commit-Queue: Ben Clayton Reviewed-by: David Neto --- src/reader/wgsl/parser_impl.cc | 3 + ...rser_impl_struct_member_decoration_test.cc | 136 +++++++++++++++++- 2 files changed, 134 insertions(+), 5 deletions(-) diff --git a/src/reader/wgsl/parser_impl.cc b/src/reader/wgsl/parser_impl.cc index 79a733503d..aa070f93d0 100644 --- a/src/reader/wgsl/parser_impl.cc +++ b/src/reader/wgsl/parser_impl.cc @@ -2964,6 +2964,9 @@ Maybe ParserImpl::decoration() { } if (s == kOffsetDecoration) { + deprecated(t.source(), + "[[offset]] has been replaced with [[size]] and [[align]]"); + const char* use = "offset decoration"; return expect_paren_block(use, [&]() -> Result { auto val = expect_positive_sint(use); diff --git a/src/reader/wgsl/parser_impl_struct_member_decoration_test.cc b/src/reader/wgsl/parser_impl_struct_member_decoration_test.cc index fdee0f508b..d62538e922 100644 --- a/src/reader/wgsl/parser_impl_struct_member_decoration_test.cc +++ b/src/reader/wgsl/parser_impl_struct_member_decoration_test.cc @@ -42,7 +42,10 @@ TEST_F(ParserImplTest, Decoration_Offset_MissingLeftParen) { EXPECT_TRUE(deco.errored); EXPECT_EQ(deco.value, nullptr); EXPECT_TRUE(p->has_error()); - EXPECT_EQ(p->error(), "1:8: expected '(' for offset decoration"); + EXPECT_EQ( + p->error(), + R"(1:1: use of deprecated language feature: [[offset]] has been replaced with [[size]] and [[align]] +1:8: expected '(' for offset decoration)"); } TEST_F(ParserImplTest, Decoration_Offset_MissingRightParen) { @@ -52,7 +55,10 @@ TEST_F(ParserImplTest, Decoration_Offset_MissingRightParen) { EXPECT_TRUE(deco.errored); EXPECT_EQ(deco.value, nullptr); EXPECT_TRUE(p->has_error()); - EXPECT_EQ(p->error(), "1:9: expected ')' for offset decoration"); + EXPECT_EQ( + p->error(), + R"(1:1: use of deprecated language feature: [[offset]] has been replaced with [[size]] and [[align]] +1:9: expected ')' for offset decoration)"); } TEST_F(ParserImplTest, Decoration_Offset_MissingValue) { @@ -62,8 +68,10 @@ TEST_F(ParserImplTest, Decoration_Offset_MissingValue) { EXPECT_TRUE(deco.errored); EXPECT_EQ(deco.value, nullptr); EXPECT_TRUE(p->has_error()); - EXPECT_EQ(p->error(), - "1:8: expected signed integer literal for offset decoration"); + EXPECT_EQ( + p->error(), + R"(1:1: use of deprecated language feature: [[offset]] has been replaced with [[size]] and [[align]] +1:8: expected signed integer literal for offset decoration)"); } TEST_F(ParserImplTest, Decoration_Offset_MissingInvalid) { @@ -73,8 +81,126 @@ TEST_F(ParserImplTest, Decoration_Offset_MissingInvalid) { EXPECT_TRUE(deco.errored); EXPECT_EQ(deco.value, nullptr); EXPECT_TRUE(p->has_error()); + EXPECT_EQ( + p->error(), + R"(1:1: use of deprecated language feature: [[offset]] has been replaced with [[size]] and [[align]] +1:8: expected signed integer literal for offset decoration)"); +} + +TEST_F(ParserImplTest, Decoration_Size) { + auto p = parser("size(4)"); + auto deco = p->decoration(); + EXPECT_TRUE(deco.matched); + EXPECT_FALSE(deco.errored); + ASSERT_NE(deco.value, nullptr); + ASSERT_FALSE(p->has_error()); + + auto* member_deco = deco.value->As(); + ASSERT_NE(member_deco, nullptr); + ASSERT_TRUE(member_deco->Is()); + + auto* o = member_deco->As(); + EXPECT_EQ(o->size(), 4u); +} + +TEST_F(ParserImplTest, Decoration_Size_MissingLeftParen) { + auto p = parser("size 4)"); + 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 size decoration"); +} + +TEST_F(ParserImplTest, Decoration_Size_MissingRightParen) { + auto p = parser("size(4"); + 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:7: expected ')' for size decoration"); +} + +TEST_F(ParserImplTest, Decoration_Size_MissingValue) { + auto p = parser("size()"); + 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:8: expected signed integer literal for offset decoration"); + "1:6: expected signed integer literal for size decoration"); +} + +TEST_F(ParserImplTest, Decoration_Size_MissingInvalid) { + auto p = parser("size(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:6: expected signed integer literal for size decoration"); +} + +TEST_F(ParserImplTest, Decoration_Align) { + auto p = parser("align(4)"); + auto deco = p->decoration(); + EXPECT_TRUE(deco.matched); + EXPECT_FALSE(deco.errored); + ASSERT_NE(deco.value, nullptr); + ASSERT_FALSE(p->has_error()); + + auto* member_deco = deco.value->As(); + ASSERT_NE(member_deco, nullptr); + ASSERT_TRUE(member_deco->Is()); + + auto* o = member_deco->As(); + EXPECT_EQ(o->align(), 4u); +} + +TEST_F(ParserImplTest, Decoration_Align_MissingLeftParen) { + auto p = parser("align 4)"); + 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:7: expected '(' for align decoration"); +} + +TEST_F(ParserImplTest, Decoration_Align_MissingRightParen) { + auto p = parser("align(4"); + 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:8: expected ')' for align decoration"); +} + +TEST_F(ParserImplTest, Decoration_Align_MissingValue) { + auto p = parser("align()"); + 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:7: expected signed integer literal for align decoration"); +} + +TEST_F(ParserImplTest, Decoration_Align_MissingInvalid) { + auto p = parser("align(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:7: expected signed integer literal for align decoration"); } } // namespace