diff options
| -rw-r--r-- | clang-tools-extra/clang-tidy/google/ExplicitMakePairCheck.cpp | 15 | ||||
| -rw-r--r-- | clang-tools-extra/test/clang-tidy/google-explicit-make-pair.cpp | 4 |
2 files changed, 17 insertions, 2 deletions
diff --git a/clang-tools-extra/clang-tidy/google/ExplicitMakePairCheck.cpp b/clang-tools-extra/clang-tidy/google/ExplicitMakePairCheck.cpp index ae5fbd67b5f..e29b1ad6217 100644 --- a/clang-tools-extra/clang-tidy/google/ExplicitMakePairCheck.cpp +++ b/clang-tools-extra/clang-tidy/google/ExplicitMakePairCheck.cpp @@ -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); } diff --git a/clang-tools-extra/test/clang-tidy/google-explicit-make-pair.cpp b/clang-tools-extra/test/clang-tidy/google-explicit-make-pair.cpp index 4d7b209e6f5..895b8e69bf5 100644 --- a/clang-tools-extra/test/clang-tidy/google-explicit-make-pair.cpp +++ b/clang-tools-extra/test/clang-tidy/google-explicit-make-pair.cpp @@ -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); } |

