Index: clang-tools-extra/trunk/clang-tidy/readability/RedundantDeclarationCheck.cpp =================================================================== --- clang-tools-extra/trunk/clang-tidy/readability/RedundantDeclarationCheck.cpp +++ clang-tools-extra/trunk/clang-tidy/readability/RedundantDeclarationCheck.cpp @@ -19,7 +19,10 @@ 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 @@ bool MultiVar = false; if (const auto *VD = dyn_cast(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 @@ break; } } - } else { - const auto *FD = cast(D); - if (FD->isThisDeclarationADefinition()) - return; } SourceLocation EndLoc = Lexer::getLocForEndOfToken( Index: clang-tools-extra/trunk/test/clang-tidy/readability-redundant-declaration.cpp =================================================================== --- clang-tools-extra/trunk/test/clang-tidy/readability-redundant-declaration.cpp +++ clang-tools-extra/trunk/test/clang-tidy/readability-redundant-declaration.cpp @@ -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 @@ // 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;