summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang-tools-extra/clang-tidy/readability/RedundantDeclarationCheck.cpp10
-rw-r--r--clang-tools-extra/test/clang-tidy/readability-redundant-declaration.c31
-rw-r--r--clang-tools-extra/test/clang-tidy/readability-redundant-declaration.cpp10
3 files changed, 49 insertions, 2 deletions
diff --git a/clang-tools-extra/clang-tidy/readability/RedundantDeclarationCheck.cpp b/clang-tools-extra/clang-tidy/readability/RedundantDeclarationCheck.cpp
index ff3809a2ff1..ab2e15b0723 100644
--- a/clang-tools-extra/clang-tidy/readability/RedundantDeclarationCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/RedundantDeclarationCheck.cpp
@@ -17,6 +17,10 @@ namespace clang {
namespace tidy {
namespace readability {
+AST_MATCHER(FunctionDecl, doesDeclarationForceExternallyVisibleDefinition) {
+ return Node.doesDeclarationForceExternallyVisibleDefinition();
+}
+
RedundantDeclarationCheck::RedundantDeclarationCheck(StringRef Name,
ClangTidyContext *Context)
: ClangTidyCheck(Name, Context),
@@ -25,8 +29,10 @@ RedundantDeclarationCheck::RedundantDeclarationCheck(StringRef Name,
void RedundantDeclarationCheck::registerMatchers(MatchFinder *Finder) {
Finder->addMatcher(
namedDecl(anyOf(varDecl(unless(isDefinition())),
- functionDecl(unless(anyOf(isDefinition(), isDefaulted(),
- hasParent(friendDecl()))))))
+ functionDecl(unless(anyOf(
+ isDefinition(), isDefaulted(),
+ doesDeclarationForceExternallyVisibleDefinition(),
+ hasParent(friendDecl()))))))
.bind("Decl"),
this);
}
diff --git a/clang-tools-extra/test/clang-tidy/readability-redundant-declaration.c b/clang-tools-extra/test/clang-tidy/readability-redundant-declaration.c
new file mode 100644
index 00000000000..21172637268
--- /dev/null
+++ b/clang-tools-extra/test/clang-tidy/readability-redundant-declaration.c
@@ -0,0 +1,31 @@
+// RUN: %check_clang_tidy %s readability-redundant-declaration %t
+
+extern int Xyz;
+extern int Xyz; // Xyz
+// CHECK-MESSAGES: :[[@LINE-1]]:12: warning: redundant 'Xyz' declaration [readability-redundant-declaration]
+// CHECK-FIXES: {{^}}// Xyz{{$}}
+int Xyz = 123;
+
+extern int A;
+extern int A, B;
+// CHECK-MESSAGES: :[[@LINE-1]]:12: warning: redundant 'A' declaration
+// CHECK-FIXES: {{^}}extern int A, B;{{$}}
+
+extern int Buf[10];
+extern int Buf[10]; // Buf[10]
+// CHECK-MESSAGES: :[[@LINE-1]]:12: warning: redundant 'Buf' declaration
+// CHECK-FIXES: {{^}}// Buf[10]{{$}}
+
+static int f();
+static int f(); // f
+// CHECK-MESSAGES: :[[@LINE-1]]:12: warning: redundant 'f' declaration
+// CHECK-FIXES: {{^}}// f{{$}}
+static int f() {}
+
+inline void g() {}
+
+inline void g();
+// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: redundant 'g' declaration
+
+// OK: Needed to emit an external definition.
+extern inline void g();
diff --git a/clang-tools-extra/test/clang-tidy/readability-redundant-declaration.cpp b/clang-tools-extra/test/clang-tidy/readability-redundant-declaration.cpp
index 83d1b5bccb2..121ee0c73c2 100644
--- a/clang-tools-extra/test/clang-tidy/readability-redundant-declaration.cpp
+++ b/clang-tools-extra/test/clang-tidy/readability-redundant-declaration.cpp
@@ -68,3 +68,13 @@ DEFINE(test);
// CHECK-FIXES: {{^}}DEFINE(test);{{$}}
} // namespace macros
+
+inline void g() {}
+
+inline void g(); // g
+// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: redundant 'g' declaration
+// CHECK-FIXES: {{^}}// g{{$}}
+
+extern inline void g(); // extern g
+// CHECK-MESSAGES: :[[@LINE-1]]:20: warning: redundant 'g' declaration
+// CHECK-FIXES: {{^}}// extern g{{$}}
OpenPOWER on IntegriCloud