[PATCH] D72362: [clang-tidy] misc-no-recursion: a new check
Aaron Ballman via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Feb 12 10:24:44 PST 2020
aaron.ballman added inline comments.
================
Comment at: clang-tools-extra/clang-tidy/misc/NoRecursionCheck.cpp:28
+// 2. it is immutable, the way it was constructed it will stay.
+template <typename T, unsigned SmallSize> class ImmutableSmartSet {
+ ArrayRef<T> Vector;
----------------
"Smart" is not a descriptive term. This seems like it's an `ImmutableSmallSet`?
================
Comment at: clang-tools-extra/clang-tidy/misc/NoRecursionCheck.cpp:64
+ return llvm::find(Vector, V) == Vector.end() ? 0 : 1;
+ } else {
+ return Set.count(V);
----------------
No `else` after `return`.
================
Comment at: clang-tools-extra/clang-tidy/misc/NoRecursionCheck.cpp:70
+
+template <typename T, unsigned SmallSize> class SmartSmallSetVector {
+public:
----------------
Same complaint here about `Smart` -- should probably just be a `SmallSetVector`.
================
Comment at: clang-tools-extra/clang-tidy/misc/NoRecursionCheck.cpp:203
+ Decl *D = N->getDecl();
+ diag(D->getLocation(), "function '%0' is part of call graph loop")
+ << cast<NamedDecl>(D)->getName();
----------------
I think "call graph loop" is a bit much for a diagnostic -- how about `%0 is within a recursive call chain` or something along those lines?
================
Comment at: clang-tools-extra/clang-tidy/misc/NoRecursionCheck.cpp:204
+ diag(D->getLocation(), "function '%0' is part of call graph loop")
+ << cast<NamedDecl>(D)->getName();
+ }
----------------
Drop the call to `getName()` and remove the single quotes from the diagnostic around `%0`, and just pass in the `NamedDecl` -- the diagnostics engine will do the right thing (and it gives better names for strange things like operators).
================
Comment at: clang-tools-extra/clang-tidy/misc/NoRecursionCheck.cpp:230
+ diag(CycleEntryFn->getLocation(),
+ "Example call graph loop, starting from function '%0'",
+ DiagnosticIDs::Note)
----------------
Example -> example
I think "call graph group" might be a bit much for a diagnostic -- how about `example recursive call chain, starting from %0`
================
Comment at: clang-tools-extra/clang-tidy/misc/NoRecursionCheck.cpp:232
+ DiagnosticIDs::Note)
+ << cast<NamedDecl>(CycleEntryFn)->getName();
+ for (int CurFrame = 1, NumFrames = CyclicCallStack.size();
----------------
Same here (and elsewhere, I'll stop commenting on them).
================
Comment at: clang-tools-extra/clang-tidy/misc/NoRecursionCheck.cpp:249-250
+ diag(CyclicCallStack.back().CallExpr->getBeginLoc(),
+ "... which was the starting point of this call graph."
+ " This report is non-exhaustive, there may be other cycles.",
+ DiagnosticIDs::Note);
----------------
Diagnostic text should not be full sentences.
`... which was the starting point of the recursive call chain; there may be other cycles`
================
Comment at: clang-tools-extra/clang-tidy/misc/NoRecursionCheck.cpp:259
+ CG.addToCallGraph(const_cast<TranslationUnitDecl *>(TU));
+ // CG.viewGraph();
+
----------------
Remove commented out code.
================
Comment at: clang-tools-extra/docs/clang-tidy/checks/misc-no-recursion.rst:8
+that are loops), diagnoses each function in the cycle,
+and displays one example of possible call graph loop (recursion).
----------------
Eugene.Zelenko wrote:
> It'll be reasonable to add links to relevant coding guidelines.
Agreed.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D72362/new/
https://reviews.llvm.org/D72362
More information about the cfe-commits
mailing list