Skip to content

Commit f457b38

Browse files
committed
review prototype: allow for more context to ConsumeNextToken error
1 parent 3146eba commit f457b38

File tree

4 files changed

+58
-28
lines changed

4 files changed

+58
-28
lines changed

clang/include/clang/Basic/DiagnosticParseKinds.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1819,7 +1819,7 @@ def err_hlsl_unsupported_component : Error<"invalid component '%0' used; expecte
18191819
def err_hlsl_packoffset_invalid_reg : Error<"invalid resource class specifier '%0' for packoffset, expected 'c'">;
18201820

18211821
// HLSL Root Signature Parser Diagnostics
1822-
def err_hlsl_rootsig_unexpected_token_kind : Error<"got %1 but expected %select{|one of}0 the following token kind%select{|s}0: %2">;
1822+
def err_hlsl_expected : Error<"expected %0 as %1">;
18231823
def err_hlsl_number_literal_overflow : Error<"integer literal is too large to be represented as a 32-bit %select{signed |}0 integer type">;
18241824
def err_hlsl_rootsig_repeat_param : Error<"specified the same parameter '%0' multiple times">;
18251825
def err_hlsl_rootsig_non_zero_flag : Error<"specified a non-zero integer as a flag">;

clang/include/clang/Parse/ParseHLSLRootSignature.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,12 @@ class RootSignatureParser {
114114
/// kind.
115115
///
116116
/// Returns true if there was an error reported.
117-
bool ConsumeExpectedToken(TokenKind Expected);
118-
bool ConsumeExpectedToken(ArrayRef<TokenKind> AnyExpected);
117+
bool ConsumeExpectedToken(TokenKind Expected,
118+
unsigned DiagID = diag::err_expected,
119+
StringRef DiagMsg = "");
120+
bool ConsumeExpectedToken(ArrayRef<TokenKind> AnyExpected,
121+
unsigned DiagID = diag::err_expected,
122+
StringRef DiagMsg = "");
119123

120124
/// Peek if the next token is of the expected kind and if it is then consume
121125
/// it.

clang/lib/Parse/ParseHLSLRootSignature.cpp

Lines changed: 48 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,17 @@ bool RootSignatureParser::Parse() {
5353
while (!ParseRootElement()) {
5454
if (Lexer.EndOfBuffer())
5555
return false;
56-
if (ConsumeExpectedToken(TokenKind::pu_comma))
56+
if (ConsumeExpectedToken(TokenKind::pu_comma, diag::err_expected_either,
57+
"end of root signature string"))
5758
return true;
5859
}
5960

6061
return true;
6162
}
6263

6364
bool RootSignatureParser::ParseRootElement() {
64-
if (ConsumeExpectedToken(TokenKind::kw_DescriptorTable))
65+
if (ConsumeExpectedToken(TokenKind::kw_DescriptorTable,
66+
diag::err_hlsl_expected, "root element"))
6567
return true;
6668

6769
// Dispatch onto the correct parse method
@@ -77,7 +79,8 @@ bool RootSignatureParser::ParseRootElement() {
7779
bool RootSignatureParser::ParseDescriptorTable() {
7880
DescriptorTable Table;
7981

80-
if (ConsumeExpectedToken(TokenKind::pu_l_paren))
82+
if (ConsumeExpectedToken(TokenKind::pu_l_paren, diag::err_expected_after,
83+
"DescriptorTable"))
8184
return true;
8285

8386
// Empty case:
@@ -108,7 +111,8 @@ bool RootSignatureParser::ParseDescriptorTable() {
108111
Table.NumClauses++;
109112
} while (TryConsumeExpectedToken(TokenKind::pu_comma));
110113

111-
if (ConsumeExpectedToken(TokenKind::pu_r_paren))
114+
if (ConsumeExpectedToken(TokenKind::pu_r_paren, diag::err_expected_after,
115+
"descriptor table clauses"))
112116
return true;
113117

114118
Elements.push_back(Table);
@@ -117,7 +121,8 @@ bool RootSignatureParser::ParseDescriptorTable() {
117121

118122
bool RootSignatureParser::ParseDescriptorTableClause() {
119123
if (ConsumeExpectedToken({TokenKind::kw_CBV, TokenKind::kw_SRV,
120-
TokenKind::kw_UAV, TokenKind::kw_Sampler}))
124+
TokenKind::kw_UAV, TokenKind::kw_Sampler},
125+
diag::err_hlsl_expected, "descriptor table clause"))
121126
return true;
122127

123128
DescriptorTableClause Clause;
@@ -139,7 +144,8 @@ bool RootSignatureParser::ParseDescriptorTableClause() {
139144
}
140145
Clause.SetDefaultFlags();
141146

142-
if (ConsumeExpectedToken(TokenKind::pu_l_paren))
147+
if (ConsumeExpectedToken(TokenKind::pu_l_paren, diag::err_expected_after,
148+
FormatTokenKinds({CurToken.Kind})))
143149
return true;
144150

145151
// Consume mandatory Register paramater
@@ -156,7 +162,8 @@ bool RootSignatureParser::ParseDescriptorTableClause() {
156162
if (ParseOptionalParams({RefMap}))
157163
return true;
158164

159-
if (ConsumeExpectedToken(TokenKind::pu_r_paren))
165+
if (ConsumeExpectedToken(TokenKind::pu_r_paren, diag::err_expected_after,
166+
"clause parameters"))
160167
return true;
161168

162169
Elements.push_back(Clause);
@@ -168,7 +175,8 @@ template <class... Ts> struct ParseMethods : Ts... { using Ts::operator()...; };
168175
template <class... Ts> ParseMethods(Ts...) -> ParseMethods<Ts...>;
169176

170177
bool RootSignatureParser::ParseParam(ParamType Ref) {
171-
if (ConsumeExpectedToken(TokenKind::pu_equal))
178+
if (ConsumeExpectedToken(TokenKind::pu_equal, diag::err_expected_after,
179+
FormatTokenKinds(CurToken.Kind)))
172180
return true;
173181

174182
bool Error;
@@ -198,7 +206,8 @@ bool RootSignatureParser::ParseOptionalParams(
198206
llvm::SmallDenseSet<TokenKind> Seen;
199207

200208
while (TryConsumeExpectedToken(TokenKind::pu_comma)) {
201-
if (ConsumeExpectedToken(ParamKeywords))
209+
if (ConsumeExpectedToken(ParamKeywords, diag::err_hlsl_expected,
210+
"optional parameter"))
202211
return true;
203212

204213
TokenKind ParamKind = CurToken.Kind;
@@ -241,7 +250,8 @@ bool RootSignatureParser::HandleUIntLiteral(uint32_t &X) {
241250

242251
bool RootSignatureParser::ParseRegister(Register *Register) {
243252
if (ConsumeExpectedToken(
244-
{TokenKind::bReg, TokenKind::tReg, TokenKind::uReg, TokenKind::sReg}))
253+
{TokenKind::bReg, TokenKind::tReg, TokenKind::uReg, TokenKind::sReg},
254+
diag::err_hlsl_expected, "a register"))
245255
return true;
246256

247257
switch (CurToken.Kind) {
@@ -270,7 +280,8 @@ bool RootSignatureParser::ParseRegister(Register *Register) {
270280
bool RootSignatureParser::ParseUInt(uint32_t *X) {
271281
// Treat a postively signed integer as though it is unsigned to match DXC
272282
TryConsumeExpectedToken(TokenKind::pu_plus);
273-
if (ConsumeExpectedToken(TokenKind::int_literal))
283+
if (ConsumeExpectedToken(TokenKind::int_literal, diag::err_hlsl_expected,
284+
"unsigned integer"))
274285
return true;
275286

276287
if (HandleUIntLiteral(*X))
@@ -281,7 +292,8 @@ bool RootSignatureParser::ParseUInt(uint32_t *X) {
281292

282293
bool RootSignatureParser::ParseDescriptorRangeOffset(DescriptorRangeOffset *X) {
283294
if (ConsumeExpectedToken(
284-
{TokenKind::int_literal, TokenKind::en_DescriptorRangeOffsetAppend}))
295+
{TokenKind::int_literal, TokenKind::en_DescriptorRangeOffsetAppend},
296+
diag::err_hlsl_expected, "descriptor range offset"))
285297
return true;
286298

287299
// Edge case for the offset enum -> static value
@@ -307,7 +319,8 @@ bool RootSignatureParser::ParseEnum(
307319
EnumToks.push_back(EnumPair.first);
308320

309321
// If invoked we expect to have an enum
310-
if (ConsumeExpectedToken(EnumToks))
322+
if (ConsumeExpectedToken(EnumToks, diag::err_hlsl_expected,
323+
"parameter value"))
311324
return true;
312325

313326
// Handle the edge case when '0' is used to specify None
@@ -391,20 +404,33 @@ bool RootSignatureParser::PeekExpectedToken(ArrayRef<TokenKind> AnyExpected) {
391404
return IsExpectedToken(Result.Kind, AnyExpected);
392405
}
393406

394-
bool RootSignatureParser::ConsumeExpectedToken(TokenKind Expected) {
395-
return ConsumeExpectedToken(ArrayRef{Expected});
407+
bool RootSignatureParser::ConsumeExpectedToken(TokenKind Expected,
408+
unsigned DiagID,
409+
StringRef DiagMsg) {
410+
return ConsumeExpectedToken(ArrayRef{Expected}, DiagID, DiagMsg);
396411
}
397412

398-
bool RootSignatureParser::ConsumeExpectedToken(
399-
ArrayRef<TokenKind> AnyExpected) {
400-
ConsumeNextToken();
401-
if (IsExpectedToken(CurToken.Kind, AnyExpected))
413+
bool RootSignatureParser::ConsumeExpectedToken(ArrayRef<TokenKind> AnyExpected,
414+
unsigned DiagID,
415+
StringRef DiagMsg) {
416+
if (TryConsumeExpectedToken(AnyExpected))
402417
return false;
403418

404419
// Report unexpected token kind error
405-
Diags().Report(CurToken.TokLoc, diag::err_hlsl_rootsig_unexpected_token_kind)
406-
<< (unsigned)(AnyExpected.size() != 1)
407-
<< FormatTokenKinds({CurToken.Kind}) << FormatTokenKinds(AnyExpected);
420+
DiagnosticBuilder DB = Diags().Report(CurToken.TokLoc, DiagID);
421+
switch (DiagID) {
422+
case diag::err_expected:
423+
DB << FormatTokenKinds(AnyExpected);
424+
break;
425+
case diag::err_hlsl_expected:
426+
case diag::err_expected_either:
427+
case diag::err_expected_after:
428+
DB << FormatTokenKinds(AnyExpected) << DiagMsg;
429+
break;
430+
default:
431+
DB << DiagMsg;
432+
break;
433+
}
408434
return true;
409435
}
410436

clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ TEST_F(ParseHLSLRootSignatureTest, InvalidParseUnexpectedTokenTest) {
238238
hlsl::RootSignatureParser Parser(Elements, Lexer, *PP);
239239

240240
// Test correct diagnostic produced
241-
Consumer->SetExpected(diag::err_hlsl_rootsig_unexpected_token_kind);
241+
Consumer->SetExpected(diag::err_expected_either);
242242
ASSERT_TRUE(Parser.Parse());
243243

244244
ASSERT_TRUE(Consumer->IsSatisfied());
@@ -258,7 +258,7 @@ TEST_F(ParseHLSLRootSignatureTest, InvalidParseInvalidTokenTest) {
258258
hlsl::RootSignatureParser Parser(Elements, Lexer, *PP);
259259

260260
// Test correct diagnostic produced - invalid token
261-
Consumer->SetExpected(diag::err_hlsl_rootsig_unexpected_token_kind);
261+
Consumer->SetExpected(diag::err_hlsl_expected);
262262
ASSERT_TRUE(Parser.Parse());
263263

264264
ASSERT_TRUE(Consumer->IsSatisfied());
@@ -278,7 +278,7 @@ TEST_F(ParseHLSLRootSignatureTest, InvalidParseUnexpectedEndOfStreamTest) {
278278
hlsl::RootSignatureParser Parser(Elements, Lexer, *PP);
279279

280280
// Test correct diagnostic produced - end of stream
281-
Consumer->SetExpected(diag::err_hlsl_rootsig_unexpected_token_kind);
281+
Consumer->SetExpected(diag::err_hlsl_expected);
282282
ASSERT_TRUE(Parser.Parse());
283283

284284
ASSERT_TRUE(Consumer->IsSatisfied());

0 commit comments

Comments
 (0)