[PATCH] D59540: [clang-tidy] [PR41119] readability-identifier-naming incorrectly fixes lambda capture
MyDeveloperDay via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Mar 19 03:59:26 PDT 2019
MyDeveloperDay created this revision.
MyDeveloperDay added reviewers: JonasToth, aaron.ballman, alexfh, michaelplatings.
MyDeveloperDay added a project: clang-tools-extra.
Herald added subscribers: jdoerfert, xazax.hun.
While testing clang-tidy for D59251: [Documentation] Proposal for plan to change variable names <https://reviews.llvm.org/D59251> I found that a lambda capture could get incorrectly get transformed by readability-identifier-naming when run with -fix
The following code:
bool foo() {
bool Columns=false;
auto ptr=[&] {
return Columns;
}();
return true;
}
would get transformed to (replace `[&]` with `[columns]`
bool foo() {
bool columns=false;
auto ptr=[columns] {
return columns;
}();
return true;
}
This is caused by the presence of a declrefexpr in the LambdaExpr, seeming having the location of the [&] (line 3 column 13), but also having the Name "Columns"
| -DeclRefExpr <col:13> 'bool' lvalue Var 0x55f0145f1c80 'Columns' 'bool' |
|
LambdaExpr <line:3:12, line:5:9> '(lambda at line:3:12)'
|-CXXRecordDecl <line:3:12> col:12 implicit class definition
| |-DefinitionData lambda pass_in_registers trivially_copyable can_const_default_init
| | |-DefaultConstructor
| | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
| | |-MoveConstructor exists simple trivial needs_implicit
| | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
| | |-MoveAssignment
| | `-Destructor simple irrelevant trivial
| |-FieldDecl <line:4:18> col:18 implicit 'bool &'
| |-CXXMethodDecl <line:3:14, line:5:9> line:3:12 used operator() 'auto () const -> bool' inline
| | `-CompoundStmt <col:16, line:5:9>
| | `-ReturnStmt <line:4:11, col:18>
| | `-ImplicitCastExpr <col:18> 'bool' <LValueToRValue>
| | `-DeclRefExpr <col:18> 'bool' lvalue Var 0x55f0145f1c80 'Columns' 'bool'
| `-CXXDestructorDecl <line:3:12> col:12 implicit referenced ~ 'void () noexcept' inline default trivial
|-DeclRefExpr <col:13> 'bool' lvalue Var 0x55f0145f1c80 'Columns' 'bool'
`-CompoundStmt <col:16, line:5:9>
`-ReturnStmt <line:4:11, col:18>
`-ImplicitCastExpr <col:18> 'bool' <LValueToRValue>
`-DeclRefExpr <col:18> 'bool' lvalue Var 0x55f0145f1c80 'Columns' 'bool'
The following code tries to detect the DeclRefExpr in the LambdaExpr, and not add this to the usage map
This issue is logged as https://bugs.llvm.org/show_bug.cgi?id=41119
I have retested this against lib/Clang/Format and this issue is resolved.
// Don't use this Format, if the difference between the longest and shortest
// element in a column exceeds a threshold to avoid excessive spaces.
if ([&] {
for (unsigned i = 0; i < columns - 1; ++i)
if (format.ColumnSizes[i] - minSizeInColumn[i] > 10)
return true;
return false;
}())
continue;
https://reviews.llvm.org/D59540
Files:
clang-tidy/readability/IdentifierNamingCheck.cpp
test/clang-tidy/readability-identifier-naming.cpp
Index: test/clang-tidy/readability-identifier-naming.cpp
===================================================================
--- test/clang-tidy/readability-identifier-naming.cpp
+++ test/clang-tidy/readability-identifier-naming.cpp
@@ -501,3 +501,13 @@
// CHECK-FIXES: {{^}} int * const lc_PointerB = nullptr;{{$}}
}
+
+bool Foo() {
+ bool Columns=false;
+// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: invalid case style for local variable 'Columns'
+// CHECK-FIXES: {{^}} bool columns=false;
+ auto ptr=[&]{return Columns;}();
+// CHECK-FIXES: {{^}} auto ptr=[&]{return columns;}();
+ return Columns;
+// CHECK-FIXES: {{^}} return columns;
+}
Index: clang-tidy/readability/IdentifierNamingCheck.cpp
===================================================================
--- clang-tidy/readability/IdentifierNamingCheck.cpp
+++ clang-tidy/readability/IdentifierNamingCheck.cpp
@@ -787,10 +787,22 @@
}
if (const auto *DeclRef = Result.Nodes.getNodeAs<DeclRefExpr>("declRef")) {
- SourceRange Range = DeclRef->getNameInfo().getSourceRange();
- addUsage(NamingCheckFailures, DeclRef->getDecl(), Range,
- Result.SourceManager);
- return;
+ const auto &Parents = Result.Context->getParents(*DeclRef);
+ bool LambdaDeclRef = false;
+
+ if (!Parents.empty()) {
+ const Stmt *ST = Parents[0].get<Stmt>();
+
+ if (ST && isa<LambdaExpr>(ST))
+ LambdaDeclRef = true;
+ }
+
+ if (!LambdaDeclRef) {
+ SourceRange Range = DeclRef->getNameInfo().getSourceRange();
+ addUsage(NamingCheckFailures, DeclRef->getDecl(), Range,
+ Result.SourceManager);
+ return;
+ }
}
if (const auto *Decl = Result.Nodes.getNodeAs<NamedDecl>("decl")) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D59540.191269.patch
Type: text/x-patch
Size: 1727 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190319/2f50fa31/attachment.bin>
More information about the cfe-commits
mailing list