Skip to content

Commit 86036e1

Browse files
committed
add diag context when incorrectly specifiying a parameter
1 parent b2a1607 commit 86036e1

File tree

6 files changed

+23
-9
lines changed

6 files changed

+23
-9
lines changed

clang/include/clang/Basic/DiagnosticParseKinds.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1819,6 +1819,7 @@ def err_hlsl_unsupported_component : Error<"invalid component '%0' used; expecte
18191819
def err_hlsl_packoffset_invalid_reg : Error<"invalid resource class specifier '%0' for packoffset, expected 'c'">;
18201820

18211821
// HLSL Root Signature Parser Diagnostics
1822+
def err_hlsl_expected_param : Error<"expected parameter in %1(%0)">;
18221823
def err_hlsl_number_literal_overflow : Error<"integer literal is too large to be represented as a 32-bit %select{signed |}0 integer type">;
18231824
def err_hlsl_rootsig_repeat_param : Error<"specified the same parameter '%0' multiple times">;
18241825
def err_hlsl_rootsig_non_zero_flag : Error<"specified a non-zero integer as a flag">;

clang/include/clang/Lex/HLSLRootSignatureTokenKinds.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ PUNCTUATOR(equal, '=')
6868
PUNCTUATOR(plus, '+')
6969
PUNCTUATOR(minus, '-')
7070

71+
// RootSignature Keyword is only used for diagnostics:
72+
KEYWORD(RootSignature)
73+
7174
// RootElement Keywords:
7275
KEYWORD(DescriptorTable)
7376

clang/include/clang/Parse/ParseHLSLRootSignature.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,8 @@ class RootSignatureParser {
7171
/// Use NumericLiteralParser to convert CurToken.NumSpelling into a unsigned
7272
/// 32-bit integer
7373
bool HandleUIntLiteral(uint32_t &X);
74-
bool ParseRegister(llvm::hlsl::rootsig::Register *Reg);
7574
bool ParseUInt(uint32_t *X);
75+
bool ParseRegister(llvm::hlsl::rootsig::Register *Reg, TokenKind Context);
7676
bool
7777
ParseDescriptorRangeOffset(llvm::hlsl::rootsig::DescriptorRangeOffset *X);
7878

clang/lib/Parse/ParseHLSLRootSignature.cpp

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ bool RootSignatureParser::Parse() {
6161
}
6262

6363
bool RootSignatureParser::ParseRootElement() {
64-
if (ConsumeExpectedToken(TokenKind::kw_DescriptorTable))
64+
if (ConsumeExpectedToken(TokenKind::kw_DescriptorTable, diag::err_hlsl_expected_param, /*Context=*/TokenKind::kw_RootSignature))
6565
return true;
6666

6767
// Dispatch onto the correct parse method
@@ -117,7 +117,9 @@ bool RootSignatureParser::ParseDescriptorTable() {
117117

118118
bool RootSignatureParser::ParseDescriptorTableClause() {
119119
if (ConsumeExpectedToken({TokenKind::kw_CBV, TokenKind::kw_SRV,
120-
TokenKind::kw_UAV, TokenKind::kw_Sampler}))
120+
TokenKind::kw_UAV, TokenKind::kw_Sampler},
121+
diag::err_hlsl_expected_param,
122+
/*Context=*/TokenKind::kw_DescriptorTable))
121123
return true;
122124

123125
DescriptorTableClause Clause;
@@ -139,11 +141,14 @@ bool RootSignatureParser::ParseDescriptorTableClause() {
139141
}
140142
Clause.SetDefaultFlags();
141143

144+
// Store context of clause token type we are parsing
145+
TokenKind Context = CurToken.Kind;
146+
142147
if (ConsumeExpectedToken(TokenKind::pu_l_paren, diag::err_expected_after, CurToken.Kind))
143148
return true;
144149

145150
// Consume mandatory Register paramater
146-
if (ParseRegister(&Clause.Register))
151+
if (ParseRegister(&Clause.Register, Context))
147152
return true;
148153

149154
// Define optional paramaters
@@ -198,7 +203,7 @@ bool RootSignatureParser::ParseOptionalParams(
198203
llvm::SmallDenseSet<TokenKind> Seen;
199204

200205
while (TryConsumeExpectedToken(TokenKind::pu_comma)) {
201-
if (ConsumeExpectedToken(ParamKeywords))
206+
if (ConsumeExpectedToken(ParamKeywords, diag::err_hlsl_expected_param, Context))
202207
return true;
203208

204209
TokenKind ParamKind = CurToken.Kind;
@@ -239,9 +244,11 @@ bool RootSignatureParser::HandleUIntLiteral(uint32_t &X) {
239244
return false;
240245
}
241246

242-
bool RootSignatureParser::ParseRegister(Register *Register) {
247+
bool RootSignatureParser::ParseRegister(Register *Register, TokenKind Context) {
243248
if (ConsumeExpectedToken(
244-
{TokenKind::bReg, TokenKind::tReg, TokenKind::uReg, TokenKind::sReg}))
249+
{TokenKind::bReg, TokenKind::tReg, TokenKind::uReg, TokenKind::sReg},
250+
diag::err_hlsl_expected_param,
251+
Context))
245252
return true;
246253

247254
switch (CurToken.Kind) {
@@ -411,6 +418,7 @@ bool RootSignatureParser::ConsumeExpectedToken(ArrayRef<TokenKind> AnyExpected,
411418
break;
412419
case diag::err_expected_either:
413420
case diag::err_expected_after:
421+
case diag::err_hlsl_expected_param:
414422
DB << FormatTokenKinds(AnyExpected) << FormatTokenKinds({Context});
415423
break;
416424
default: break;

clang/unittests/Lex/LexHLSLRootSignatureTest.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ TEST_F(LexHLSLRootSignatureTest, ValidLexAllTokensTest) {
8585
8686
(),|=+-
8787
88+
RootSignature
89+
8890
DescriptorTable
8991
9092
CBV SRV UAV Sampler

clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ TEST_F(ParseHLSLRootSignatureTest, InvalidParseInvalidTokenTest) {
258258
hlsl::RootSignatureParser Parser(Elements, Lexer, *PP);
259259

260260
// Test correct diagnostic produced - invalid token
261-
Consumer->SetExpected(diag::err_expected);
261+
Consumer->SetExpected(diag::err_hlsl_expected_param);
262262
ASSERT_TRUE(Parser.Parse());
263263

264264
ASSERT_TRUE(Consumer->IsSatisfied());
@@ -278,7 +278,7 @@ TEST_F(ParseHLSLRootSignatureTest, InvalidParseUnexpectedEndOfStreamTest) {
278278
hlsl::RootSignatureParser Parser(Elements, Lexer, *PP);
279279

280280
// Test correct diagnostic produced - end of stream
281-
Consumer->SetExpected(diag::err_expected);
281+
Consumer->SetExpected(diag::err_hlsl_expected_param);
282282
ASSERT_TRUE(Parser.Parse());
283283

284284
ASSERT_TRUE(Consumer->IsSatisfied());

0 commit comments

Comments
 (0)