[PATCH] D68539: [clang-tidy] fix for readability-identifier-naming incorrectly fixes variables which become keywords

Aaron Ballman via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Oct 9 12:23:22 PDT 2019


aaron.ballman added inline comments.


================
Comment at: clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp:865
 
+      IdentifierTable &Idents = Decl->getASTContext().Idents;
+      auto CheckNewIdentifier = Idents.find(Fixup);
----------------
Can this be `const IdentifierTable&`?


================
Comment at: clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp:868
+      if (CheckNewIdentifier != Idents.end() &&
+          CheckNewIdentifier->second->isKeyword(getLangOpts())) {
+        Failure.FixStatus = ShouldFixStatus::ConflictsWithKeyword;
----------------
What if changing it would switch to using a macro instead of a keyword? e.g.,
```
#define foo 12

void func(int Foo); // Changing Foo to foo would be bad, no?
```


================
Comment at: clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp:940
+        std::string CannotFixReason =
+            std::string(". Cannot be fixed because '") + Failure.Fixup +
+            "' would conflict with a language keyword";
----------------
Diagnostics are not full sentences, so the full stop and capitalization are wrong here. I think this should be combined with the diagnostic above using a `%select`.
```
auto Diag = diag(Decl.first, "invalid case style for %0 '%1'%select{; cannot be fixed because '%3' would conflict with a keyword|}2")
                  << Failure.KindName << Decl.second << (Failure.FixStatus != ShouldFixStatus::ConflictsWithKeyword) << Failure.Fixup;
```


================
Comment at: clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.h:69
+    ShouldFix,
+    InsideMacro, /// if the identifier was used or declared within a macro we
+                 /// won't offer a fixup for safety reasons.
----------------
if -> If


================
Comment at: clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.h:72
+    ConflictsWithKeyword /// The fixup will conflict with a language keyword, so
+                         /// we can't fix it automatically
+  };
----------------
Missing a full stop at the end of the comment.


================
Comment at: clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.h:88
+
+    bool ShouldNotify() const {
+      return (FixStatus == ShouldFixStatus::ShouldFix ||
----------------
This seems a bit confusing to me. It seems like the reason to not generate a fixit is being used to determine whether to diagnose at all, which seems incorrect despite sort of being what the old code did.


================
Comment at: clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.h:89
+    bool ShouldNotify() const {
+      return (FixStatus == ShouldFixStatus::ShouldFix ||
+              FixStatus == ShouldFixStatus::ConflictsWithKeyword);
----------------
Drop the parens.


================
Comment at: clang-tools-extra/test/clang-tidy/readability-identifier-naming-bugfix-name-conflicts.cpp:16
+}
\ No newline at end of file

----------------
Please add the newline to the end of the file.


================
Comment at: clang/include/clang/Basic/IdentifierTable.h:584
 
+  iterator find(StringRef Name) const { return HashTable.find(Name); }
+
----------------
Is this actually needed? Pretty sure you can use `std::find(table.begin(), table.end(), Name);` at the call site (or something similar).


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D68539/new/

https://reviews.llvm.org/D68539





More information about the cfe-commits mailing list