forked from OSchip/llvm-project
[clang-tidy] readability-redundant-declaration: fix false positive with C "extern inline"
Summary: readability-redundant-declaration was diagnosing a redundant declaration on "extern inline void f();", which is needed in C code to force an external definition of the inline function f. (This is different to how inline behaves in C++). Reviewers: alexfh, danielmarjamaki Subscribers: xazax.hun, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D61700 llvm-svn: 360613
This commit is contained in:
parent
ae54fc9f04
commit
5f9afe953d
|
@ -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,7 +29,9 @@ RedundantDeclarationCheck::RedundantDeclarationCheck(StringRef Name,
|
|||
void RedundantDeclarationCheck::registerMatchers(MatchFinder *Finder) {
|
||||
Finder->addMatcher(
|
||||
namedDecl(anyOf(varDecl(unless(isDefinition())),
|
||||
functionDecl(unless(anyOf(isDefinition(), isDefaulted(),
|
||||
functionDecl(unless(anyOf(
|
||||
isDefinition(), isDefaulted(),
|
||||
doesDeclarationForceExternallyVisibleDefinition(),
|
||||
hasParent(friendDecl()))))))
|
||||
.bind("Decl"),
|
||||
this);
|
||||
|
|
|
@ -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();
|
|
@ -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{{$}}
|
||||
|
|
Loading…
Reference in New Issue