@@ -149,6 +149,9 @@ std::optional<RootConstants> RootSignatureParser::parseRootConstants() {
149
149
if (!Params.has_value ())
150
150
return std::nullopt;
151
151
152
+ if (consumeExpectedToken (TokenKind::pu_r_paren))
153
+ return std::nullopt;
154
+
152
155
// Check mandatory parameters where provided
153
156
if (!Params->Num32BitConstants .has_value ()) {
154
157
reportDiag (diag::err_hlsl_rootsig_missing_param)
@@ -172,9 +175,6 @@ std::optional<RootConstants> RootSignatureParser::parseRootConstants() {
172
175
if (Params->Space .has_value ())
173
176
Constants.Space = Params->Space .value ();
174
177
175
- if (consumeExpectedToken (TokenKind::pu_r_paren))
176
- return std::nullopt;
177
-
178
178
return Constants;
179
179
}
180
180
@@ -434,9 +434,9 @@ RootSignatureParser::parseRootConstantParams() {
434
434
" Expects to only be invoked starting at given token" );
435
435
436
436
ParsedConstantParams Params;
437
- do {
438
- // `num32BitConstants` `=` POS_INT
437
+ while (!peekExpectedToken (TokenKind::pu_r_paren)) {
439
438
if (tryConsumeExpectedToken (TokenKind::kw_num32BitConstants)) {
439
+ // `num32BitConstants` `=` POS_INT
440
440
if (Params.Num32BitConstants .has_value ()) {
441
441
reportDiag (diag::err_hlsl_rootsig_repeat_param) << CurToken.TokKind ;
442
442
return std::nullopt;
@@ -449,10 +449,8 @@ RootSignatureParser::parseRootConstantParams() {
449
449
if (!Num32BitConstants.has_value ())
450
450
return std::nullopt;
451
451
Params.Num32BitConstants = Num32BitConstants;
452
- }
453
-
454
- // `b` POS_INT
455
- if (tryConsumeExpectedToken (TokenKind::bReg)) {
452
+ } else if (tryConsumeExpectedToken (TokenKind::bReg)) {
453
+ // `b` POS_INT
456
454
if (Params.Reg .has_value ()) {
457
455
reportDiag (diag::err_hlsl_rootsig_repeat_param) << CurToken.TokKind ;
458
456
return std::nullopt;
@@ -461,10 +459,8 @@ RootSignatureParser::parseRootConstantParams() {
461
459
if (!Reg.has_value ())
462
460
return std::nullopt;
463
461
Params.Reg = Reg;
464
- }
465
-
466
- // `space` `=` POS_INT
467
- if (tryConsumeExpectedToken (TokenKind::kw_space)) {
462
+ } else if (tryConsumeExpectedToken (TokenKind::kw_space)) {
463
+ // `space` `=` POS_INT
468
464
if (Params.Space .has_value ()) {
469
465
reportDiag (diag::err_hlsl_rootsig_repeat_param) << CurToken.TokKind ;
470
466
return std::nullopt;
@@ -477,10 +473,8 @@ RootSignatureParser::parseRootConstantParams() {
477
473
if (!Space.has_value ())
478
474
return std::nullopt;
479
475
Params.Space = Space;
480
- }
481
-
482
- // `visibility` `=` SHADER_VISIBILITY
483
- if (tryConsumeExpectedToken (TokenKind::kw_visibility)) {
476
+ } else if (tryConsumeExpectedToken (TokenKind::kw_visibility)) {
477
+ // `visibility` `=` SHADER_VISIBILITY
484
478
if (Params.Visibility .has_value ()) {
485
479
reportDiag (diag::err_hlsl_rootsig_repeat_param) << CurToken.TokKind ;
486
480
return std::nullopt;
@@ -493,8 +487,17 @@ RootSignatureParser::parseRootConstantParams() {
493
487
if (!Visibility.has_value ())
494
488
return std::nullopt;
495
489
Params.Visibility = Visibility;
490
+ } else {
491
+ consumeNextToken (); // position to start of invalid token
492
+ reportDiag (diag::err_hlsl_rootsig_invalid_param)
493
+ << /* param of=*/ TokenKind::kw_RootConstants;
494
+ return std::nullopt;
496
495
}
497
- } while (tryConsumeExpectedToken (TokenKind::pu_comma));
496
+
497
+ // ',' denotes another element, otherwise, expected to be at ')'
498
+ if (!tryConsumeExpectedToken (TokenKind::pu_comma))
499
+ break ;
500
+ }
498
501
499
502
return Params;
500
503
}
0 commit comments