[PATCH] D141892: [clang-tidy] Implement modernize-use-constraints

Piotr Zegar via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Sat Jul 29 11:51:39 PDT 2023


PiotrZSL accepted this revision.
PiotrZSL added a comment.
This revision is now accepted and ready to land.

Overall this check is complicated, simply because it's doing complicated stuff.

1. Add description to all functions (what is their purpose, what is expected outcome, maybe put some "example")
2. Extend documentation, add "supported" constructions, (pre C++20, C++20).
3. What about boost enable_if ? Support it, or restrict check to std only.
4. What about enable_if used as an function argument ? Support it, or add some info to documentation that such construction is not supported.

I don't think that this check will ever be "perfect", so LGTM.
We got entire release to "stabilize it".



================
Comment at: clang-tools-extra/clang-tidy/modernize/UseConstraintsCheck.cpp:54
+  if (const auto Dep = TheType.getAs<DependentNameTypeLoc>()) {
+    if (Dep.getTypePtr()->getIdentifier()->getName() != "type" ||
+        Dep.getTypePtr()->getKeyword() != ETK_Typename) {
----------------
what if we do not have Identifier here ?


================
Comment at: clang-tools-extra/clang-tidy/modernize/UseConstraintsCheck.cpp:205-208
+  } else {
+    return SourceRange(EnableIf.getLAngleLoc().getLocWithOffset(1),
+                       getRAngleFileLoc(SM, EnableIf));
+  }
----------------



================
Comment at: clang-tools-extra/clang-tidy/modernize/UseConstraintsCheck.cpp:352
+  FixIts.push_back(FixItHint::CreateInsertion(
+      *ConstraintInsertionLoc, "requires " + *ConditionText + " "));
+  return FixIts;
----------------
You not checking anywhere if this optional is initialized.


================
Comment at: clang-tools-extra/docs/clang-tidy/checks/modernize/use-constraints.rst:10
+template based on type traits or other requirements. ``enable_if`` changes the
+meta-arity of the template, and has other `adverse side effects <https://open-std.org/JTC1/SC22/WG21/docs/papers/2016/p0225r0.html>`_
+in the code. C++20 introduces concepts and constraints as a cleaner language
----------------
move this link to new line, 80 characters limit


================
Comment at: clang-tools-extra/docs/clang-tidy/checks/modernize/use-constraints.rst:20-24
+  template <typename T>
+  std::enable_if_t<T::some_trait, int> only_if_t_has_the_trait() { ... }
+
+  template <typename T, std::enable_if_t<T::some_trait, int> = 0>
+  void another_version() { ... }
----------------
Put into documentation also example how this code should look in C++20.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D141892



More information about the cfe-commits mailing list