diff --git a/src/reader/spirv/parser_impl.cc b/src/reader/spirv/parser_impl.cc index 6e92c3e247..544fcfe17e 100644 --- a/src/reader/spirv/parser_impl.cc +++ b/src/reader/spirv/parser_impl.cc @@ -750,7 +750,14 @@ bool ParserImpl::IsValidIdentifier(const std::string& str) { return false; } std::locale c_locale("C"); - if (!std::isalpha(str[0], c_locale)) { + if (str[0] == '_') { + if (str.length() == 1u || str[1] == '_') { + // https://www.w3.org/TR/WGSL/#identifiers + // must not be '_' (a single underscore) + // must not start with two underscores + return false; + } + } else if (!std::isalpha(str[0], c_locale)) { return false; } for (const char& ch : str) { diff --git a/src/reader/spirv/parser_impl_test.cc b/src/reader/spirv/parser_impl_test.cc index 72c8446dd1..49ccad3713 100644 --- a/src/reader/spirv/parser_impl_test.cc +++ b/src/reader/spirv/parser_impl_test.cc @@ -202,8 +202,9 @@ TEST_F(SpvParserTest, Impl_Source_InvalidId) { TEST_F(SpvParserTest, Impl_IsValidIdentifier) { EXPECT_FALSE(ParserImpl::IsValidIdentifier("")); // empty - EXPECT_FALSE( - ParserImpl::IsValidIdentifier("_")); // leading underscore, but ok later + EXPECT_FALSE(ParserImpl::IsValidIdentifier("_")); + EXPECT_FALSE(ParserImpl::IsValidIdentifier("__")); + EXPECT_TRUE(ParserImpl::IsValidIdentifier("_x")); EXPECT_FALSE( ParserImpl::IsValidIdentifier("9")); // leading digit, but ok later EXPECT_FALSE(ParserImpl::IsValidIdentifier(" ")); // leading space