Skip to content

Commit b2a1607

Browse files
committed
remove use of strings as context and use a previous context token instead
- updates the error messages for missing '(' and ')' tokens with this approach
1 parent f457b38 commit b2a1607

File tree

4 files changed

+23
-40
lines changed

4 files changed

+23
-40
lines changed

clang/include/clang/Basic/DiagnosticParseKinds.td

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1819,7 +1819,6 @@ 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 : Error<"expected %0 as %1">;
18231822
def err_hlsl_number_literal_overflow : Error<"integer literal is too large to be represented as a 32-bit %select{signed |}0 integer type">;
18241823
def err_hlsl_rootsig_repeat_param : Error<"specified the same parameter '%0' multiple times">;
18251824
def err_hlsl_rootsig_non_zero_flag : Error<"specified a non-zero integer as a flag">;

clang/include/clang/Parse/ParseHLSLRootSignature.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,10 +116,10 @@ class RootSignatureParser {
116116
/// Returns true if there was an error reported.
117117
bool ConsumeExpectedToken(TokenKind Expected,
118118
unsigned DiagID = diag::err_expected,
119-
StringRef DiagMsg = "");
119+
TokenKind Context = TokenKind::invalid);
120120
bool ConsumeExpectedToken(ArrayRef<TokenKind> AnyExpected,
121121
unsigned DiagID = diag::err_expected,
122-
StringRef DiagMsg = "");
122+
TokenKind Context = TokenKind::invalid);
123123

124124
/// Peek if the next token is of the expected kind and if it is then consume
125125
/// it.

clang/lib/Parse/ParseHLSLRootSignature.cpp

Lines changed: 18 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -53,17 +53,15 @@ bool RootSignatureParser::Parse() {
5353
while (!ParseRootElement()) {
5454
if (Lexer.EndOfBuffer())
5555
return false;
56-
if (ConsumeExpectedToken(TokenKind::pu_comma, diag::err_expected_either,
57-
"end of root signature string"))
56+
if (ConsumeExpectedToken(TokenKind::pu_comma))
5857
return true;
5958
}
6059

6160
return true;
6261
}
6362

6463
bool RootSignatureParser::ParseRootElement() {
65-
if (ConsumeExpectedToken(TokenKind::kw_DescriptorTable,
66-
diag::err_hlsl_expected, "root element"))
64+
if (ConsumeExpectedToken(TokenKind::kw_DescriptorTable))
6765
return true;
6866

6967
// Dispatch onto the correct parse method
@@ -79,8 +77,7 @@ bool RootSignatureParser::ParseRootElement() {
7977
bool RootSignatureParser::ParseDescriptorTable() {
8078
DescriptorTable Table;
8179

82-
if (ConsumeExpectedToken(TokenKind::pu_l_paren, diag::err_expected_after,
83-
"DescriptorTable"))
80+
if (ConsumeExpectedToken(TokenKind::pu_l_paren, diag::err_expected_after, CurToken.Kind))
8481
return true;
8582

8683
// Empty case:
@@ -111,8 +108,7 @@ bool RootSignatureParser::ParseDescriptorTable() {
111108
Table.NumClauses++;
112109
} while (TryConsumeExpectedToken(TokenKind::pu_comma));
113110

114-
if (ConsumeExpectedToken(TokenKind::pu_r_paren, diag::err_expected_after,
115-
"descriptor table clauses"))
111+
if (ConsumeExpectedToken(TokenKind::pu_r_paren, diag::err_expected_after, CurToken.Kind))
116112
return true;
117113

118114
Elements.push_back(Table);
@@ -121,8 +117,7 @@ bool RootSignatureParser::ParseDescriptorTable() {
121117

122118
bool RootSignatureParser::ParseDescriptorTableClause() {
123119
if (ConsumeExpectedToken({TokenKind::kw_CBV, TokenKind::kw_SRV,
124-
TokenKind::kw_UAV, TokenKind::kw_Sampler},
125-
diag::err_hlsl_expected, "descriptor table clause"))
120+
TokenKind::kw_UAV, TokenKind::kw_Sampler}))
126121
return true;
127122

128123
DescriptorTableClause Clause;
@@ -144,8 +139,7 @@ bool RootSignatureParser::ParseDescriptorTableClause() {
144139
}
145140
Clause.SetDefaultFlags();
146141

147-
if (ConsumeExpectedToken(TokenKind::pu_l_paren, diag::err_expected_after,
148-
FormatTokenKinds({CurToken.Kind})))
142+
if (ConsumeExpectedToken(TokenKind::pu_l_paren, diag::err_expected_after, CurToken.Kind))
149143
return true;
150144

151145
// Consume mandatory Register paramater
@@ -162,8 +156,7 @@ bool RootSignatureParser::ParseDescriptorTableClause() {
162156
if (ParseOptionalParams({RefMap}))
163157
return true;
164158

165-
if (ConsumeExpectedToken(TokenKind::pu_r_paren, diag::err_expected_after,
166-
"clause parameters"))
159+
if (ConsumeExpectedToken(TokenKind::pu_r_paren, diag::err_expected_after, CurToken.Kind))
167160
return true;
168161

169162
Elements.push_back(Clause);
@@ -175,8 +168,7 @@ template <class... Ts> struct ParseMethods : Ts... { using Ts::operator()...; };
175168
template <class... Ts> ParseMethods(Ts...) -> ParseMethods<Ts...>;
176169

177170
bool RootSignatureParser::ParseParam(ParamType Ref) {
178-
if (ConsumeExpectedToken(TokenKind::pu_equal, diag::err_expected_after,
179-
FormatTokenKinds(CurToken.Kind)))
171+
if (ConsumeExpectedToken(TokenKind::pu_equal, diag::err_expected_after, CurToken.Kind))
180172
return true;
181173

182174
bool Error;
@@ -206,8 +198,7 @@ bool RootSignatureParser::ParseOptionalParams(
206198
llvm::SmallDenseSet<TokenKind> Seen;
207199

208200
while (TryConsumeExpectedToken(TokenKind::pu_comma)) {
209-
if (ConsumeExpectedToken(ParamKeywords, diag::err_hlsl_expected,
210-
"optional parameter"))
201+
if (ConsumeExpectedToken(ParamKeywords))
211202
return true;
212203

213204
TokenKind ParamKind = CurToken.Kind;
@@ -250,8 +241,7 @@ bool RootSignatureParser::HandleUIntLiteral(uint32_t &X) {
250241

251242
bool RootSignatureParser::ParseRegister(Register *Register) {
252243
if (ConsumeExpectedToken(
253-
{TokenKind::bReg, TokenKind::tReg, TokenKind::uReg, TokenKind::sReg},
254-
diag::err_hlsl_expected, "a register"))
244+
{TokenKind::bReg, TokenKind::tReg, TokenKind::uReg, TokenKind::sReg}))
255245
return true;
256246

257247
switch (CurToken.Kind) {
@@ -280,8 +270,7 @@ bool RootSignatureParser::ParseRegister(Register *Register) {
280270
bool RootSignatureParser::ParseUInt(uint32_t *X) {
281271
// Treat a postively signed integer as though it is unsigned to match DXC
282272
TryConsumeExpectedToken(TokenKind::pu_plus);
283-
if (ConsumeExpectedToken(TokenKind::int_literal, diag::err_hlsl_expected,
284-
"unsigned integer"))
273+
if (ConsumeExpectedToken(TokenKind::int_literal))
285274
return true;
286275

287276
if (HandleUIntLiteral(*X))
@@ -292,8 +281,7 @@ bool RootSignatureParser::ParseUInt(uint32_t *X) {
292281

293282
bool RootSignatureParser::ParseDescriptorRangeOffset(DescriptorRangeOffset *X) {
294283
if (ConsumeExpectedToken(
295-
{TokenKind::int_literal, TokenKind::en_DescriptorRangeOffsetAppend},
296-
diag::err_hlsl_expected, "descriptor range offset"))
284+
{TokenKind::int_literal, TokenKind::en_DescriptorRangeOffsetAppend}))
297285
return true;
298286

299287
// Edge case for the offset enum -> static value
@@ -319,8 +307,7 @@ bool RootSignatureParser::ParseEnum(
319307
EnumToks.push_back(EnumPair.first);
320308

321309
// If invoked we expect to have an enum
322-
if (ConsumeExpectedToken(EnumToks, diag::err_hlsl_expected,
323-
"parameter value"))
310+
if (ConsumeExpectedToken(EnumToks))
324311
return true;
325312

326313
// Handle the edge case when '0' is used to specify None
@@ -406,13 +393,13 @@ bool RootSignatureParser::PeekExpectedToken(ArrayRef<TokenKind> AnyExpected) {
406393

407394
bool RootSignatureParser::ConsumeExpectedToken(TokenKind Expected,
408395
unsigned DiagID,
409-
StringRef DiagMsg) {
410-
return ConsumeExpectedToken(ArrayRef{Expected}, DiagID, DiagMsg);
396+
TokenKind Context) {
397+
return ConsumeExpectedToken(ArrayRef{Expected}, DiagID, Context);
411398
}
412399

413400
bool RootSignatureParser::ConsumeExpectedToken(ArrayRef<TokenKind> AnyExpected,
414401
unsigned DiagID,
415-
StringRef DiagMsg) {
402+
TokenKind Context) {
416403
if (TryConsumeExpectedToken(AnyExpected))
417404
return false;
418405

@@ -422,14 +409,11 @@ bool RootSignatureParser::ConsumeExpectedToken(ArrayRef<TokenKind> AnyExpected,
422409
case diag::err_expected:
423410
DB << FormatTokenKinds(AnyExpected);
424411
break;
425-
case diag::err_hlsl_expected:
426412
case diag::err_expected_either:
427413
case diag::err_expected_after:
428-
DB << FormatTokenKinds(AnyExpected) << DiagMsg;
429-
break;
430-
default:
431-
DB << DiagMsg;
414+
DB << FormatTokenKinds(AnyExpected) << FormatTokenKinds({Context});
432415
break;
416+
default: break;
433417
}
434418
return true;
435419
}

clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ TEST_F(ParseHLSLRootSignatureTest, InvalidParseUnexpectedTokenTest) {
238238
hlsl::RootSignatureParser Parser(Elements, Lexer, *PP);
239239

240240
// Test correct diagnostic produced
241-
Consumer->SetExpected(diag::err_expected_either);
241+
Consumer->SetExpected(diag::err_expected);
242242
ASSERT_TRUE(Parser.Parse());
243243

244244
ASSERT_TRUE(Consumer->IsSatisfied());
@@ -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_hlsl_expected);
261+
Consumer->SetExpected(diag::err_expected);
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_hlsl_expected);
281+
Consumer->SetExpected(diag::err_expected);
282282
ASSERT_TRUE(Parser.Parse());
283283

284284
ASSERT_TRUE(Consumer->IsSatisfied());

0 commit comments

Comments
 (0)