wsgl parser: Migrate more code to use expect & match
Reduces code. Keeps things more consistent.
Bug: tint:282
Change-Id: Iff280880eb033fbcee4c6095c2da2d4af06835b5
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/32103
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/reader/wgsl/parser_impl.cc b/src/reader/wgsl/parser_impl.cc
index a312d1d..52aba79 100644
--- a/src/reader/wgsl/parser_impl.cc
+++ b/src/reader/wgsl/parser_impl.cc
@@ -375,25 +375,21 @@
auto dim = sampled_texture_type();
if (dim != ast::type::TextureDimension::kNone) {
- auto t = next();
- if (!t.IsLessThan()) {
- add_error(peek(), "missing '<' for sampled texture type");
+ const char* use = "sampled texture type";
+
+ if (!expect(use, Token::Type::kLessThan))
return nullptr;
- }
auto* subtype = type_decl();
if (has_error())
return nullptr;
if (subtype == nullptr) {
- add_error(peek(), "invalid subtype for sampled texture type");
+ add_error(peek().source(), "invalid subtype", use);
return nullptr;
}
- t = next();
- if (!t.IsGreaterThan()) {
- add_error(peek(), "missing '>' for sampled texture type");
+ if (!expect(use, Token::Type::kGreaterThan))
return nullptr;
- }
return ctx_.type_mgr().Get(
std::make_unique<ast::type::SampledTextureType>(dim, subtype));
@@ -401,25 +397,21 @@
dim = multisampled_texture_type();
if (dim != ast::type::TextureDimension::kNone) {
- auto t = next();
- if (!t.IsLessThan()) {
- add_error(peek(), "missing '<' for multisampled texture type");
+ const char* use = "multisampled texture type";
+
+ if (!expect(use, Token::Type::kLessThan))
return nullptr;
- }
auto* subtype = type_decl();
if (has_error())
return nullptr;
if (subtype == nullptr) {
- add_error(peek(), "invalid subtype for multisampled texture type");
+ add_error(peek().source(), "invalid subtype", use);
return nullptr;
}
- t = next();
- if (!t.IsGreaterThan()) {
- add_error(peek(), "missing '>' for multisampled texture type");
+ if (!expect(use, Token::Type::kGreaterThan))
return nullptr;
- }
return ctx_.type_mgr().Get(
std::make_unique<ast::type::MultisampledTextureType>(dim, subtype));
@@ -429,25 +421,21 @@
ast::AccessControl access;
std::tie(storage_dim, access) = storage_texture_type();
if (storage_dim != ast::type::TextureDimension::kNone) {
- auto t = next();
- if (!t.IsLessThan()) {
- add_error(peek(), "missing '<' for storage texture type");
+ const char* use = "storage texture type";
+
+ if (!expect(use, Token::Type::kLessThan))
return nullptr;
- }
auto format = image_storage_type();
if (has_error())
return nullptr;
if (format == ast::type::ImageFormat::kNone) {
- add_error(peek(), "invalid format for storage texture type");
+ add_error(peek().source(), "invalid format", use);
return nullptr;
}
- t = next();
- if (!t.IsGreaterThan()) {
- add_error(peek(), "missing '>' for storage texture type");
+ if (!expect(use, Token::Type::kGreaterThan))
return nullptr;
- }
return ctx_.type_mgr().Get(std::make_unique<ast::type::StorageTextureType>(
storage_dim, access, format));
@@ -779,11 +767,8 @@
if (has_error())
return sc;
- auto t = next();
- if (!t.IsGreaterThan()) {
- add_error(t, "missing > for variable decoration");
+ if (!expect(use, Token::Type::kGreaterThan))
return ast::StorageClass::kNone;
- }
return sc;
}
@@ -847,8 +832,7 @@
// | texture_sampler_types
ast::type::Type* ParserImpl::type_decl() {
auto t = peek();
- if (t.IsIdentifier()) {
- next(); // Consume the peek
+ if (match(Token::Type::kIdentifier)) {
auto* ty = get_constructed(t.to_str());
if (ty == nullptr) {
add_error(t, "unknown constructed type '" + t.to_str() + "'");
@@ -856,28 +840,24 @@
}
return ty;
}
- if (t.IsBool()) {
- next(); // Consume the peek
+
+ if (match(Token::Type::kBool))
return ctx_.type_mgr().Get(std::make_unique<ast::type::BoolType>());
- }
- if (t.IsF32()) {
- next(); // Consume the peek
+
+ if (match(Token::Type::kF32))
return ctx_.type_mgr().Get(std::make_unique<ast::type::F32Type>());
- }
- if (t.IsI32()) {
- next(); // Consume the peek
+
+ if (match(Token::Type::kI32))
return ctx_.type_mgr().Get(std::make_unique<ast::type::I32Type>());
- }
- if (t.IsU32()) {
- next(); // Consume the peek
+
+ if (match(Token::Type::kU32))
return ctx_.type_mgr().Get(std::make_unique<ast::type::U32Type>());
- }
- if (t.IsVec2() || t.IsVec3() || t.IsVec4()) {
+
+ if (t.IsVec2() || t.IsVec3() || t.IsVec4())
return expect_type_decl_vector(t);
- }
- if (t.IsPtr()) {
- return expect_type_decl_pointer(t);
- }
+
+ if (match(Token::Type::kPtr))
+ return expect_type_decl_pointer();
auto decos = decoration_list();
if (has_error())
@@ -907,26 +887,18 @@
return nullptr;
}
-ast::type::Type* ParserImpl::expect_type_decl_pointer(Token t) {
- next(); // Consume the peek
-
+ast::type::Type* ParserImpl::expect_type_decl_pointer() {
const char* use = "ptr declaration";
- t = next();
- if (!t.IsLessThan()) {
- add_error(t, "missing < for ptr declaration");
+ if (!expect(use, Token::Type::kLessThan))
return nullptr;
- }
auto sc = expect_storage_class(use);
if (has_error())
return nullptr;
- t = next();
- if (!t.IsComma()) {
- add_error(t, "missing , for ptr declaration");
+ if (!expect(use, Token::Type::kComma))
return nullptr;
- }
auto* subtype = type_decl();
if (has_error())
@@ -936,11 +908,8 @@
return nullptr;
}
- t = next();
- if (!t.IsGreaterThan()) {
- add_error(t, "missing > for ptr declaration");
+ if (!expect(use, Token::Type::kGreaterThan))
return nullptr;
- }
return ctx_.type_mgr().Get(
std::make_unique<ast::type::PointerType>(subtype, sc));
@@ -955,25 +924,21 @@
else if (t.IsVec4())
count = 4;
- t = next();
- if (!t.IsLessThan()) {
- add_error(t, "missing < for vector");
+ const char* use = "vector";
+
+ if (!expect(use, Token::Type::kLessThan))
return nullptr;
- }
auto* subtype = type_decl();
if (has_error())
return nullptr;
if (subtype == nullptr) {
- add_error(peek(), "unable to determine subtype for vector");
+ add_error(peek().source(), "unable to determine subtype", use);
return nullptr;
}
- t = next();
- if (!t.IsGreaterThan()) {
- add_error(t, "missing > for vector");
+ if (!expect(use, Token::Type::kGreaterThan))
return nullptr;
- }
return ctx_.type_mgr().Get(
std::make_unique<ast::type::VectorType>(subtype, count));
@@ -2128,13 +2093,7 @@
ast::ExpressionList ret;
ret.push_back(std::move(arg));
- for (;;) {
- auto t = peek();
- if (!t.IsComma())
- break;
-
- next(); // Consume the peek
-
+ while (match(Token::Type::kComma)) {
arg = logical_or_expression();
if (has_error())
return {};
@@ -2618,45 +2577,24 @@
// | FALSE
std::unique_ptr<ast::Literal> ParserImpl::const_literal() {
auto t = peek();
- if (t.IsTrue()) {
- next(); // Consume the peek
-
+ if (match(Token::Type::kTrue)) {
auto* type = ctx_.type_mgr().Get(std::make_unique<ast::type::BoolType>());
- if (!type) {
- return nullptr;
- }
return std::make_unique<ast::BoolLiteral>(type, true);
}
- if (t.IsFalse()) {
- next(); // Consume the peek
+ if (match(Token::Type::kFalse)) {
auto* type = ctx_.type_mgr().Get(std::make_unique<ast::type::BoolType>());
- if (!type) {
- return nullptr;
- }
return std::make_unique<ast::BoolLiteral>(type, false);
}
- if (t.IsSintLiteral()) {
- next(); // Consume the peek
+ if (match(Token::Type::kSintLiteral)) {
auto* type = ctx_.type_mgr().Get(std::make_unique<ast::type::I32Type>());
- if (!type) {
- return nullptr;
- }
return std::make_unique<ast::SintLiteral>(type, t.to_i32());
}
- if (t.IsUintLiteral()) {
- next(); // Consume the peek
+ if (match(Token::Type::kUintLiteral)) {
auto* type = ctx_.type_mgr().Get(std::make_unique<ast::type::U32Type>());
- if (!type) {
- return nullptr;
- }
return std::make_unique<ast::UintLiteral>(type, t.to_u32());
}
- if (t.IsFloatLiteral()) {
- next(); // Consume the peek
+ if (match(Token::Type::kFloatLiteral)) {
auto* type = ctx_.type_mgr().Get(std::make_unique<ast::type::F32Type>());
- if (!type) {
- return nullptr;
- }
return std::make_unique<ast::FloatLiteral>(type, t.to_f32());
}
return nullptr;
diff --git a/src/reader/wgsl/parser_impl.h b/src/reader/wgsl/parser_impl.h
index ba008bb..5e1b941 100644
--- a/src/reader/wgsl/parser_impl.h
+++ b/src/reader/wgsl/parser_impl.h
@@ -544,7 +544,7 @@
/// Used to ensure that all decorations are consumed.
bool expect_decorations_consumed(const ast::DecorationList& list);
- ast::type::Type* expect_type_decl_pointer(Token t);
+ ast::type::Type* expect_type_decl_pointer();
ast::type::Type* expect_type_decl_vector(Token t);
ast::type::Type* expect_type_decl_array(ast::ArrayDecorationList decos);
ast::type::Type* expect_type_decl_matrix(Token t);
diff --git a/src/reader/wgsl/parser_impl_error_msg_test.cc b/src/reader/wgsl/parser_impl_error_msg_test.cc
index 163219c..222134e 100644
--- a/src/reader/wgsl/parser_impl_error_msg_test.cc
+++ b/src/reader/wgsl/parser_impl_error_msg_test.cc
@@ -534,16 +534,16 @@
TEST_F(ParserImplErrorTest, GlobalDeclSampledTextureMissingLessThan_Old) {
EXPECT("var x : texture_sampled_1d;",
- "test.wgsl:1:28 error: missing '<' for sampled texture type\n"
+ "test.wgsl:1:27 error: expected '<' for sampled texture type\n"
"var x : texture_sampled_1d;\n"
- " ^\n");
+ " ^\n");
}
TEST_F(ParserImplErrorTest, GlobalDeclSampledTextureMissingGreaterThan_Old) {
EXPECT("var x : texture_sampled_1d<f32;",
- "test.wgsl:1:32 error: missing '>' for sampled texture type\n"
+ "test.wgsl:1:31 error: expected '>' for sampled texture type\n"
"var x : texture_sampled_1d<f32;\n"
- " ^\n");
+ " ^\n");
}
TEST_F(ParserImplErrorTest, GlobalDeclSampledTextureInvalidSubtype_Old) {
@@ -555,16 +555,16 @@
TEST_F(ParserImplErrorTest, GlobalDeclSampledTextureMissingLessThan) {
EXPECT("var x : texture_1d;",
- "test.wgsl:1:20 error: missing '<' for sampled texture type\n"
+ "test.wgsl:1:19 error: expected '<' for sampled texture type\n"
"var x : texture_1d;\n"
- " ^\n");
+ " ^\n");
}
TEST_F(ParserImplErrorTest, GlobalDeclSampledTextureMissingGreaterThan) {
EXPECT("var x : texture_1d<f32;",
- "test.wgsl:1:24 error: missing '>' for sampled texture type\n"
+ "test.wgsl:1:23 error: expected '>' for sampled texture type\n"
"var x : texture_1d<f32;\n"
- " ^\n");
+ " ^\n");
}
TEST_F(ParserImplErrorTest, GlobalDeclSampledTextureInvalidSubtype) {
@@ -576,16 +576,16 @@
TEST_F(ParserImplErrorTest, GlobalDeclMultisampledTextureMissingLessThan) {
EXPECT("var x : texture_multisampled_2d;",
- "test.wgsl:1:33 error: missing '<' for multisampled texture type\n"
+ "test.wgsl:1:32 error: expected '<' for multisampled texture type\n"
"var x : texture_multisampled_2d;\n"
- " ^\n");
+ " ^\n");
}
TEST_F(ParserImplErrorTest, GlobalDeclMultisampledTextureMissingGreaterThan) {
EXPECT("var x : texture_multisampled_2d<f32;",
- "test.wgsl:1:37 error: missing '>' for multisampled texture type\n"
+ "test.wgsl:1:36 error: expected '>' for multisampled texture type\n"
"var x : texture_multisampled_2d<f32;\n"
- " ^\n");
+ " ^\n");
}
TEST_F(ParserImplErrorTest, GlobalDeclMultisampledTextureInvalidSubtype) {
@@ -597,16 +597,16 @@
TEST_F(ParserImplErrorTest, GlobalDeclStorageTextureMissingLessThan_Old) {
EXPECT("var x : texture_ro_2d;",
- "test.wgsl:1:23 error: missing '<' for storage texture type\n"
+ "test.wgsl:1:22 error: expected '<' for storage texture type\n"
"var x : texture_ro_2d;\n"
- " ^\n");
+ " ^\n");
}
TEST_F(ParserImplErrorTest, GlobalDeclStorageTextureMissingGreaterThan_Old) {
EXPECT("var x : texture_ro_2d<r8uint;",
- "test.wgsl:1:30 error: missing '>' for storage texture type\n"
+ "test.wgsl:1:29 error: expected '>' for storage texture type\n"
"var x : texture_ro_2d<r8uint;\n"
- " ^\n");
+ " ^\n");
}
TEST_F(ParserImplErrorTest, GlobalDeclStorageTextureMissingInvalidSubtype_Old) {
@@ -618,16 +618,16 @@
TEST_F(ParserImplErrorTest, GlobalDeclStorageTextureMissingLessThan) {
EXPECT("var x : texture_storage_ro_2d;",
- "test.wgsl:1:31 error: missing '<' for storage texture type\n"
+ "test.wgsl:1:30 error: expected '<' for storage texture type\n"
"var x : texture_storage_ro_2d;\n"
- " ^\n");
+ " ^\n");
}
TEST_F(ParserImplErrorTest, GlobalDeclStorageTextureMissingGreaterThan) {
EXPECT("var x : texture_storage_ro_2d<r8uint;",
- "test.wgsl:1:38 error: missing '>' for storage texture type\n"
+ "test.wgsl:1:37 error: expected '>' for storage texture type\n"
"var x : texture_storage_ro_2d<r8uint;\n"
- " ^\n");
+ " ^\n");
}
TEST_F(ParserImplErrorTest, GlobalDeclStorageTextureMissingSubtype) {
@@ -1023,21 +1023,21 @@
TEST_F(ParserImplErrorTest, GlobalDeclVarPtrMissingLessThan) {
EXPECT("var i : ptr;",
- "test.wgsl:1:12 error: missing < for ptr declaration\n"
+ "test.wgsl:1:12 error: expected '<' for ptr declaration\n"
"var i : ptr;\n"
" ^\n");
}
TEST_F(ParserImplErrorTest, GlobalDeclVarPtrMissingGreaterThan) {
EXPECT("var i : ptr<in, u32;",
- "test.wgsl:1:20 error: missing > for ptr declaration\n"
+ "test.wgsl:1:20 error: expected '>' for ptr declaration\n"
"var i : ptr<in, u32;\n"
" ^\n");
}
TEST_F(ParserImplErrorTest, GlobalDeclVarPtrMissingComma) {
EXPECT("var i : ptr<in u32>;",
- "test.wgsl:1:16 error: missing , for ptr declaration\n"
+ "test.wgsl:1:16 error: expected ',' for ptr declaration\n"
"var i : ptr<in u32>;\n"
" ^^^\n");
}
@@ -1065,21 +1065,21 @@
TEST_F(ParserImplErrorTest, GlobalDeclVarStorageDeclMissingGThan) {
EXPECT("var<in i : i32",
- "test.wgsl:1:8 error: missing > for variable decoration\n"
+ "test.wgsl:1:8 error: expected '>' for variable decoration\n"
"var<in i : i32\n"
" ^\n");
}
TEST_F(ParserImplErrorTest, GlobalDeclVarVectorMissingLessThan) {
EXPECT("var i : vec3;",
- "test.wgsl:1:13 error: missing < for vector\n"
+ "test.wgsl:1:13 error: expected '<' for vector\n"
"var i : vec3;\n"
" ^\n");
}
TEST_F(ParserImplErrorTest, GlobalDeclVarVectorMissingGreaterThan) {
EXPECT("var i : vec3<u32;",
- "test.wgsl:1:17 error: missing > for vector\n"
+ "test.wgsl:1:17 error: expected '>' for vector\n"
"var i : vec3<u32;\n"
" ^\n");
}
diff --git a/src/reader/wgsl/parser_impl_texture_sampler_types_test.cc b/src/reader/wgsl/parser_impl_texture_sampler_types_test.cc
index ea04f55..0e82af0 100644
--- a/src/reader/wgsl/parser_impl_texture_sampler_types_test.cc
+++ b/src/reader/wgsl/parser_impl_texture_sampler_types_test.cc
@@ -113,7 +113,7 @@
auto* t = p->texture_sampler_types();
ASSERT_TRUE(p->has_error());
EXPECT_EQ(t, nullptr);
- EXPECT_EQ(p->error(), "1:19: missing '<' for sampled texture type");
+ EXPECT_EQ(p->error(), "1:19: expected '<' for sampled texture type");
}
TEST_F(ParserImplTest,
@@ -122,7 +122,7 @@
auto* t = p->texture_sampler_types();
ASSERT_TRUE(p->has_error());
EXPECT_EQ(t, nullptr);
- EXPECT_EQ(p->error(), "1:23: missing '>' for sampled texture type");
+ EXPECT_EQ(p->error(), "1:23: expected '>' for sampled texture type");
}
TEST_F(ParserImplTest, TextureSamplerTypes_SampledTexture_F32) {
@@ -179,7 +179,7 @@
auto* t = p->texture_sampler_types();
ASSERT_TRUE(p->has_error());
EXPECT_EQ(t, nullptr);
- EXPECT_EQ(p->error(), "1:11: missing '<' for sampled texture type");
+ EXPECT_EQ(p->error(), "1:11: expected '<' for sampled texture type");
}
TEST_F(ParserImplTest, TextureSamplerTypes_SampledTexture_MissingGreaterThan) {
@@ -187,7 +187,7 @@
auto* t = p->texture_sampler_types();
ASSERT_TRUE(p->has_error());
EXPECT_EQ(t, nullptr);
- EXPECT_EQ(p->error(), "1:15: missing '>' for sampled texture type");
+ EXPECT_EQ(p->error(), "1:15: expected '>' for sampled texture type");
}
TEST_F(ParserImplTest, TextureSamplerTypes_MultisampledTexture_I32) {
@@ -222,7 +222,7 @@
auto* p = parser("texture_multisampled_2d");
auto* t = p->texture_sampler_types();
EXPECT_EQ(t, nullptr);
- EXPECT_EQ(p->error(), "1:24: missing '<' for multisampled texture type");
+ EXPECT_EQ(p->error(), "1:24: expected '<' for multisampled texture type");
}
TEST_F(ParserImplTest,
@@ -230,7 +230,7 @@
auto* p = parser("texture_multisampled_2d<u32");
auto* t = p->texture_sampler_types();
EXPECT_EQ(t, nullptr);
- EXPECT_EQ(p->error(), "1:28: missing '>' for multisampled texture type");
+ EXPECT_EQ(p->error(), "1:28: expected '>' for multisampled texture type");
}
TEST_F(ParserImplTest,
@@ -281,7 +281,7 @@
auto* p = parser("texture_ro_1d");
auto* t = p->texture_sampler_types();
EXPECT_EQ(t, nullptr);
- EXPECT_EQ(p->error(), "1:14: missing '<' for storage texture type");
+ EXPECT_EQ(p->error(), "1:14: expected '<' for storage texture type");
}
TEST_F(ParserImplTest,
@@ -289,7 +289,7 @@
auto* p = parser("texture_wo_1d<r8unorm");
auto* t = p->texture_sampler_types();
EXPECT_EQ(t, nullptr);
- EXPECT_EQ(p->error(), "1:22: missing '>' for storage texture type");
+ EXPECT_EQ(p->error(), "1:22: expected '>' for storage texture type");
}
TEST_F(ParserImplTest, TextureSamplerTypes_StorageTexture_Readonly1dR8Unorm) {
@@ -338,14 +338,14 @@
auto* p = parser("texture_storage_ro_1d");
auto* t = p->texture_sampler_types();
EXPECT_EQ(t, nullptr);
- EXPECT_EQ(p->error(), "1:22: missing '<' for storage texture type");
+ EXPECT_EQ(p->error(), "1:22: expected '<' for storage texture type");
}
TEST_F(ParserImplTest, TextureSamplerTypes_StorageTexture_MissingGreaterThan) {
auto* p = parser("texture_storage_ro_1d<r8unorm");
auto* t = p->texture_sampler_types();
EXPECT_EQ(t, nullptr);
- EXPECT_EQ(p->error(), "1:30: missing '>' for storage texture type");
+ EXPECT_EQ(p->error(), "1:30: expected '>' for storage texture type");
}
} // namespace
diff --git a/src/reader/wgsl/parser_impl_type_decl_test.cc b/src/reader/wgsl/parser_impl_type_decl_test.cc
index e3c56c7..20e6b2f 100644
--- a/src/reader/wgsl/parser_impl_type_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_type_decl_test.cc
@@ -149,7 +149,7 @@
auto* t = p->type_decl();
ASSERT_EQ(t, nullptr);
ASSERT_TRUE(p->has_error());
- ASSERT_EQ(p->error(), "1:9: missing > for vector");
+ ASSERT_EQ(p->error(), "1:9: expected '>' for vector");
}
INSTANTIATE_TEST_SUITE_P(ParserImplTest,
VecMissingGreaterThanTest,
@@ -165,7 +165,7 @@
auto* t = p->type_decl();
ASSERT_EQ(t, nullptr);
ASSERT_TRUE(p->has_error());
- ASSERT_EQ(p->error(), "1:5: missing < for vector");
+ ASSERT_EQ(p->error(), "1:5: expected '<' for vector");
}
INSTANTIATE_TEST_SUITE_P(ParserImplTest,
VecMissingLessThanTest,
@@ -238,7 +238,7 @@
auto* t = p->type_decl();
ASSERT_EQ(t, nullptr);
ASSERT_TRUE(p->has_error());
- ASSERT_EQ(p->error(), "1:5: missing < for ptr declaration");
+ ASSERT_EQ(p->error(), "1:5: expected '<' for ptr declaration");
}
TEST_F(ParserImplTest, TypeDecl_Ptr_MissingGreaterThan) {
@@ -246,7 +246,7 @@
auto* t = p->type_decl();
ASSERT_EQ(t, nullptr);
ASSERT_TRUE(p->has_error());
- ASSERT_EQ(p->error(), "1:18: missing > for ptr declaration");
+ ASSERT_EQ(p->error(), "1:18: expected '>' for ptr declaration");
}
TEST_F(ParserImplTest, TypeDecl_Ptr_MissingComma) {
@@ -254,7 +254,7 @@
auto* t = p->type_decl();
ASSERT_EQ(t, nullptr);
ASSERT_TRUE(p->has_error());
- ASSERT_EQ(p->error(), "1:14: missing , for ptr declaration");
+ ASSERT_EQ(p->error(), "1:14: expected ',' for ptr declaration");
}
TEST_F(ParserImplTest, TypeDecl_Ptr_MissingStorageClass) {
diff --git a/src/reader/wgsl/parser_impl_variable_storage_decoration_test.cc b/src/reader/wgsl/parser_impl_variable_storage_decoration_test.cc
index fa2b40f..70e7a63 100644
--- a/src/reader/wgsl/parser_impl_variable_storage_decoration_test.cc
+++ b/src/reader/wgsl/parser_impl_variable_storage_decoration_test.cc
@@ -92,7 +92,7 @@
auto sc = p->variable_storage_decoration();
ASSERT_EQ(sc, ast::StorageClass::kNone);
ASSERT_TRUE(p->has_error());
- ASSERT_EQ(p->error(), "1:4: missing > for variable decoration");
+ ASSERT_EQ(p->error(), "1:4: expected '>' for variable decoration");
}
} // namespace