Skip to content

Commit c3a4642

Browse files
committed
extend invalid_token diagnostic to enum parsing
1 parent bbd8921 commit c3a4642

File tree

4 files changed

+101
-25
lines changed

4 files changed

+101
-25
lines changed

clang/include/clang/Parse/ParseHLSLRootSignature.h

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -137,11 +137,16 @@ class RootSignatureParser {
137137
std::optional<float> parseFloatParam();
138138

139139
/// Parsing methods of various enums
140-
std::optional<llvm::dxbc::ShaderVisibility> parseShaderVisibility();
141-
std::optional<llvm::dxbc::SamplerFilter> parseSamplerFilter();
142-
std::optional<llvm::dxbc::TextureAddressMode> parseTextureAddressMode();
143-
std::optional<llvm::dxbc::ComparisonFunc> parseComparisonFunc();
144-
std::optional<llvm::dxbc::StaticBorderColor> parseStaticBorderColor();
140+
std::optional<llvm::dxbc::ShaderVisibility>
141+
parseShaderVisibility(RootSignatureToken::Kind Context);
142+
std::optional<llvm::dxbc::SamplerFilter>
143+
parseSamplerFilter(RootSignatureToken::Kind Context);
144+
std::optional<llvm::dxbc::TextureAddressMode>
145+
parseTextureAddressMode(RootSignatureToken::Kind Context);
146+
std::optional<llvm::dxbc::ComparisonFunc>
147+
parseComparisonFunc(RootSignatureToken::Kind Context);
148+
std::optional<llvm::dxbc::StaticBorderColor>
149+
parseStaticBorderColor(RootSignatureToken::Kind Context);
145150
std::optional<llvm::dxbc::RootDescriptorFlags> parseRootDescriptorFlags();
146151
std::optional<llvm::dxbc::DescriptorRangeFlags> parseDescriptorRangeFlags();
147152

clang/lib/Parse/ParseHLSLRootSignature.cpp

Lines changed: 40 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ std::optional<DescriptorTable> RootSignatureParser::parseDescriptorTable() {
263263
if (consumeExpectedToken(TokenKind::pu_equal))
264264
return std::nullopt;
265265

266-
Visibility = parseShaderVisibility();
266+
Visibility = parseShaderVisibility(TokenKind::kw_visibility);
267267
if (!Visibility.has_value())
268268
return std::nullopt;
269269
} else {
@@ -480,7 +480,7 @@ RootSignatureParser::parseRootConstantParams() {
480480
if (consumeExpectedToken(TokenKind::pu_equal))
481481
return std::nullopt;
482482

483-
auto Visibility = parseShaderVisibility();
483+
auto Visibility = parseShaderVisibility(TokenKind::kw_visibility);
484484
if (!Visibility.has_value())
485485
return std::nullopt;
486486
Params.Visibility = Visibility;
@@ -541,7 +541,7 @@ RootSignatureParser::parseRootDescriptorParams(TokenKind DescKind,
541541
if (consumeExpectedToken(TokenKind::pu_equal))
542542
return std::nullopt;
543543

544-
auto Visibility = parseShaderVisibility();
544+
auto Visibility = parseShaderVisibility(TokenKind::kw_visibility);
545545
if (!Visibility.has_value())
546546
return std::nullopt;
547547
Params.Visibility = Visibility;
@@ -702,7 +702,7 @@ RootSignatureParser::parseStaticSamplerParams() {
702702
if (consumeExpectedToken(TokenKind::pu_equal))
703703
return std::nullopt;
704704

705-
auto Filter = parseSamplerFilter();
705+
auto Filter = parseSamplerFilter(TokenKind::kw_filter);
706706
if (!Filter.has_value())
707707
return std::nullopt;
708708
Params.Filter = Filter;
@@ -716,7 +716,7 @@ RootSignatureParser::parseStaticSamplerParams() {
716716
if (consumeExpectedToken(TokenKind::pu_equal))
717717
return std::nullopt;
718718

719-
auto AddressU = parseTextureAddressMode();
719+
auto AddressU = parseTextureAddressMode(TokenKind::kw_addressU);
720720
if (!AddressU.has_value())
721721
return std::nullopt;
722722
Params.AddressU = AddressU;
@@ -730,7 +730,7 @@ RootSignatureParser::parseStaticSamplerParams() {
730730
if (consumeExpectedToken(TokenKind::pu_equal))
731731
return std::nullopt;
732732

733-
auto AddressV = parseTextureAddressMode();
733+
auto AddressV = parseTextureAddressMode(TokenKind::kw_addressV);
734734
if (!AddressV.has_value())
735735
return std::nullopt;
736736
Params.AddressV = AddressV;
@@ -744,7 +744,7 @@ RootSignatureParser::parseStaticSamplerParams() {
744744
if (consumeExpectedToken(TokenKind::pu_equal))
745745
return std::nullopt;
746746

747-
auto AddressW = parseTextureAddressMode();
747+
auto AddressW = parseTextureAddressMode(TokenKind::kw_addressW);
748748
if (!AddressW.has_value())
749749
return std::nullopt;
750750
Params.AddressW = AddressW;
@@ -786,7 +786,7 @@ RootSignatureParser::parseStaticSamplerParams() {
786786
if (consumeExpectedToken(TokenKind::pu_equal))
787787
return std::nullopt;
788788

789-
auto CompFunc = parseComparisonFunc();
789+
auto CompFunc = parseComparisonFunc(TokenKind::kw_comparisonFunc);
790790
if (!CompFunc.has_value())
791791
return std::nullopt;
792792
Params.CompFunc = CompFunc;
@@ -800,7 +800,7 @@ RootSignatureParser::parseStaticSamplerParams() {
800800
if (consumeExpectedToken(TokenKind::pu_equal))
801801
return std::nullopt;
802802

803-
auto BorderColor = parseStaticBorderColor();
803+
auto BorderColor = parseStaticBorderColor(TokenKind::kw_borderColor);
804804
if (!BorderColor.has_value())
805805
return std::nullopt;
806806
Params.BorderColor = BorderColor;
@@ -856,7 +856,7 @@ RootSignatureParser::parseStaticSamplerParams() {
856856
if (consumeExpectedToken(TokenKind::pu_equal))
857857
return std::nullopt;
858858

859-
auto Visibility = parseShaderVisibility();
859+
auto Visibility = parseShaderVisibility(TokenKind::kw_visibility);
860860
if (!Visibility.has_value())
861861
return std::nullopt;
862862
Params.Visibility = Visibility;
@@ -952,7 +952,7 @@ std::optional<float> RootSignatureParser::parseFloatParam() {
952952
}
953953

954954
std::optional<llvm::dxbc::ShaderVisibility>
955-
RootSignatureParser::parseShaderVisibility() {
955+
RootSignatureParser::parseShaderVisibility(TokenKind Context) {
956956
assert(CurToken.TokKind == TokenKind::pu_equal &&
957957
"Expects to only be invoked starting at given keyword");
958958

@@ -961,8 +961,12 @@ RootSignatureParser::parseShaderVisibility() {
961961
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
962962
};
963963

964-
if (!tryConsumeExpectedToken(Expected))
964+
if (!tryConsumeExpectedToken(Expected)) {
965+
consumeNextToken(); // consume token to point at invalid token
966+
reportDiag(diag::err_hlsl_invalid_token)
967+
<< /*value=*/1 << /*value of*/ Context;
965968
return std::nullopt;
969+
}
966970

967971
switch (CurToken.TokKind) {
968972
#define SHADER_VISIBILITY_ENUM(NAME, LIT) \
@@ -978,7 +982,7 @@ RootSignatureParser::parseShaderVisibility() {
978982
}
979983

980984
std::optional<llvm::dxbc::SamplerFilter>
981-
RootSignatureParser::parseSamplerFilter() {
985+
RootSignatureParser::parseSamplerFilter(TokenKind Context) {
982986
assert(CurToken.TokKind == TokenKind::pu_equal &&
983987
"Expects to only be invoked starting at given keyword");
984988

@@ -987,8 +991,12 @@ RootSignatureParser::parseSamplerFilter() {
987991
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
988992
};
989993

990-
if (!tryConsumeExpectedToken(Expected))
994+
if (!tryConsumeExpectedToken(Expected)) {
995+
consumeNextToken(); // consume token to point at invalid token
996+
reportDiag(diag::err_hlsl_invalid_token)
997+
<< /*value=*/1 << /*value of*/ Context;
991998
return std::nullopt;
999+
}
9921000

9931001
switch (CurToken.TokKind) {
9941002
#define FILTER_ENUM(NAME, LIT) \
@@ -1004,7 +1012,7 @@ RootSignatureParser::parseSamplerFilter() {
10041012
}
10051013

10061014
std::optional<llvm::dxbc::TextureAddressMode>
1007-
RootSignatureParser::parseTextureAddressMode() {
1015+
RootSignatureParser::parseTextureAddressMode(TokenKind Context) {
10081016
assert(CurToken.TokKind == TokenKind::pu_equal &&
10091017
"Expects to only be invoked starting at given keyword");
10101018

@@ -1013,8 +1021,12 @@ RootSignatureParser::parseTextureAddressMode() {
10131021
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
10141022
};
10151023

1016-
if (!tryConsumeExpectedToken(Expected))
1024+
if (!tryConsumeExpectedToken(Expected)) {
1025+
consumeNextToken(); // consume token to point at invalid token
1026+
reportDiag(diag::err_hlsl_invalid_token)
1027+
<< /*value=*/1 << /*value of*/ Context;
10171028
return std::nullopt;
1029+
}
10181030

10191031
switch (CurToken.TokKind) {
10201032
#define TEXTURE_ADDRESS_MODE_ENUM(NAME, LIT) \
@@ -1030,7 +1042,7 @@ RootSignatureParser::parseTextureAddressMode() {
10301042
}
10311043

10321044
std::optional<llvm::dxbc::ComparisonFunc>
1033-
RootSignatureParser::parseComparisonFunc() {
1045+
RootSignatureParser::parseComparisonFunc(TokenKind Context) {
10341046
assert(CurToken.TokKind == TokenKind::pu_equal &&
10351047
"Expects to only be invoked starting at given keyword");
10361048

@@ -1039,8 +1051,12 @@ RootSignatureParser::parseComparisonFunc() {
10391051
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
10401052
};
10411053

1042-
if (!tryConsumeExpectedToken(Expected))
1054+
if (!tryConsumeExpectedToken(Expected)) {
1055+
consumeNextToken(); // consume token to point at invalid token
1056+
reportDiag(diag::err_hlsl_invalid_token)
1057+
<< /*value=*/1 << /*value of*/ Context;
10431058
return std::nullopt;
1059+
}
10441060

10451061
switch (CurToken.TokKind) {
10461062
#define COMPARISON_FUNC_ENUM(NAME, LIT) \
@@ -1056,7 +1072,7 @@ RootSignatureParser::parseComparisonFunc() {
10561072
}
10571073

10581074
std::optional<llvm::dxbc::StaticBorderColor>
1059-
RootSignatureParser::parseStaticBorderColor() {
1075+
RootSignatureParser::parseStaticBorderColor(TokenKind Context) {
10601076
assert(CurToken.TokKind == TokenKind::pu_equal &&
10611077
"Expects to only be invoked starting at given keyword");
10621078

@@ -1065,8 +1081,12 @@ RootSignatureParser::parseStaticBorderColor() {
10651081
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
10661082
};
10671083

1068-
if (!tryConsumeExpectedToken(Expected))
1084+
if (!tryConsumeExpectedToken(Expected)) {
1085+
consumeNextToken(); // consume token to point at invalid token
1086+
reportDiag(diag::err_hlsl_invalid_token)
1087+
<< /*value=*/1 << /*value of*/ Context;
10691088
return std::nullopt;
1089+
}
10701090

10711091
switch (CurToken.TokKind) {
10721092
#define STATIC_BORDER_COLOR_ENUM(NAME, LIT) \

clang/test/SemaHLSL/RootSignature-err.hlsl

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,3 +67,27 @@ void bad_root_signature_13() {}
6767
// expected-error@+1 {{expected '(' after UAV}}
6868
[RootSignature("UAV invalid")]
6969
void bad_root_signature_14() {}
70+
71+
// expected-error@+1 {{invalid value of visibility}}
72+
[RootSignature("StaticSampler(s0, visibility = visibility_typo)")]
73+
void bad_root_signature_15() {}
74+
75+
// expected-error@+1 {{invalid value of filter}}
76+
[RootSignature("StaticSampler(s0, filter = filter_typo)")]
77+
void bad_root_signature_16() {}
78+
79+
// expected-error@+1 {{invalid value of addressU}}
80+
[RootSignature("StaticSampler(s0, addressU = addressU_typo)")]
81+
void bad_root_signature_17() {}
82+
83+
// expected-error@+1 {{invalid value of addressV}}
84+
[RootSignature("StaticSampler(s0, addressV = addressV_typo)")]
85+
void bad_root_signature_18() {}
86+
87+
// expected-error@+1 {{invalid value of comparisonFunc}}
88+
[RootSignature("StaticSampler(s0, comparisonFunc = comparisonFunc_typo)")]
89+
void bad_root_signature_19() {}
90+
91+
// expected-error@+1 {{invalid value of borderColor}}
92+
[RootSignature("StaticSampler(s0, borderColor = borderColor_typo)")]
93+
void bad_root_signature_20() {}

clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1401,4 +1401,31 @@ TEST_F(ParseHLSLRootSignatureTest, InvalidStaticSamplerCommaTest) {
14011401
ASSERT_TRUE(Consumer->isSatisfied());
14021402
}
14031403

1404+
TEST_F(ParseHLSLRootSignatureTest, InvalidVisibilityValueTest) {
1405+
// This test will check that an error is produced when there is a invalid
1406+
// value of a parameter
1407+
const llvm::StringLiteral Source = R"cc(
1408+
UAV(
1409+
u0,
1410+
visibility = SHADER_VISIBILITY_TYPO
1411+
)
1412+
)cc";
1413+
1414+
auto Ctx = createMinimalASTContext();
1415+
StringLiteral *Signature = wrapSource(Ctx, Source);
1416+
1417+
TrivialModuleLoader ModLoader;
1418+
auto PP = createPP(Source, ModLoader);
1419+
1420+
SmallVector<RootSignatureElement> Elements;
1421+
hlsl::RootSignatureParser Parser(RootSignatureVersion::V1_1, Elements,
1422+
Signature, *PP);
1423+
1424+
// Test correct diagnostic produced
1425+
Consumer->setExpected(diag::err_hlsl_invalid_token);
1426+
ASSERT_TRUE(Parser.parse());
1427+
1428+
ASSERT_TRUE(Consumer->isSatisfied());
1429+
}
1430+
14041431
} // anonymous namespace

0 commit comments

Comments
 (0)