[Syntax] Remove a strict valid source location assertion for TypeLoc.

The EndLoc of a type loc can be invalid for broken code.

Also extend the existing test to support error code with `error-ok`
annotation.

Differential Revision: https://reviews.llvm.org/D96261
This commit is contained in:
Haojian Wu 2021-02-08 15:04:48 +01:00
parent 35a5e88390
commit e159a3ced4
2 changed files with 31 additions and 12 deletions

View File

@ -294,11 +294,12 @@ static SourceRange getDeclaratorRange(const SourceManager &SM, TypeLoc T,
SourceRange Initializer) {
SourceLocation Start = GetStartLoc().Visit(T);
SourceLocation End = T.getEndLoc();
assert(End.isValid());
if (Name.isValid()) {
if (Start.isInvalid())
Start = Name;
if (SM.isBeforeInTranslationUnit(End, Name))
// End of TypeLoc could be invalid if the type is invalid, fallback to the
// NameLoc.
if (End.isInvalid() || SM.isBeforeInTranslationUnit(End, Name))
End = Name;
}
if (Initializer.isValid()) {

View File

@ -23,11 +23,9 @@ protected:
SCOPED_TRACE(llvm::join(GetParam().getCommandLineArgs(), " "));
auto *Root = buildTree(Code, GetParam());
if (Diags->getClient()->getNumErrors() != 0) {
return ::testing::AssertionFailure()
<< "Source file has syntax errors, they were printed to the test "
"log";
}
auto ErrorOK = errorOK(Code);
if (!ErrorOK)
return ErrorOK;
auto Actual = StringRef(Root->dump(Arena->getSourceManager())).trim().str();
// EXPECT_EQ shows the diff between the two strings if they are different.
EXPECT_EQ(Tree.trim().str(), Actual);
@ -45,11 +43,9 @@ protected:
auto AnnotatedCode = llvm::Annotations(CodeWithAnnotations);
auto *Root = buildTree(AnnotatedCode.code(), GetParam());
if (Diags->getClient()->getNumErrors() != 0) {
return ::testing::AssertionFailure()
<< "Source file has syntax errors, they were printed to the test "
"log";
}
auto ErrorOK = errorOK(AnnotatedCode.code());
if (!ErrorOK)
return ErrorOK;
auto AnnotatedRanges = AnnotatedCode.ranges();
if (AnnotatedRanges.size() != TreeDumps.size()) {
@ -77,6 +73,19 @@ protected:
return Failed ? ::testing::AssertionFailure()
: ::testing::AssertionSuccess();
}
private:
::testing::AssertionResult errorOK(StringRef RawCode) {
if (!RawCode.contains("error-ok")) {
if (Diags->getClient()->getNumErrors() != 0) {
return ::testing::AssertionFailure()
<< "Source file has syntax errors (suppress with /*error-ok*/), "
"they were printed to the "
"test log";
}
}
return ::testing::AssertionSuccess();
}
};
INSTANTIATE_TEST_CASE_P(SyntaxTreeTests, BuildSyntaxTreeTest,
@ -4773,6 +4782,7 @@ TEST_P(BuildSyntaxTreeTest, ParametersAndQualifiers_InFreeFunctions_Named) {
int func1([[int a]]);
int func2([[int *ap]]);
int func3([[int a, float b]]);
int func4([[undef a]]); // error-ok: no crash on invalid type
)cpp",
{R"txt(
ParameterDeclarationList Parameters
@ -4804,6 +4814,14 @@ ParameterDeclarationList Parameters
`-DeclaratorList Declarators
`-SimpleDeclarator ListElement
`-'b'
)txt",
R"txt(
ParameterDeclarationList Parameters
`-SimpleDeclaration ListElement
|-'undef'
`-DeclaratorList Declarators
`-SimpleDeclarator ListElement
`-'a'
)txt"}));
}