[clang-tidy] Fix an unused-raii check crash on objective-c++.

Differential Revision: https://reviews.llvm.org/D83293
This commit is contained in:
Haojian Wu 2020-07-07 13:35:22 +02:00
parent 0d656cb25d
commit 3b1e3d2273
2 changed files with 20 additions and 3 deletions

View File

@ -27,9 +27,10 @@ void UnusedRaiiCheck::registerMatchers(MatchFinder *Finder) {
// Look for temporaries that are constructed in-place and immediately
// destroyed. Look for temporaries created by a functional cast but not for
// those returned from a call.
auto BindTemp =
cxxBindTemporaryExpr(unless(has(ignoringParenImpCasts(callExpr()))))
.bind("temp");
auto BindTemp = cxxBindTemporaryExpr(
unless(has(ignoringParenImpCasts(callExpr()))),
unless(has(ignoringParenImpCasts(objcMessageExpr()))))
.bind("temp");
Finder->addMatcher(
traverse(ast_type_traits::TK_AsIs,
exprWithCleanups(
@ -79,6 +80,7 @@ void UnusedRaiiCheck::check(const MatchFinder::MatchResult &Result) {
auto Matches =
match(expr(hasDescendant(typeLoc().bind("t"))), *E, *Result.Context);
const auto *TL = selectFirst<TypeLoc>("t", Matches);
assert(TL);
D << FixItHint::CreateInsertion(
Lexer::getLocForEndOfToken(TL->getEndLoc(), 0, *Result.SourceManager,
getLangOpts()),

View File

@ -0,0 +1,15 @@
// RUN: clang-tidy %s -checks=-*,bugprone-unused-raii -- | count 0
struct CxxClass {
~CxxClass() {}
};
@interface ObjcClass {
}
- (CxxClass)set:(int)p;
@end
void test(ObjcClass *s) {
[s set:1]; // ok, no crash, no diagnostic emitted.
return;
}