@@ -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
6364bool 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() {
7779bool 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
118122bool 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()...; };
168175template <class ... Ts> ParseMethods (Ts...) -> ParseMethods<Ts...>;
169176
170177bool 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
242251bool 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) {
270280bool 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
282293bool 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
0 commit comments