Author: sbenza Date: Wed Feb 17 10:13:14 2016 New Revision: 261102 URL: http://llvm.org/viewvc/llvm-project?rev=261102&view=rev Log: [clang-tidy] Match the type against the get() method we are calling, instead of a get() method we find in the class.
The duck typed smart pointer class could have overloaded get() methods and we should only skip the one that matches. Modified: clang-tools-extra/trunk/clang-tidy/readability/RedundantSmartptrGetCheck.cpp clang-tools-extra/trunk/test/clang-tidy/readability-redundant-smartptr-get.cpp Modified: clang-tools-extra/trunk/clang-tidy/readability/RedundantSmartptrGetCheck.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/readability/RedundantSmartptrGetCheck.cpp?rev=261102&r1=261101&r2=261102&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/readability/RedundantSmartptrGetCheck.cpp (original) +++ clang-tools-extra/trunk/clang-tidy/readability/RedundantSmartptrGetCheck.cpp Wed Feb 17 10:13:14 2016 @@ -25,7 +25,9 @@ internal::Matcher<Expr> callToGet(intern pointsTo(decl(OnClass).bind("ptr_to_ptr")))))) .bind("smart_pointer")), unless(callee(memberExpr(hasObjectExpression(cxxThisExpr())))), - callee(cxxMethodDecl(hasName("get")))) + callee(cxxMethodDecl( + hasName("get"), + returns(qualType(pointsTo(type().bind("getType"))))))) .bind("redundant_get"); } @@ -35,10 +37,8 @@ void registerMatchersForGetArrowStart(Ma recordDecl().bind("duck_typing"), has(cxxMethodDecl(hasName("operator->"), returns(qualType(pointsTo(type().bind("op->Type")))))), - has(cxxMethodDecl(hasName("operator*"), - returns(qualType(references(type().bind("op*Type")))))), - has(cxxMethodDecl(hasName("get"), - returns(qualType(pointsTo(type().bind("getType"))))))); + has(cxxMethodDecl(hasName("operator*"), returns(qualType(references( + type().bind("op*Type"))))))); // Catch 'ptr.get()->Foo()' Finder->addMatcher(memberExpr(expr().bind("memberExpr"), isArrow(), Modified: clang-tools-extra/trunk/test/clang-tidy/readability-redundant-smartptr-get.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/readability-redundant-smartptr-get.cpp?rev=261102&r1=261101&r2=261102&view=diff ============================================================================== --- clang-tools-extra/trunk/test/clang-tidy/readability-redundant-smartptr-get.cpp (original) +++ clang-tools-extra/trunk/test/clang-tidy/readability-redundant-smartptr-get.cpp Wed Feb 17 10:13:14 2016 @@ -44,6 +44,14 @@ struct Fail2 { int& operator*(); }; +struct PointerWithOverloadedGet { + int* get(); + template <typename T> + T* get(); + int* operator->(); + int& operator*(); +}; + void Positive() { BarPtr u; // CHECK-FIXES: BarPtr u; @@ -100,6 +108,11 @@ void Positive() { // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: redundant get() call // CHECK-MESSAGES: nullptr != ss->get(); // CHECK-FIXES: bb = nullptr != *ss; + + i = *PointerWithOverloadedGet().get(); + // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: redundant get() call + // CHECK-MESSAGES: i = *PointerWithOverloadedGet().get(); + // CHECK-FIXES: i = *PointerWithOverloadedGet(); } void Negative() { @@ -113,6 +126,8 @@ void Negative() { } }; + long l = *PointerWithOverloadedGet().get<long>(); + std::unique_ptr<Bar>* u; u->get()->Do(); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits