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