[clang] [clang] print correct context for diagnostics suppressed by deduction (PR #125453)

Matheus Izvekov via cfe-commits cfe-commits at lists.llvm.org
Wed Feb 5 13:22:31 PST 2025


================
@@ -1909,7 +1909,19 @@ class Sema final : public SemaBase {
   /// '\#pragma clang attribute push' directives to the given declaration.
   void AddPragmaAttributes(Scope *S, Decl *D);
 
-  void PrintPragmaAttributeInstantiationPoint();
+  using DiagFuncRef =
+      llvm::function_ref<void(SourceLocation, PartialDiagnostic)>;
+  auto getDefaultDiagFunc() {
+    return [this](SourceLocation Loc, PartialDiagnostic PD) {
----------------
mizvekov wrote:

I tried that, but I didn't like the result.

most of the uses are lines like:
```
      DiagFunc(Active->PointOfInstantiation,
               PDiag(diag::note_template_default_arg_checking)
                   << getTemplateArgumentBindingsText(TemplateParams,
                                                      Active->TemplateArgs,
                                                      Active->NumTemplateArgs)
                   << Active->InstantiationRange);
```

Which become:
```
      DiagFunc(PartialDiagnosticAt(Active->PointOfInstantiation,
               PDiag(diag::note_template_default_arg_checking)
                   << getTemplateArgumentBindingsText(TemplateParams,
                                                      Active->TemplateArgs,
                                                      Active->NumTemplateArgs)
                   << Active->InstantiationRange));
```

You can swap the explicit construction with braces, but that still looks a bit off.

On the receiving side, none of the users take a PartialDiagnosticAt anyway, so you have to decompose it.

So right now this is just adding friction to the API.

If we really wanted to do this, I think we would have to provide equivalents to all existing APIs which take a partial diagnostic, including the '<<' operator, then this would look nice, but it's a bigger cleanup which is a bit unrelated to this patch.

Ie if we had:
```C++
      DiagFunc(PDiagAt(Active->PointOfInstantiation,
                   diag::note_template_default_arg_checking)
                   << getTemplateArgumentBindingsText(TemplateParams,
                                                      Active->TemplateArgs,
                                                      Active->NumTemplateArgs)
                   << Active->InstantiationRange));
```
And:
```C++
    return [this](PartialDiagnosticAt PDA) {
      DiagnosticBuilder Builder(Diags.Report(PDA));
      PDA.Emit(Builder);
    }
```

https://github.com/llvm/llvm-project/pull/125453


More information about the cfe-commits mailing list