yaxunl added a comment.

In D84362#2274315 <https://reviews.llvm.org/D84362#2274315>, @aaron.ballman 
wrote:

> In D84362#2271585 <https://reviews.llvm.org/D84362#2271585>, @tra wrote:
>
>> So, the idea here is to do some sort of duck-typing and allow DiagBuilder to 
>> work with both `DiagnosticBuilder` and `PartialDiagnostic`.
>>
>> What bothers me is that unlike `Diagnostic` `PartialDiagnostic` seems to be 
>> commingling functionality of the builder with that of the diagnostic itself. 
>> I'm not sure if that's by design or just happened to be that way.
>>
>> I think a better approach would be to refactor `PartialDiagnostic` and 
>> separate the builder functionality. That should make it possible to create a 
>> common diagnostic builder base class with Partial/Full diagnostic deriving 
>> their own builder, if needed.
>>
>> That said, I'm not that familiar with the diags. Perhaps  @rtrieu 
>> @aaron.ballman would have better ideas.
>
> I'm similarly a bit uncomfortable with adding the SFINAE magic to make this 
> work instead of making a base class that will work for either kind of 
> diagnostic builder. I'm adding @rsmith to see if he has opinions as well.

There are use patterns expecting `PartialDiagnosticInst << X << Y` to continue 
to be a `PartialDiagnostic&`, e.g.

  PartialDiagnosticAt PDAt(SourceLoc, PartialDiagnosticInst << X << Y);

However if we derive PartialDiagnostic and DiagnosticBuilder from a base class 
DiagnosticBuilderBase which implements the `<<` operators, 
`PartialDiagnosticInst << X << Y` will become a `DiagnosticBuilderBase&`, then 
we can no longer write the above code.

That's one reason I use templates to implement `<<` operators.

Do we want to sacrifice this convenience?


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D84362/new/

https://reviews.llvm.org/D84362

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to