@@ -136,6 +136,11 @@ std::optional<RootConstants> RootSignatureParser::parseRootConstants() {
136
136
if (!Params.has_value ())
137
137
return std::nullopt;
138
138
139
+ if (consumeExpectedToken (TokenKind::pu_r_paren,
140
+ diag::err_hlsl_unexpected_end_of_params,
141
+ /* param of=*/ TokenKind::kw_RootConstants))
142
+ return std::nullopt;
143
+
139
144
// Check mandatory parameters where provided
140
145
if (!Params->Num32BitConstants .has_value ()) {
141
146
reportDiag (diag::err_hlsl_rootsig_missing_param)
@@ -159,11 +164,6 @@ std::optional<RootConstants> RootSignatureParser::parseRootConstants() {
159
164
if (Params->Space .has_value ())
160
165
Constants.Space = Params->Space .value ();
161
166
162
- if (consumeExpectedToken (TokenKind::pu_r_paren,
163
- diag::err_hlsl_unexpected_end_of_params,
164
- /* param of=*/ TokenKind::kw_RootConstants))
165
- return std::nullopt;
166
-
167
167
return Constants;
168
168
}
169
169
@@ -429,9 +429,9 @@ RootSignatureParser::parseRootConstantParams() {
429
429
" Expects to only be invoked starting at given token" );
430
430
431
431
ParsedConstantParams Params;
432
- do {
433
- // `num32BitConstants` `=` POS_INT
432
+ while (!peekExpectedToken (TokenKind::pu_r_paren)) {
434
433
if (tryConsumeExpectedToken (TokenKind::kw_num32BitConstants)) {
434
+ // `num32BitConstants` `=` POS_INT
435
435
if (Params.Num32BitConstants .has_value ()) {
436
436
reportDiag (diag::err_hlsl_rootsig_repeat_param) << CurToken.TokKind ;
437
437
return std::nullopt;
@@ -444,10 +444,8 @@ RootSignatureParser::parseRootConstantParams() {
444
444
if (!Num32BitConstants.has_value ())
445
445
return std::nullopt;
446
446
Params.Num32BitConstants = Num32BitConstants;
447
- }
448
-
449
- // `b` POS_INT
450
- if (tryConsumeExpectedToken (TokenKind::bReg)) {
447
+ } else if (tryConsumeExpectedToken (TokenKind::bReg)) {
448
+ // `b` POS_INT
451
449
if (Params.Reg .has_value ()) {
452
450
reportDiag (diag::err_hlsl_rootsig_repeat_param) << CurToken.TokKind ;
453
451
return std::nullopt;
@@ -456,10 +454,8 @@ RootSignatureParser::parseRootConstantParams() {
456
454
if (!Reg.has_value ())
457
455
return std::nullopt;
458
456
Params.Reg = Reg;
459
- }
460
-
461
- // `space` `=` POS_INT
462
- if (tryConsumeExpectedToken (TokenKind::kw_space)) {
457
+ } else if (tryConsumeExpectedToken (TokenKind::kw_space)) {
458
+ // `space` `=` POS_INT
463
459
if (Params.Space .has_value ()) {
464
460
reportDiag (diag::err_hlsl_rootsig_repeat_param) << CurToken.TokKind ;
465
461
return std::nullopt;
@@ -472,10 +468,8 @@ RootSignatureParser::parseRootConstantParams() {
472
468
if (!Space.has_value ())
473
469
return std::nullopt;
474
470
Params.Space = Space;
475
- }
476
-
477
- // `visibility` `=` SHADER_VISIBILITY
478
- if (tryConsumeExpectedToken (TokenKind::kw_visibility)) {
471
+ } else if (tryConsumeExpectedToken (TokenKind::kw_visibility)) {
472
+ // `visibility` `=` SHADER_VISIBILITY
479
473
if (Params.Visibility .has_value ()) {
480
474
reportDiag (diag::err_hlsl_rootsig_repeat_param) << CurToken.TokKind ;
481
475
return std::nullopt;
@@ -489,7 +483,11 @@ RootSignatureParser::parseRootConstantParams() {
489
483
return std::nullopt;
490
484
Params.Visibility = Visibility;
491
485
}
492
- } while (tryConsumeExpectedToken (TokenKind::pu_comma));
486
+
487
+ // ',' denotes another element, otherwise, expected to be at ')'
488
+ if (!tryConsumeExpectedToken (TokenKind::pu_comma))
489
+ break ;
490
+ }
493
491
494
492
return Params;
495
493
}
0 commit comments