diff options
author | Ben Hamilton <benhamilton@google.com> | 2018-01-05 23:26:06 +0000 |
---|---|---|
committer | Ben Hamilton <benhamilton@google.com> | 2018-01-05 23:26:06 +0000 |
commit | 490811ec3fcd51f18ef8adeb161f0d52002aff7b (patch) | |
tree | acf401ef76c8ea50c04d6be5031a7aa1f62cf5ba | |
parent | 063e6cc5e70623ee1015912d7d5c4071b586c524 (diff) | |
download | bcm5719-llvm-490811ec3fcd51f18ef8adeb161f0d52002aff7b.tar.gz bcm5719-llvm-490811ec3fcd51f18ef8adeb161f0d52002aff7b.zip |
[clang-tidy] Function-scoped static variables should not trigger google-objc-global-variable-declaration
Summary:
google-objc-global-variable-declaration currently triggers on
valid code like:
- (void)foo {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{ /* ... */ });
}
The Google Objective-C style guide says:
http://google.github.io/styleguide/objcguide.html#common-variable-names
> File scope or global variables (as opposed to constants) declared
> outside the scope of a method or function should be rare, and should
> have the prefix g.
which is meant to insinuate that static variables inside a method or
function don't need a special name.
Test Plan: `make -j12 check-clang-tools`
Reviewers: Wizard, hokein, klimek
Reviewed By: Wizard
Subscribers: xazax.hun, cfe-commits
Differential Revision: https://reviews.llvm.org/D41789
llvm-svn: 321914
-rw-r--r-- | clang-tools-extra/clang-tidy/google/GlobalVariableDeclarationCheck.cpp | 11 | ||||
-rw-r--r-- | clang-tools-extra/test/clang-tidy/google-objc-global-variable-declaration.m | 6 |
2 files changed, 13 insertions, 4 deletions
diff --git a/clang-tools-extra/clang-tidy/google/GlobalVariableDeclarationCheck.cpp b/clang-tools-extra/clang-tidy/google/GlobalVariableDeclarationCheck.cpp index a278be14958..7507eae8b6e 100644 --- a/clang-tools-extra/clang-tidy/google/GlobalVariableDeclarationCheck.cpp +++ b/clang-tools-extra/clang-tidy/google/GlobalVariableDeclarationCheck.cpp @@ -24,6 +24,10 @@ namespace objc { namespace { +AST_MATCHER(VarDecl, isLocalVariable) { + return Node.isLocalVarDecl(); +} + FixItHint generateFixItHint(const VarDecl *Decl, bool IsConst) { char FC = Decl->getName()[0]; if (!llvm::isAlpha(FC) || Decl->getName().size() == 1) { @@ -57,12 +61,17 @@ void GlobalVariableDeclarationCheck::registerMatchers(MatchFinder *Finder) { // need to add two matchers since we need to bind different ids to distinguish // constants and variables. Since bind() can only be called on node matchers, // we cannot make it in one matcher. + // + // Note that hasGlobalStorage() matches static variables declared locally + // inside a function or method, so we need to exclude those with + // isLocalVariable(). Finder->addMatcher( varDecl(hasGlobalStorage(), unless(hasType(isConstQualified())), - unless(matchesName("::g[A-Z]"))) + unless(isLocalVariable()), unless(matchesName("::g[A-Z]"))) .bind("global_var"), this); Finder->addMatcher(varDecl(hasGlobalStorage(), hasType(isConstQualified()), + unless(isLocalVariable()), unless(matchesName("::k[A-Z]"))) .bind("global_const"), this); diff --git a/clang-tools-extra/test/clang-tidy/google-objc-global-variable-declaration.m b/clang-tools-extra/test/clang-tidy/google-objc-global-variable-declaration.m index cbe5017bb25..e2316fab4f9 100644 --- a/clang-tools-extra/test/clang-tidy/google-objc-global-variable-declaration.m +++ b/clang-tools-extra/test/clang-tidy/google-objc-global-variable-declaration.m @@ -30,12 +30,12 @@ static NSString* const k_Alpha = @"SecondNotAlpha"; // CHECK-FIXES: static NSString* const k_Alpha = @"SecondNotAlpha"; static NSString* const kGood = @"hello"; -// CHECK-MESSAGES-NOT: :[[@LINE-1]]:24: warning: const global variable 'kGood' must have a name which starts with 'k[A-Z]' [google-objc-global-variable-declaration] static NSString* gMyIntGood = 0; -// CHECK-MESSAGES-NOT: :[[@LINE-1]]:18: warning: non-const global variable 'gMyIntGood' must have a name which starts with 'g[A-Z]' [google-objc-global-variable-declaration] + @implementation Foo - (void)f { int x = 0; -// CHECK-MESSAGES-NOT: :[[@LINE-1]]:9: warning: non-const global variable 'gMyIntGood' must have a name which starts with 'g[A-Z]' [google-objc-global-variable-declaration] + static int bar; + static const int baz = 42; } @end |