https://github.com/frank-suwen updated 
https://github.com/llvm/llvm-project/pull/186953

>From a8e66cd4b644c3277422458b750c701c3e72afd2 Mon Sep 17 00:00:00 2001
From: frank-suwen <[email protected]>
Date: Mon, 16 Mar 2026 21:49:40 -0700
Subject: [PATCH 1/4] [clang-tidy] Fix false positives for dependent
 initializers

Handle dependent initializers more conservatively in 
readability-non-const-parameter so generic lambda cases such as `T x(*p)` and 
dependent constructor calls do not trigger incorrect "pointer parameter can be 
pointer to const" warnings.  Add a regression test for a dependent constructor 
call in a generic lambda.
---
 .../readability/NonConstParameterCheck.cpp    | 24 +++++++++++++++----
 .../readability/non-const-parameter.cpp       | 14 +++++++++++
 2 files changed, 34 insertions(+), 4 deletions(-)

diff --git 
a/clang-tools-extra/clang-tidy/readability/NonConstParameterCheck.cpp 
b/clang-tools-extra/clang-tidy/readability/NonConstParameterCheck.cpp
index 9950eca3fa7bd..aeaf23fdfe52c 100644
--- a/clang-tools-extra/clang-tidy/readability/NonConstParameterCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/NonConstParameterCheck.cpp
@@ -103,10 +103,26 @@ void NonConstParameterCheck::check(const 
MatchFinder::MatchResult &Result) {
     }
   } else if (const auto *VD = Result.Nodes.getNodeAs<VarDecl>("Mark")) {
     const QualType T = VD->getType();
-    if (T->isDependentType())
-      markCanNotBeConst(VD->getInit(), false);
-    else if ((T->isPointerType() && !T->getPointeeType().isConstQualified()) ||
-             T->isArrayType() || T->isRecordType())
+    if (T->isDependentType()) {
+      const Expr *Init = VD->getInit()->IgnoreParenCasts();
+      if (const auto *U = dyn_cast<UnaryOperator>(Init);
+          U && U->getOpcode() == UO_Deref) {
+        markCanNotBeConst(U->getSubExpr(), true);
+      } else if (const auto *PLE = dyn_cast<ParenListExpr>(Init)) {
+        for (unsigned I = 0; I < PLE->getNumExprs(); ++I) {
+          const Expr *E = PLE->getExpr(I)->IgnoreParenCasts();
+          if (const auto *U = dyn_cast<UnaryOperator>(E);
+              U && U->getOpcode() == UO_Deref)
+            markCanNotBeConst(U->getSubExpr(), true);
+          else
+            markCanNotBeConst(E, true);
+        }
+      } else {
+        markCanNotBeConst(Init, true);
+      }
+    } else if ((T->isPointerType() &&
+                !T->getPointeeType().isConstQualified()) ||
+               T->isArrayType() || T->isRecordType())
       markCanNotBeConst(VD->getInit(), true);
     else if (T->isLValueReferenceType() &&
              !T->getPointeeType().isConstQualified())
diff --git 
a/clang-tools-extra/test/clang-tidy/checkers/readability/non-const-parameter.cpp
 
b/clang-tools-extra/test/clang-tidy/checkers/readability/non-const-parameter.cpp
index c07312f989cea..fc53a95cb03b0 100644
--- 
a/clang-tools-extra/test/clang-tidy/checkers/readability/non-const-parameter.cpp
+++ 
b/clang-tools-extra/test/clang-tidy/checkers/readability/non-const-parameter.cpp
@@ -372,3 +372,17 @@ void testGenericLambdaIssue177354() {
     T x(*p);
   };
 }
+
+template <typename T>
+struct DependentCtor {
+  DependentCtor(int *p);
+};
+
+void dependentInitInGenericLambda() {
+  auto lambda = []<typename T>(int *p) {
+    DependentCtor<T> s(p);
+  };
+
+  int x = 0;
+  lambda.operator()<int>(&x);
+}

>From c26097ce2435825521032651223111c6ea43004a Mon Sep 17 00:00:00 2001
From: frank-suwen <[email protected]>
Date: Tue, 17 Mar 2026 22:34:31 -0700
Subject: [PATCH 2/4] [clang-tidy] Address lint feedback (add missing braces)

---
 .../clang-tidy/readability/NonConstParameterCheck.cpp       | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git 
a/clang-tools-extra/clang-tidy/readability/NonConstParameterCheck.cpp 
b/clang-tools-extra/clang-tidy/readability/NonConstParameterCheck.cpp
index aeaf23fdfe52c..904b7dedb7496 100644
--- a/clang-tools-extra/clang-tidy/readability/NonConstParameterCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/NonConstParameterCheck.cpp
@@ -122,10 +122,10 @@ void NonConstParameterCheck::check(const 
MatchFinder::MatchResult &Result) {
       }
     } else if ((T->isPointerType() &&
                 !T->getPointeeType().isConstQualified()) ||
-               T->isArrayType() || T->isRecordType())
+               T->isArrayType() || T->isRecordType()) {
       markCanNotBeConst(VD->getInit(), true);
-    else if (T->isLValueReferenceType() &&
-             !T->getPointeeType().isConstQualified())
+    } else if (T->isLValueReferenceType() &&
+               !T->getPointeeType().isConstQualified())
       markCanNotBeConst(VD->getInit(), false);
   }
 }

>From 7d9e59bf61331de24be6ce7a7a2d7e8382ef2fee Mon Sep 17 00:00:00 2001
From: frank-suwen <[email protected]>
Date: Wed, 18 Mar 2026 21:22:42 -0700
Subject: [PATCH 3/4] [clang-tidy] Address lint feedback (add missing braces)

---
 .../clang-tidy/readability/NonConstParameterCheck.cpp          | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git 
a/clang-tools-extra/clang-tidy/readability/NonConstParameterCheck.cpp 
b/clang-tools-extra/clang-tidy/readability/NonConstParameterCheck.cpp
index 904b7dedb7496..e983ed9d48f63 100644
--- a/clang-tools-extra/clang-tidy/readability/NonConstParameterCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/NonConstParameterCheck.cpp
@@ -125,8 +125,9 @@ void NonConstParameterCheck::check(const 
MatchFinder::MatchResult &Result) {
                T->isArrayType() || T->isRecordType()) {
       markCanNotBeConst(VD->getInit(), true);
     } else if (T->isLValueReferenceType() &&
-               !T->getPointeeType().isConstQualified())
+               !T->getPointeeType().isConstQualified()) {
       markCanNotBeConst(VD->getInit(), false);
+    }
   }
 }
 

>From 8fc815feacf648e306998e6d9eaf59b723c85489 Mon Sep 17 00:00:00 2001
From: frank-suwen <[email protected]>
Date: Thu, 19 Mar 2026 22:18:47 -0700
Subject: [PATCH 4/4] [clang-tidy] Update release notes for non-const-parameter
 fix

---
 clang-tools-extra/docs/ReleaseNotes.rst | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang-tools-extra/docs/ReleaseNotes.rst 
b/clang-tools-extra/docs/ReleaseNotes.rst
index 0c487524390e3..c958d3297012c 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -230,7 +230,7 @@ Changes in existing checks
 - Improved :doc:`readability-non-const-parameter
   <clang-tidy/checks/readability/non-const-parameter>` check by avoiding false
   positives on parameters used in dependent expressions (e.g. inside generic
-  lambdas).
+  lambdas), including constructor-style dependent initializers.
 
 - Improved :doc:`readability-simplify-boolean-expr
   <clang-tidy/checks/readability/simplify-boolean-expr>` check to provide valid

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to