Index: clang-tidy/misc/VirtualNearMissCheck.cpp =================================================================== --- clang-tidy/misc/VirtualNearMissCheck.cpp +++ clang-tidy/misc/VirtualNearMissCheck.cpp @@ -249,11 +249,14 @@ if (EditDistance > 0 && EditDistance <= EditDistanceThreshold) { if (checkOverrideWithoutName(Context, BaseMD, DerivedMD)) { // A "virtual near miss" is found. + auto Range = CharSourceRange::getTokenRange(SourceRange( + DerivedMD->getLocation(), DerivedMD->getLocation())); 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(); + << BaseMD->getQualifiedNameAsString() + << FixItHint::CreateReplacement(Range, BaseMD->getName()); } } } Index: test/clang-tidy/misc-virtual-near-miss.cpp =================================================================== --- test/clang-tidy/misc-virtual-near-miss.cpp +++ test/clang-tidy/misc-virtual-near-miss.cpp @@ -16,9 +16,11 @@ // 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,6 +28,7 @@ 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. @@ -58,32 +61,40 @@ 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(); };