================
@@ -9804,12 +9804,22 @@ bool InitializationSequence::Diagnose(Sema &S,
 
   case FK_ConversionFailed: {
     QualType FromType = OnlyArg->getType();
-    PartialDiagnostic PDiag = S.PDiag(diag::err_init_conversion_failed)
-      << (int)Entity.getKind()
-      << DestType
-      << OnlyArg->isLValue()
-      << FromType
-      << Args[0]->getSourceRange();
+
+    // NOTE: need to be in sync with err_init_conversion_failed
+    const auto TotalSpecialKinds = 1;
+
+    PartialDiagnostic PDiag = S.PDiag(diag::err_init_conversion_failed);
+    if (Entity.getKind() == InitializedEntity::EK_Variable &&
+        DestType.isConstQualified()) {
+      QualType NonConstDestType = DestType;
+      NonConstDestType.removeLocalConst();
+      PDiag << 0 /* a constant */
+            << NonConstDestType;
+    } else {
+      PDiag << (TotalSpecialKinds + (int)Entity.getKind()) << DestType;
+    }
+    PDiag << OnlyArg->isLValue() << FromType << Args[0]->getSourceRange();
----------------
AaronBallman wrote:

How about something along these lines (with comments)?
```
PartialDiagnostic PDiag = S.PDiag(diag::err_init_conversion_failed);
{
  llvm::SaveAndRestore _(DestType);
  unsigned EKind = (unsigned)Entity.getKind() + 1;
  if (Entity.getKind() == InitializedEntity::EK_Variable &&
        DestType.isConstQualified()) {
    EKind = 0;
    DestType.removeLocalConst();
  }

  PDiag << EKind << DestType << ...;
}
S.HandleFunctionTypeMismatch(PDiag, ...);
```

https://github.com/llvm/llvm-project/pull/82109
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to