Skip to content

Commit 0ef3f27

Browse files
committed
[clang] Fail for empty names in is*DerivedFrom matchers.
Differential Revision: https://reviews.llvm.org/D65279 llvm-svn: 367022
1 parent 2488ae9 commit 0ef3f27

File tree

2 files changed

+13
-3
lines changed

2 files changed

+13
-3
lines changed

clang/include/clang/ASTMatchers/ASTMatchers.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2639,7 +2639,8 @@ AST_MATCHER_P(CXXRecordDecl, isDerivedFrom,
26392639

26402640
/// Overloaded method as shortcut for \c isDerivedFrom(hasName(...)).
26412641
AST_MATCHER_P_OVERLOAD(CXXRecordDecl, isDerivedFrom, std::string, BaseName, 1) {
2642-
assert(!BaseName.empty());
2642+
if (BaseName.empty())
2643+
return false;
26432644
return isDerivedFrom(hasName(BaseName)).matches(Node, Finder, Builder);
26442645
}
26452646

@@ -2655,7 +2656,8 @@ AST_MATCHER_P_OVERLOAD(CXXRecordDecl, isSameOrDerivedFrom,
26552656
/// \c isSameOrDerivedFrom(hasName(...)).
26562657
AST_MATCHER_P_OVERLOAD(CXXRecordDecl, isSameOrDerivedFrom, std::string,
26572658
BaseName, 1) {
2658-
assert(!BaseName.empty());
2659+
if (BaseName.empty())
2660+
return false;
26592661
return isSameOrDerivedFrom(hasName(BaseName)).matches(Node, Finder, Builder);
26602662
}
26612663

@@ -2687,7 +2689,8 @@ AST_MATCHER_P_OVERLOAD(CXXRecordDecl, isDirectlyDerivedFrom,
26872689
/// Overloaded method as shortcut for \c isDirectlyDerivedFrom(hasName(...)).
26882690
AST_MATCHER_P_OVERLOAD(CXXRecordDecl, isDirectlyDerivedFrom, std::string,
26892691
BaseName, 1) {
2690-
assert(!BaseName.empty());
2692+
if (BaseName.empty())
2693+
return false;
26912694
return isDirectlyDerivedFrom(hasName(BaseName))
26922695
.matches(Node, Finder, Builder);
26932696
}

clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -566,6 +566,13 @@ TEST(DeclarationMatcher, ClassIsDerived) {
566566
cxxRecordDecl(isDerivedFrom(namedDecl(hasName("X"))))));
567567
}
568568

569+
TEST(DeclarationMatcher, IsDerivedFromEmptyName) {
570+
const char *const Code = "class X {}; class Y : public X {};";
571+
EXPECT_TRUE(notMatches(Code, cxxRecordDecl(isDerivedFrom(""))));
572+
EXPECT_TRUE(notMatches(Code, cxxRecordDecl(isDirectlyDerivedFrom(""))));
573+
EXPECT_TRUE(notMatches(Code, cxxRecordDecl(isSameOrDerivedFrom(""))));
574+
}
575+
569576
TEST(DeclarationMatcher, IsLambda) {
570577
const auto IsLambda = cxxMethodDecl(ofClass(cxxRecordDecl(isLambda())));
571578
EXPECT_TRUE(matches("auto x = []{};", IsLambda));

0 commit comments

Comments
 (0)