[clang-tools-extra] r296100 - [clang-tidy] Fix readability-redundant-declaration false positive

Daniel Marjamaki via cfe-commits cfe-commits at lists.llvm.org
Fri Feb 24 01:02:44 PST 2017


Author: danielmarjamaki
Date: Fri Feb 24 03:02:44 2017
New Revision: 296100

URL: http://llvm.org/viewvc/llvm-project?rev=296100&view=rev
Log:
[clang-tidy] Fix readability-redundant-declaration false positive

Differential Revision: https://reviews.llvm.org/D27048

Modified:
    clang-tools-extra/trunk/clang-tidy/readability/RedundantDeclarationCheck.cpp
    clang-tools-extra/trunk/test/clang-tidy/readability-redundant-declaration.cpp

Modified: clang-tools-extra/trunk/clang-tidy/readability/RedundantDeclarationCheck.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/readability/RedundantDeclarationCheck.cpp?rev=296100&r1=296099&r2=296100&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-tidy/readability/RedundantDeclarationCheck.cpp (original)
+++ clang-tools-extra/trunk/clang-tidy/readability/RedundantDeclarationCheck.cpp Fri Feb 24 03:02:44 2017
@@ -19,7 +19,10 @@ namespace tidy {
 namespace readability {
 
 void RedundantDeclarationCheck::registerMatchers(MatchFinder *Finder) {
-  Finder->addMatcher(namedDecl(anyOf(varDecl(), functionDecl())).bind("Decl"),
+  auto UnlessDefinition = unless(isDefinition());
+  Finder->addMatcher(namedDecl(anyOf(varDecl(UnlessDefinition),
+                                     functionDecl(UnlessDefinition)))
+                         .bind("Decl"),
                      this);
 }
 
@@ -41,9 +44,6 @@ void RedundantDeclarationCheck::check(co
 
   bool MultiVar = false;
   if (const auto *VD = dyn_cast<VarDecl>(D)) {
-    if (VD->getPreviousDecl()->getStorageClass() == SC_Extern &&
-        VD->getStorageClass() != SC_Extern)
-      return;
     // Is this a multivariable declaration?
     for (const auto Other : VD->getDeclContext()->decls()) {
       if (Other != D && Other->getLocStart() == VD->getLocStart()) {
@@ -51,10 +51,6 @@ void RedundantDeclarationCheck::check(co
         break;
       }
     }
-  } else {
-    const auto *FD = cast<FunctionDecl>(D);
-    if (FD->isThisDeclarationADefinition())
-      return;
   }
 
   SourceLocation EndLoc = Lexer::getLocForEndOfToken(

Modified: clang-tools-extra/trunk/test/clang-tidy/readability-redundant-declaration.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/readability-redundant-declaration.cpp?rev=296100&r1=296099&r2=296100&view=diff
==============================================================================
--- clang-tools-extra/trunk/test/clang-tidy/readability-redundant-declaration.cpp (original)
+++ clang-tools-extra/trunk/test/clang-tidy/readability-redundant-declaration.cpp Fri Feb 24 03:02:44 2017
@@ -1,9 +1,9 @@
 // RUN: %check_clang_tidy %s readability-redundant-declaration %t
 
 extern int Xyz;
-extern int Xyz;
+extern int Xyz; // Xyz
 // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: redundant 'Xyz' declaration [readability-redundant-declaration]
-// CHECK-FIXES: {{^}}{{$}}
+// CHECK-FIXES: {{^}}// Xyz{{$}}
 int Xyz = 123;
 
 extern int A;
@@ -12,19 +12,25 @@ extern int A, B;
 // CHECK-FIXES: {{^}}extern int A, B;{{$}}
 
 extern int Buf[10];
-extern int Buf[10];
+extern int Buf[10]; // Buf[10]
 // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: redundant 'Buf' declaration
-// CHECK-FIXES: {{^}}{{$}}
+// CHECK-FIXES: {{^}}// Buf[10]{{$}}
 
 static int f();
-static int f();
+static int f(); // f
 // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: redundant 'f' declaration
-// CHECK-FIXES: {{^}}{{$}}
+// CHECK-FIXES: {{^}}// f{{$}}
 static int f() {}
 
 // Original check crashed for the code below.
 namespace std {
-  typedef decltype(sizeof(0)) size_t;
+typedef decltype(sizeof(0)) size_t;
 }
-void* operator new(std::size_t) __attribute__((__externally_visible__));
-void* operator new[](std::size_t) __attribute__((__externally_visible__));
+void *operator new(std::size_t) __attribute__((__externally_visible__));
+void *operator new[](std::size_t) __attribute__((__externally_visible__));
+
+// Don't warn about static member definition.
+struct C {
+  static int I;
+};
+int C::I;




More information about the cfe-commits mailing list