[Issue 3075] Implement parameter contravariance

d-bugmail at puremagic.com d-bugmail at puremagic.com
Sat Jan 9 14:57:34 UTC 2021


https://issues.dlang.org/show_bug.cgi?id=3075

--- Comment #31 from Bolpat <qs.il.paperinik at gmail.com> ---
In the context of Argument-dependent Attributes (ADA) or Attributes for
Higher-Order Functions (AfHOF) (pending DIPs), contravariant overloading is
necessary. Imagine a proper sink-toString interface. The whole reason to have a
sink in the first place instead of returning an allocated string is not doing
the allocation.

So, considering

  interface SinkToString
  {
      void toString(scope void delegate(char) @nogc) @nogc;
  }

the following override should work in some way:

  class C : SinkToString
  {
      override(scope void delegate(char) @nogc)
      void toString(in void delegate(char) sink) @nogc const
      { ... }
  }

The intention of the interface is: toString is @nogc and may require a @nogc
delegate for this.
An implementation of it may not require a @nogc delegate in its internal logic,
but by the reasoning explained in AfHOF, calling C.toString with a @nogc
argument will result in a @nogc execution. ADA is similar (as far as I can
tell): one would replace the @nogc of C.toString by @nogc(*).

--


More information about the Digitalmars-d-bugs mailing list