r245352 - Workaround -Wdeprecated on SemDiagnosticConsumer's tricksy copy ctor.

David Blaikie via cfe-commits cfe-commits at lists.llvm.org
Tue Aug 18 14:03:08 PDT 2015


Richard, do you think there's anything we could do better here?

It seems difficult to support proper move semantic behavior for
[Sema]DiagnosticBuilder across the two common use cases:

  DiagnosticBuilder D;
  D << x;
  D << y;
  return D;

and

  return DiagnosticBuilder() << x << y;

The only thing I can imagine is if every one of those op<< were function
templates using universal references (I forget, is that the right name for
them?) and matching their return value (so in the first case, passed a
non-const lvalue ref, they return by non-const lvalue ref, and in the
second case, passed an rvalue, they return the same). But that seems
painful.


On Tue, Aug 18, 2015 at 1:54 PM, David Blaikie via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: dblaikie
> Date: Tue Aug 18 15:54:26 2015
> New Revision: 245352
>
> URL: http://llvm.org/viewvc/llvm-project?rev=245352&view=rev
> Log:
> Workaround -Wdeprecated on SemDiagnosticConsumer's tricksy copy ctor.
>
> Modified:
>     cfe/trunk/include/clang/Sema/Sema.h
>
> Modified: cfe/trunk/include/clang/Sema/Sema.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=245352&r1=245351&r2=245352&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Sema/Sema.h (original)
> +++ cfe/trunk/include/clang/Sema/Sema.h Tue Aug 18 15:54:26 2015
> @@ -1054,6 +1054,14 @@ public:
>      SemaDiagnosticBuilder(DiagnosticBuilder &DB, Sema &SemaRef, unsigned
> DiagID)
>        : DiagnosticBuilder(DB), SemaRef(SemaRef), DiagID(DiagID) { }
>
> +    // This is a cunning lie. DiagnosticBuilder actually performs move
> +    // construction in its copy constructor (but due to varied uses, it's
> not
> +    // possible to conveniently express this as actual move
> construction). So
> +    // the default copy ctor here is fine, because the base class
> disables the
> +    // source anyway, so the user-defined ~SemaDiagnosticBuilder is a
> safe no-op
> +    // in that case anwyay.
> +    SemaDiagnosticBuilder(const SemaDiagnosticBuilder&) = default;
> +
>      ~SemaDiagnosticBuilder() {
>        // If we aren't active, there is nothing to do.
>        if (!isActive()) return;
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150818/f47f3112/attachment.html>


More information about the cfe-commits mailing list