[clang-tools-extra] d458f34 - [clang-tidy] Fix `bugprone-incorrect-enable-if` inserting duplicate `typename` (#190899)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Apr 9 18:22:57 PDT 2026
Author: Victor Chernyakin
Date: 2026-04-10T01:22:51Z
New Revision: d458f34b6dbab9e5ad6ba8a34791e80eeaf5c3b1
URL: https://github.com/llvm/llvm-project/commit/d458f34b6dbab9e5ad6ba8a34791e80eeaf5c3b1
DIFF: https://github.com/llvm/llvm-project/commit/d458f34b6dbab9e5ad6ba8a34791e80eeaf5c3b1.diff
LOG: [clang-tidy] Fix `bugprone-incorrect-enable-if` inserting duplicate `typename` (#190899)
This PR resolves one of our FIXME's. Pre-C++20, this check turns
```cpp
typename std::enable_if<...>
```
into
```cpp
typename typename std::enable_if<...>::type
```
instead of
```cpp
typename std::enable_if<...>::type
```
Added:
Modified:
clang-tools-extra/clang-tidy/bugprone/IncorrectEnableIfCheck.cpp
clang-tools-extra/docs/ReleaseNotes.rst
clang-tools-extra/test/clang-tidy/checkers/bugprone/incorrect-enable-if.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/clang-tidy/bugprone/IncorrectEnableIfCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/IncorrectEnableIfCheck.cpp
index 6181ac84f36e3..5a592e10a599e 100644
--- a/clang-tools-extra/clang-tidy/bugprone/IncorrectEnableIfCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/IncorrectEnableIfCheck.cpp
@@ -47,8 +47,8 @@ void IncorrectEnableIfCheck::check(const MatchFinder::MatchResult &Result) {
Result.Nodes.getNodeAs<TemplateSpecializationTypeLoc>(
"enable_if_specialization");
- if (!EnableIf || !EnableIfSpecializationLoc)
- return;
+ assert(EnableIf);
+ assert(EnableIfSpecializationLoc);
const SourceManager &SM = *Result.SourceManager;
const SourceLocation RAngleLoc =
@@ -57,9 +57,8 @@ void IncorrectEnableIfCheck::check(const MatchFinder::MatchResult &Result) {
auto Diag = diag(EnableIf->getBeginLoc(),
"incorrect std::enable_if usage detected; use "
"'typename std::enable_if<...>::type'");
- // FIXME: This should handle the enable_if specialization already having an
- // elaborated keyword.
- if (!getLangOpts().CPlusPlus20) {
+ if (!getLangOpts().CPlusPlus20 &&
+ EnableIfSpecializationLoc->getElaboratedKeywordLoc().isInvalid()) {
Diag << FixItHint::CreateInsertion(EnableIfSpecializationLoc->getBeginLoc(),
"typename ");
}
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index caf0275035064..7b47643a47c75 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -252,6 +252,12 @@ Changes in existing checks
positive when increment/decrement operators appear inside lambda bodies that
are part of a condition expression.
+- Improved :doc:`bugprone-incorrect-enable-if
+ <clang-tidy/checks/bugprone/incorrect-enable-if>` check to not
+ insert an extraneous ``typename`` on code like
+ ``typename std::enable_if<...>``, where there's already a ``typename`` and
+ only the ``::type`` at the end is missing.
+
- Improved :doc:`bugprone-macro-parentheses
<clang-tidy/checks/bugprone/macro-parentheses>` check by printing the macro
definition in the warning message if the macro is defined on command line.
diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/incorrect-enable-if.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/incorrect-enable-if.cpp
index 0c418efe1420b..81612a50e5bbd 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/bugprone/incorrect-enable-if.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/incorrect-enable-if.cpp
@@ -42,6 +42,12 @@ void invalid_multiple() {}
// CHECK-FIXES: template <typename T, typename = typename std::enable_if<T::some_value>::type, typename = typename std::enable_if<T::other_value>::type>
// CHECK-FIXES-CXX20: template <typename T, typename = std::enable_if<T::some_value>::type, typename = std::enable_if<T::other_value>::type>
+template <typename T, typename = typename std::enable_if<T::some_value>>
+void invalid_typename_keyword() {}
+// CHECK-MESSAGES: [[@LINE-2]]:23: warning: incorrect std::enable_if usage detected; use 'typename std::enable_if<...>::type' [bugprone-incorrect-enable-if]
+// CHECK-FIXES: template <typename T, typename = typename std::enable_if<T::some_value>::type>
+// CHECK-FIXES-CXX20: template <typename T, typename = typename std::enable_if<T::some_value>::type>
+
template <typename T, typename = std::enable_if<T::some_value>>
struct InvalidClass {};
// CHECK-MESSAGES: [[@LINE-2]]:23: warning: incorrect std::enable_if usage detected; use 'typename std::enable_if<...>::type' [bugprone-incorrect-enable-if]
More information about the cfe-commits
mailing list