@@ -330,10 +330,13 @@ RootSignatureParser::parseDescriptorTableClause() {
330
330
}
331
331
Clause.setDefaultFlags (Version);
332
332
333
- auto Params = parseDescriptorTableClauseParams (ExpectedReg);
333
+ auto Params = parseDescriptorTableClauseParams (ParamKind, ExpectedReg);
334
334
if (!Params.has_value ())
335
335
return std::nullopt;
336
336
337
+ if (consumeExpectedToken (TokenKind::pu_r_paren))
338
+ return std::nullopt;
339
+
337
340
// Check mandatory parameters were provided
338
341
if (!Params->Reg .has_value ()) {
339
342
reportDiag (diag::err_hlsl_rootsig_missing_param) << ExpectedReg;
@@ -355,9 +358,6 @@ RootSignatureParser::parseDescriptorTableClause() {
355
358
if (Params->Flags .has_value ())
356
359
Clause.Flags = Params->Flags .value ();
357
360
358
- if (consumeExpectedToken (TokenKind::pu_r_paren))
359
- return std::nullopt;
360
-
361
361
return Clause;
362
362
}
363
363
@@ -577,14 +577,15 @@ RootSignatureParser::parseRootDescriptorParams(TokenKind DescType,
577
577
}
578
578
579
579
std::optional<RootSignatureParser::ParsedClauseParams>
580
- RootSignatureParser::parseDescriptorTableClauseParams (TokenKind RegType) {
580
+ RootSignatureParser::parseDescriptorTableClauseParams (TokenKind DescType,
581
+ TokenKind RegType) {
581
582
assert (CurToken.TokKind == TokenKind::pu_l_paren &&
582
583
" Expects to only be invoked starting at given token" );
583
584
584
585
ParsedClauseParams Params;
585
- do {
586
- // ( `b` | `t` | `u` | `s`) POS_INT
586
+ while (!peekExpectedToken (TokenKind::pu_r_paren)) {
587
587
if (tryConsumeExpectedToken (RegType)) {
588
+ // ( `b` | `t` | `u` | `s`) POS_INT
588
589
if (Params.Reg .has_value ()) {
589
590
reportDiag (diag::err_hlsl_rootsig_repeat_param) << CurToken.TokKind ;
590
591
return std::nullopt;
@@ -593,10 +594,8 @@ RootSignatureParser::parseDescriptorTableClauseParams(TokenKind RegType) {
593
594
if (!Reg.has_value ())
594
595
return std::nullopt;
595
596
Params.Reg = Reg;
596
- }
597
-
598
- // `numDescriptors` `=` POS_INT | unbounded
599
- if (tryConsumeExpectedToken (TokenKind::kw_numDescriptors)) {
597
+ } else if (tryConsumeExpectedToken (TokenKind::kw_numDescriptors)) {
598
+ // `numDescriptors` `=` POS_INT | unbounded
600
599
if (Params.NumDescriptors .has_value ()) {
601
600
reportDiag (diag::err_hlsl_rootsig_repeat_param) << CurToken.TokKind ;
602
601
return std::nullopt;
@@ -615,10 +614,8 @@ RootSignatureParser::parseDescriptorTableClauseParams(TokenKind RegType) {
615
614
}
616
615
617
616
Params.NumDescriptors = NumDescriptors;
618
- }
619
-
620
- // `space` `=` POS_INT
621
- if (tryConsumeExpectedToken (TokenKind::kw_space)) {
617
+ } else if (tryConsumeExpectedToken (TokenKind::kw_space)) {
618
+ // `space` `=` POS_INT
622
619
if (Params.Space .has_value ()) {
623
620
reportDiag (diag::err_hlsl_rootsig_repeat_param) << CurToken.TokKind ;
624
621
return std::nullopt;
@@ -631,10 +628,8 @@ RootSignatureParser::parseDescriptorTableClauseParams(TokenKind RegType) {
631
628
if (!Space.has_value ())
632
629
return std::nullopt;
633
630
Params.Space = Space;
634
- }
635
-
636
- // `offset` `=` POS_INT | DESCRIPTOR_RANGE_OFFSET_APPEND
637
- if (tryConsumeExpectedToken (TokenKind::kw_offset)) {
631
+ } else if (tryConsumeExpectedToken (TokenKind::kw_offset)) {
632
+ // `offset` `=` POS_INT | DESCRIPTOR_RANGE_OFFSET_APPEND
638
633
if (Params.Offset .has_value ()) {
639
634
reportDiag (diag::err_hlsl_rootsig_repeat_param) << CurToken.TokKind ;
640
635
return std::nullopt;
@@ -653,10 +648,8 @@ RootSignatureParser::parseDescriptorTableClauseParams(TokenKind RegType) {
653
648
}
654
649
655
650
Params.Offset = Offset;
656
- }
657
-
658
- // `flags` `=` DESCRIPTOR_RANGE_FLAGS
659
- if (tryConsumeExpectedToken (TokenKind::kw_flags)) {
651
+ } else if (tryConsumeExpectedToken (TokenKind::kw_flags)) {
652
+ // `flags` `=` DESCRIPTOR_RANGE_FLAGS
660
653
if (Params.Flags .has_value ()) {
661
654
reportDiag (diag::err_hlsl_rootsig_repeat_param) << CurToken.TokKind ;
662
655
return std::nullopt;
@@ -669,9 +662,16 @@ RootSignatureParser::parseDescriptorTableClauseParams(TokenKind RegType) {
669
662
if (!Flags.has_value ())
670
663
return std::nullopt;
671
664
Params.Flags = Flags;
665
+ } else {
666
+ consumeNextToken (); // position to start of invalid token
667
+ reportDiag (diag::err_hlsl_rootsig_invalid_param) << /* param of=*/ DescType;
668
+ return std::nullopt;
672
669
}
673
670
674
- } while (tryConsumeExpectedToken (TokenKind::pu_comma));
671
+ // ',' denotes another element, otherwise, expected to be at ')'
672
+ if (!tryConsumeExpectedToken (TokenKind::pu_comma))
673
+ break ;
674
+ }
675
675
676
676
return Params;
677
677
}
0 commit comments