https://github.com/zyn0217 updated 
https://github.com/llvm/llvm-project/pull/238243

>From e5cc2284dfea08aaeaa60929f3b4d06a4fe336cb Mon Sep 17 00:00:00 2001
From: Younan Zhang <[email protected]>
Date: Tue, 3 Nov 2026 15:41:14 +0800
Subject: [PATCH 1/2] [clang][NFC] Don't track OpaqueValueExpr in bad
 conversion sequence

Those OVE might be allocated on stack and we have already tracked their
types for diagnostics. So let's leave them null.
---
 clang/include/clang/Sema/Overload.h                  |  8 ++------
 clang/lib/Sema/SemaInit.cpp                          | 12 +++++-------
 clang/lib/Sema/SemaOverload.cpp                      |  9 +++------
 clang/test/SemaCXX/type-traits-unsatisfied-diags.cpp |  2 +-
 4 files changed, 11 insertions(+), 20 deletions(-)

diff --git a/clang/include/clang/Sema/Overload.h 
b/clang/include/clang/Sema/Overload.h
index f280c6ffa5a810..b5a86c68ddfe5d 100644
--- a/clang/include/clang/Sema/Overload.h
+++ b/clang/include/clang/Sema/Overload.h
@@ -597,7 +597,8 @@ class Sema;
   public:
     void init(FailureKind K, Expr *From, QualType To) {
       init(K, From->getType(), To);
-      FromExpr = From;
+      if (!isa<OpaqueValueExpr>(From))
+        FromExpr = From;
     }
 
     void init(FailureKind K, QualType From, QualType To) {
@@ -610,11 +611,6 @@ class Sema;
     QualType getFromType() const { return QualType::getFromOpaquePtr(FromTy); }
     QualType getToType() const { return QualType::getFromOpaquePtr(ToTy); }
 
-    void setFromExpr(Expr *E) {
-      FromExpr = E;
-      setFromType(E->getType());
-    }
-
     void setFromType(QualType T) { FromTy = T.getAsOpaquePtr(); }
     void setToType(QualType T) { ToTy = T.getAsOpaquePtr(); }
   };
diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp
index 1cea790da1d27f..8b0c2cf5dbc856 100644
--- a/clang/lib/Sema/SemaInit.cpp
+++ b/clang/lib/Sema/SemaInit.cpp
@@ -4399,13 +4399,11 @@ static void TryArrayCopy(Sema &S, const 
InitializationKind &Kind,
   QualType InitEltT =
       S.Context.getAsArrayType(Initializer->getType())->getElementType();
 
-  // FIXME: Here's a functional memory leak cuz we don't have a temporary
-  // allocator at the moment
-  OpaqueValueExpr *OVE = new (S.Context) OpaqueValueExpr(
-      Initializer->getExprLoc(), InitEltT, Initializer->getValueKind(),
-      Initializer->getObjectKind());
-  Expr *OVEAsExpr = OVE;
-  Sequence.InitializeFrom(S, Element, Kind, OVEAsExpr,
+  OpaqueValueExpr OVE(Initializer->getExprLoc(), InitEltT,
+                      Initializer->getValueKind(),
+                      Initializer->getObjectKind());
+  Expr *OVEPtr = &OVE;
+  Sequence.InitializeFrom(S, Element, Kind, OVEPtr,
                           /*TopLevelOfInitList*/ false,
                           TreatUnavailableAsInvalid);
   if (Sequence)
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp
index 62b6ad8ffb5644..c98446703b9c04 100644
--- a/clang/lib/Sema/SemaOverload.cpp
+++ b/clang/lib/Sema/SemaOverload.cpp
@@ -6208,12 +6208,9 @@ static ImplicitConversionSequence 
TryObjectArgumentInitialization(
       ExplicitParameterType = 
Method->getFunctionObjectParameterReferenceType();
     OpaqueValueExpr TmpExpr(Loc, FromType.getNonReferenceType(),
                             ValueKindFromClassification(FromClassification));
-    ImplicitConversionSequence ICS = TryCopyInitialization(
-        S, &TmpExpr, ExplicitParameterType, SuppressUserConversion,
-        /*InOverloadResolution=*/true, false);
-    if (ICS.isBad())
-      ICS.Bad.FromExpr = nullptr;
-    return ICS;
+    return TryCopyInitialization(S, &TmpExpr, ExplicitParameterType,
+                                 SuppressUserConversion,
+                                 /*InOverloadResolution=*/true, false);
   }
 
   assert(FromType->isRecordType());
diff --git a/clang/test/SemaCXX/type-traits-unsatisfied-diags.cpp 
b/clang/test/SemaCXX/type-traits-unsatisfied-diags.cpp
index 3bde5b06a3aba4..2fa337fd7bafbb 100644
--- a/clang/test/SemaCXX/type-traits-unsatisfied-diags.cpp
+++ b/clang/test/SemaCXX/type-traits-unsatisfied-diags.cpp
@@ -339,7 +339,7 @@ static_assert(__is_constructible(S1, char*));
 // expected-error@-1 {{no matching constructor for initialization of 'S1'}} \
 // expected-note@#c-S1 {{candidate constructor (the implicit copy constructor) 
not viable: no known conversion from 'char *' to 'const S1' for 1st argument}} \
 // expected-note@#c-S1 {{candidate constructor (the implicit move constructor) 
not viable: no known conversion from 'char *' to 'S1' for 1st argument}} \
-// expected-note@#cc-S1 {{candidate constructor not viable: no known 
conversion from 'char *' to 'int' for 1st argument; dereference the argument 
with *}} \
+// expected-note@#cc-S1 {{candidate constructor not viable: no known 
conversion from 'char *' to 'int' for 1st argument}} \
 // expected-note@#c-S1 {{'S1' defined here}}
 
 struct S2 { // #c-S2

>From a262244fa34eaad469fbc6cc1c52296bff399e8e Mon Sep 17 00:00:00 2001
From: Younan Zhang <[email protected]>
Date: Tue, 3 Nov 2026 17:34:06 +0800
Subject: [PATCH 2/2] Add comment

---
 clang/include/clang/Sema/Overload.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/clang/include/clang/Sema/Overload.h 
b/clang/include/clang/Sema/Overload.h
index b5a86c68ddfe5d..69c6eadd78f1a7 100644
--- a/clang/include/clang/Sema/Overload.h
+++ b/clang/include/clang/Sema/Overload.h
@@ -597,6 +597,8 @@ class Sema;
   public:
     void init(FailureKind K, Expr *From, QualType To) {
       init(K, From->getType(), To);
+      // We may have on-stack OpaqueValueExpr when building an initialization
+      // sequence, and tracking type only is sufficient for diagnostics.
       if (!isa<OpaqueValueExpr>(From))
         FromExpr = From;
     }

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

Reply via email to