@@ -53,15 +53,17 @@ bool RootSignatureParser::Parse() {
53
53
while (!ParseRootElement ()) {
54
54
if (Lexer.EndOfBuffer ())
55
55
return false ;
56
- if (ConsumeExpectedToken (TokenKind::pu_comma))
56
+ if (ConsumeExpectedToken (TokenKind::pu_comma, diag::err_expected_either,
57
+ " end of root signature string" ))
57
58
return true ;
58
59
}
59
60
60
61
return true ;
61
62
}
62
63
63
64
bool RootSignatureParser::ParseRootElement () {
64
- if (ConsumeExpectedToken (TokenKind::kw_DescriptorTable))
65
+ if (ConsumeExpectedToken (TokenKind::kw_DescriptorTable,
66
+ diag::err_hlsl_expected, " root element" ))
65
67
return true ;
66
68
67
69
// Dispatch onto the correct parse method
@@ -77,7 +79,8 @@ bool RootSignatureParser::ParseRootElement() {
77
79
bool RootSignatureParser::ParseDescriptorTable () {
78
80
DescriptorTable Table;
79
81
80
- if (ConsumeExpectedToken (TokenKind::pu_l_paren))
82
+ if (ConsumeExpectedToken (TokenKind::pu_l_paren, diag::err_expected_after,
83
+ " DescriptorTable" ))
81
84
return true ;
82
85
83
86
// Empty case:
@@ -108,7 +111,8 @@ bool RootSignatureParser::ParseDescriptorTable() {
108
111
Table.NumClauses ++;
109
112
} while (TryConsumeExpectedToken (TokenKind::pu_comma));
110
113
111
- if (ConsumeExpectedToken (TokenKind::pu_r_paren))
114
+ if (ConsumeExpectedToken (TokenKind::pu_r_paren, diag::err_expected_after,
115
+ " descriptor table clauses" ))
112
116
return true ;
113
117
114
118
Elements.push_back (Table);
@@ -117,7 +121,8 @@ bool RootSignatureParser::ParseDescriptorTable() {
117
121
118
122
bool RootSignatureParser::ParseDescriptorTableClause () {
119
123
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" ))
121
126
return true ;
122
127
123
128
DescriptorTableClause Clause;
@@ -139,7 +144,8 @@ bool RootSignatureParser::ParseDescriptorTableClause() {
139
144
}
140
145
Clause.SetDefaultFlags ();
141
146
142
- if (ConsumeExpectedToken (TokenKind::pu_l_paren))
147
+ if (ConsumeExpectedToken (TokenKind::pu_l_paren, diag::err_expected_after,
148
+ FormatTokenKinds ({CurToken.Kind })))
143
149
return true ;
144
150
145
151
// Consume mandatory Register paramater
@@ -156,7 +162,8 @@ bool RootSignatureParser::ParseDescriptorTableClause() {
156
162
if (ParseOptionalParams ({RefMap}))
157
163
return true ;
158
164
159
- if (ConsumeExpectedToken (TokenKind::pu_r_paren))
165
+ if (ConsumeExpectedToken (TokenKind::pu_r_paren, diag::err_expected_after,
166
+ " clause parameters" ))
160
167
return true ;
161
168
162
169
Elements.push_back (Clause);
@@ -168,7 +175,8 @@ template <class... Ts> struct ParseMethods : Ts... { using Ts::operator()...; };
168
175
template <class ... Ts> ParseMethods (Ts...) -> ParseMethods<Ts...>;
169
176
170
177
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 )))
172
180
return true ;
173
181
174
182
bool Error;
@@ -198,7 +206,8 @@ bool RootSignatureParser::ParseOptionalParams(
198
206
llvm::SmallDenseSet<TokenKind> Seen;
199
207
200
208
while (TryConsumeExpectedToken (TokenKind::pu_comma)) {
201
- if (ConsumeExpectedToken (ParamKeywords))
209
+ if (ConsumeExpectedToken (ParamKeywords, diag::err_hlsl_expected,
210
+ " optional parameter" ))
202
211
return true ;
203
212
204
213
TokenKind ParamKind = CurToken.Kind ;
@@ -241,7 +250,8 @@ bool RootSignatureParser::HandleUIntLiteral(uint32_t &X) {
241
250
242
251
bool RootSignatureParser::ParseRegister (Register *Register) {
243
252
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" ))
245
255
return true ;
246
256
247
257
switch (CurToken.Kind ) {
@@ -270,7 +280,8 @@ bool RootSignatureParser::ParseRegister(Register *Register) {
270
280
bool RootSignatureParser::ParseUInt (uint32_t *X) {
271
281
// Treat a postively signed integer as though it is unsigned to match DXC
272
282
TryConsumeExpectedToken (TokenKind::pu_plus);
273
- if (ConsumeExpectedToken (TokenKind::int_literal))
283
+ if (ConsumeExpectedToken (TokenKind::int_literal, diag::err_hlsl_expected,
284
+ " unsigned integer" ))
274
285
return true ;
275
286
276
287
if (HandleUIntLiteral (*X))
@@ -281,7 +292,8 @@ bool RootSignatureParser::ParseUInt(uint32_t *X) {
281
292
282
293
bool RootSignatureParser::ParseDescriptorRangeOffset (DescriptorRangeOffset *X) {
283
294
if (ConsumeExpectedToken (
284
- {TokenKind::int_literal, TokenKind::en_DescriptorRangeOffsetAppend}))
295
+ {TokenKind::int_literal, TokenKind::en_DescriptorRangeOffsetAppend},
296
+ diag::err_hlsl_expected, " descriptor range offset" ))
285
297
return true ;
286
298
287
299
// Edge case for the offset enum -> static value
@@ -307,7 +319,8 @@ bool RootSignatureParser::ParseEnum(
307
319
EnumToks.push_back (EnumPair.first );
308
320
309
321
// If invoked we expect to have an enum
310
- if (ConsumeExpectedToken (EnumToks))
322
+ if (ConsumeExpectedToken (EnumToks, diag::err_hlsl_expected,
323
+ " parameter value" ))
311
324
return true ;
312
325
313
326
// Handle the edge case when '0' is used to specify None
@@ -391,20 +404,33 @@ bool RootSignatureParser::PeekExpectedToken(ArrayRef<TokenKind> AnyExpected) {
391
404
return IsExpectedToken (Result.Kind , AnyExpected);
392
405
}
393
406
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);
396
411
}
397
412
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))
402
417
return false ;
403
418
404
419
// 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
+ }
408
434
return true ;
409
435
}
410
436
0 commit comments