forked from OSchip/llvm-project
[clang-tidy] Fix a false positive in the make_pair checker if an argument has a explicit template argument.
This required a rather ugly workaround for a problem in ASTMatchers where callee() is only overloaded for Stmt and Decl but not for Expr. llvm-svn: 213509
This commit is contained in:
parent
efd14a62a3
commit
ddf36dea13
|
@ -20,6 +20,15 @@ namespace ast_matchers {
|
|||
AST_MATCHER(DeclRefExpr, hasExplicitTemplateArgs) {
|
||||
return Node.hasExplicitTemplateArgs();
|
||||
}
|
||||
|
||||
// FIXME: This should just be callee(ignoringImpCasts()) but it's not overloaded
|
||||
// for Expr.
|
||||
AST_MATCHER_P(CallExpr, calleeIgnoringParenImpCasts, internal::Matcher<Stmt>,
|
||||
InnerMatcher) {
|
||||
const Expr *ExprNode = Node.getCallee();
|
||||
return (ExprNode != nullptr &&
|
||||
InnerMatcher.matches(*ExprNode->IgnoreParenImpCasts(), Finder, Builder));
|
||||
}
|
||||
} // namespace ast_matchers
|
||||
|
||||
namespace tidy {
|
||||
|
@ -33,8 +42,10 @@ ExplicitMakePairCheck::registerMatchers(ast_matchers::MatchFinder *Finder) {
|
|||
callExpr(unless(hasAncestor(decl(anyOf(
|
||||
recordDecl(ast_matchers::isTemplateInstantiation()),
|
||||
functionDecl(ast_matchers::isTemplateInstantiation()))))),
|
||||
has(declRefExpr(hasExplicitTemplateArgs()).bind("declref")),
|
||||
callee(functionDecl(hasName("::std::make_pair")))).bind("call"),
|
||||
calleeIgnoringParenImpCasts(
|
||||
declRefExpr(hasExplicitTemplateArgs(),
|
||||
to(functionDecl(hasName("::std::make_pair"))))
|
||||
.bind("declref"))).bind("call"),
|
||||
this);
|
||||
}
|
||||
|
||||
|
|
|
@ -21,6 +21,9 @@ void templ(T a, T b) {
|
|||
// CHECK-FIXES: std::make_pair(1, 2)
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
int t();
|
||||
|
||||
void test(int i) {
|
||||
std::make_pair<int, int>(i, i);
|
||||
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: for C++11-compatibility, omit template arguments from make_pair
|
||||
|
@ -45,4 +48,5 @@ M
|
|||
templ(1U, 2U);
|
||||
|
||||
std::make_pair(i, 1); // no-warning
|
||||
std::make_pair(t<int>, 1);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue