Skip to content

Commit 945aa9e

Browse files
committed
fix for root constants
1 parent a8fe5cd commit 945aa9e

File tree

2 files changed

+45
-20
lines changed

2 files changed

+45
-20
lines changed

clang/lib/Parse/ParseHLSLRootSignature.cpp

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1290,4 +1290,31 @@ TEST_F(ParseHLSLRootSignatureTest, InvalidDescriptorTableMissingCommaTest) {
12901290
ASSERT_TRUE(Consumer->isSatisfied());
12911291
}
12921292

1293+
TEST_F(ParseHLSLRootSignatureTest, InvalidRootConstantParamsCommaTest) {
1294+
// This test will check that an error is produced when there is a missing
1295+
// comma between parameters
1296+
const llvm::StringLiteral Source = R"cc(
1297+
RootConstants(
1298+
num32BitConstants = 1
1299+
b0
1300+
)
1301+
)cc";
1302+
1303+
auto Ctx = createMinimalASTContext();
1304+
StringLiteral *Signature = wrapSource(Ctx, Source);
1305+
1306+
TrivialModuleLoader ModLoader;
1307+
auto PP = createPP(Source, ModLoader);
1308+
1309+
SmallVector<RootElement> Elements;
1310+
hlsl::RootSignatureParser Parser(RootSignatureVersion::V1_1, Elements,
1311+
Signature, *PP);
1312+
1313+
// Test correct diagnostic produced
1314+
Consumer->setExpected(diag::err_hlsl_unexpected_end_of_params);
1315+
ASSERT_TRUE(Parser.parse());
1316+
1317+
ASSERT_TRUE(Consumer->isSatisfied());
1318+
}
1319+
12931320
} // anonymous namespace

0 commit comments

Comments
 (0)