Author: congliu Date: Thu Feb 11 10:03:27 2016 New Revision: 260532 URL: http://llvm.org/viewvc/llvm-project?rev=260532&view=rev Log: Merge branch 'arcpatch-D16922'
Modified: clang-tools-extra/trunk/clang-tidy/misc/VirtualNearMissCheck.cpp clang-tools-extra/trunk/clang-tidy/misc/VirtualNearMissCheck.h clang-tools-extra/trunk/test/clang-tidy/misc-virtual-near-miss.cpp Modified: clang-tools-extra/trunk/clang-tidy/misc/VirtualNearMissCheck.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/misc/VirtualNearMissCheck.cpp?rev=260532&r1=260531&r2=260532&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/misc/VirtualNearMissCheck.cpp (original) +++ clang-tools-extra/trunk/clang-tidy/misc/VirtualNearMissCheck.cpp Thu Feb 11 10:03:27 2016 @@ -249,11 +249,19 @@ void VirtualNearMissCheck::check(const M if (EditDistance > 0 && EditDistance <= EditDistanceThreshold) { if (checkOverrideWithoutName(Context, BaseMD, DerivedMD)) { // A "virtual near miss" is found. - diag(DerivedMD->getLocStart(), - "method '%0' has a similar name and the same signature as " - "virtual method '%1'; did you mean to override it?") + auto Range = CharSourceRange::getTokenRange( + SourceRange(DerivedMD->getLocation())); + + bool ApplyFix = !BaseMD->isTemplateInstantiation() && + !DerivedMD->isTemplateInstantiation(); + auto Diag = + diag(DerivedMD->getLocStart(), + "method '%0' has a similar name and the same signature as " + "virtual method '%1'; did you mean to override it?") << DerivedMD->getQualifiedNameAsString() << BaseMD->getQualifiedNameAsString(); + if (ApplyFix) + Diag << FixItHint::CreateReplacement(Range, BaseMD->getName()); } } } Modified: clang-tools-extra/trunk/clang-tidy/misc/VirtualNearMissCheck.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/misc/VirtualNearMissCheck.h?rev=260532&r1=260531&r2=260532&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/misc/VirtualNearMissCheck.h (original) +++ clang-tools-extra/trunk/clang-tidy/misc/VirtualNearMissCheck.h Thu Feb 11 10:03:27 2016 @@ -12,7 +12,6 @@ #include "../ClangTidy.h" #include <map> -#include <string> namespace clang { namespace tidy { @@ -46,12 +45,12 @@ private: bool isOverriddenByDerivedClass(const CXXMethodDecl *BaseMD, const CXXRecordDecl *DerivedRD); - /// key: the unique ID of a method; - /// value: whether the method is possible to be overridden. + /// Key: the unique ID of a method. + /// Value: whether the method is possible to be overridden. std::map<const CXXMethodDecl *, bool> PossibleMap; - /// key: <unique ID of base method, name of derived class> - /// value: whether the base method is overridden by some method in the derived + /// Key: <unique ID of base method, name of derived class> + /// Value: whether the base method is overridden by some method in the derived /// class. std::map<std::pair<const CXXMethodDecl *, const CXXRecordDecl *>, bool> OverriddenMap; Modified: clang-tools-extra/trunk/test/clang-tidy/misc-virtual-near-miss.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/misc-virtual-near-miss.cpp?rev=260532&r1=260531&r2=260532&view=diff ============================================================================== --- clang-tools-extra/trunk/test/clang-tidy/misc-virtual-near-miss.cpp (original) +++ clang-tools-extra/trunk/test/clang-tidy/misc-virtual-near-miss.cpp Thu Feb 11 10:03:27 2016 @@ -16,9 +16,11 @@ struct Derived : Base { // overriden by this class. virtual void funk(); // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: method 'Derived::funk' has a similar name and the same signature as virtual method 'Base::func'; did you mean to override it? [misc-virtual-near-miss] + // CHECK-FIXES: virtual void func(); void func2(); // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: method 'Derived::func2' has {{.*}} 'Base::func' + // CHECK-FIXES: void func(); void func22(); // Should not warn. @@ -26,12 +28,46 @@ struct Derived : Base { void fun(); // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: method 'Derived::fun' has {{.*}} 'Base::func' + // CHECK-FIXES: void func(); Derived &operator==(const Base &); // Should not warn: operators are ignored. virtual NoDefinedClass2 *f1(); // Should not crash: non-defined class return type is ignored. }; +template <typename T> +struct TBase { + virtual void tfunc(T t); +}; + +template <typename T> +struct TDerived : TBase<T> { + virtual void tfunk(T t); + // Should not apply fix for template. + // CHECK-MESSAGES: :[[@LINE-2]]:3: warning: method 'TDerived<double>::tfunk' has {{.*}} 'TBase<double>::tfunc' + // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: method 'TDerived<int>::tfunk' has {{.*}} 'TBase<int>::tfunc' + // CHECK-FIXES: virtual void tfunk(T t); +}; + +TDerived<int> T1; +TDerived<double> T2; + +// Should not fix macro definition +#define MACRO1 void funcM() +// CHECK-FIXES: #define MACRO1 void funcM() +#define MACRO2(m) void m() +// CHECK-FIXES: #define MACRO2(m) void m() + +struct DerivedMacro : Base { + MACRO1; + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: method 'DerivedMacro::funcM' has {{.*}} 'Base::func' + // CHECK-FIXES: MACRO1; + + MACRO2(func3); + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: method 'DerivedMacro::func3' has {{.*}} 'Base::func' + // CHECK-FIXES: MACRO2(func); +}; + typedef Derived derived_type; class Father { @@ -58,32 +94,40 @@ public: virtual void func2(); // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: method 'Child::func2' has {{.*}} 'Father::func' + // CHECK-FIXES: virtual void func(); int methoe(int x, char **strs); // Should not warn: parameter types don't match. int methoe(int x); // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: method 'Child::methoe' has {{.*}} 'Mother::method' + // CHECK-FIXES: int method(int x); void methof(int x, const char **strs); // Should not warn: return types don't match. int methoh(int x, const char **strs); // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: method 'Child::methoh' has {{.*}} 'Mother::method' + // CHECK-FIXES: int method(int x, const char **strs); virtual Child *creat(int i); // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: method 'Child::creat' has {{.*}} 'Father::create' + // CHECK-FIXES: virtual Child *create(int i); virtual Derived &&generat(); // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: method 'Child::generat' has {{.*}} 'Father::generate' + // CHECK-FIXES: virtual Derived &&generate(); int decaz(const char str[]); // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: method 'Child::decaz' has {{.*}} 'Mother::decay' + // CHECK-FIXES: int decay(const char str[]); operator bool(); derived_type *canonica(derived_type D); // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: method 'Child::canonica' has {{.*}} 'Father::canonical' + // CHECK-FIXES: derived_type *canonical(derived_type D); private: void funk(); // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: method 'Child::funk' has {{.*}} 'Father::func' + // CHECK-FIXES: void func(); }; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits