@@ -136,6 +136,11 @@ std::optional<RootConstants> RootSignatureParser::parseRootConstants() {
136136 if (!Params.has_value ())
137137 return std::nullopt ;
138138
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+
139144 // Check mandatory parameters where provided
140145 if (!Params->Num32BitConstants .has_value ()) {
141146 reportDiag (diag::err_hlsl_rootsig_missing_param)
@@ -159,11 +164,6 @@ std::optional<RootConstants> RootSignatureParser::parseRootConstants() {
159164 if (Params->Space .has_value ())
160165 Constants.Space = Params->Space .value ();
161166
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-
167167 return Constants;
168168}
169169
@@ -429,9 +429,9 @@ RootSignatureParser::parseRootConstantParams() {
429429 " Expects to only be invoked starting at given token" );
430430
431431 ParsedConstantParams Params;
432- do {
433- // `num32BitConstants` `=` POS_INT
432+ while (!peekExpectedToken (TokenKind::pu_r_paren)) {
434433 if (tryConsumeExpectedToken (TokenKind::kw_num32BitConstants)) {
434+ // `num32BitConstants` `=` POS_INT
435435 if (Params.Num32BitConstants .has_value ()) {
436436 reportDiag (diag::err_hlsl_rootsig_repeat_param) << CurToken.TokKind ;
437437 return std::nullopt ;
@@ -444,10 +444,8 @@ RootSignatureParser::parseRootConstantParams() {
444444 if (!Num32BitConstants.has_value ())
445445 return std::nullopt ;
446446 Params.Num32BitConstants = Num32BitConstants;
447- }
448-
449- // `b` POS_INT
450- if (tryConsumeExpectedToken (TokenKind::bReg)) {
447+ } else if (tryConsumeExpectedToken (TokenKind::bReg)) {
448+ // `b` POS_INT
451449 if (Params.Reg .has_value ()) {
452450 reportDiag (diag::err_hlsl_rootsig_repeat_param) << CurToken.TokKind ;
453451 return std::nullopt ;
@@ -456,10 +454,8 @@ RootSignatureParser::parseRootConstantParams() {
456454 if (!Reg.has_value ())
457455 return std::nullopt ;
458456 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
463459 if (Params.Space .has_value ()) {
464460 reportDiag (diag::err_hlsl_rootsig_repeat_param) << CurToken.TokKind ;
465461 return std::nullopt ;
@@ -472,10 +468,8 @@ RootSignatureParser::parseRootConstantParams() {
472468 if (!Space.has_value ())
473469 return std::nullopt ;
474470 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
479473 if (Params.Visibility .has_value ()) {
480474 reportDiag (diag::err_hlsl_rootsig_repeat_param) << CurToken.TokKind ;
481475 return std::nullopt ;
@@ -489,7 +483,11 @@ RootSignatureParser::parseRootConstantParams() {
489483 return std::nullopt ;
490484 Params.Visibility = Visibility;
491485 }
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+ }
493491
494492 return Params;
495493}
0 commit comments