Index: clang-tidy/readability/RedundantDeclarationCheck.cpp =================================================================== --- clang-tidy/readability/RedundantDeclarationCheck.cpp +++ 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: test/clang-tidy/readability-redundant-declaration.cpp =================================================================== --- test/clang-tidy/readability-redundant-declaration.cpp +++ test/clang-tidy/readability-redundant-declaration.cpp @@ -24,7 +24,13 @@ // 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;