dual-context deprecation

12345swordy alexanderheistermann at gmail.com
Mon May 17 14:47:02 UTC 2021


On Monday, 17 May 2021 at 14:35:51 UTC, Steven Schveighoffer 
wrote:
> On 5/17/21 9:47 AM, jmh530 wrote:
>> The code below (simplified from my actual problem) generates a 
>> warning that member function b "requires a dual-context, which 
>> is deprecated".
>> 
>> However when I look at the list of deprecated features [1], 
>> I'm not seeing which one this is referring to. Is it a valid 
>> deprecation?
>> 
>> I could only find this [2] reference to dual-contexts, which 
>> suggests that the problem relates to passing aliases into 
>> member functions. Moving it to a member function fixes the 
>> problem. Alternately, I could make the alias part of Foo's 
>> type. My use case it is just a little easier structured like 
>> this, but I get that there are workarounds.
>> 
>> My bigger question is about why it isn't listed more than 
>> anything. I.e., should I file something in bugzilla.
>> 
>> ```d
>> struct Foo
>> {
>>      double a;
>> 
>>      this(double x)
>>      {
>>          this.a = x;
>>      }
>> 
>>      double b(alias inverse)()
>>      {
>>          return inverse(a);
>>      }
>> }
>> 
>> void main()
>> {
>>      auto foo = Foo(2.0);
>>      auto x = foo.b!(a => (10.0 ^^ a))();
>> }
>> ```
>
> The feature is deprecated in its current form. The issue as I 
> understand it (i.e. very little) is that compilers other than 
> DMD could not use this same way to implement dual contexts, and 
> so they could not have the feature. This means that valid code 
> in DMD would not compile on GDC or LDC.
>
> The way forward was to deprecate the mechanism used to 
> implement it for DMD, and at some point tackle it in a 
> backend-agnostic way.
>
> Personally, I don't know why we can't fix it so that it's 
> portable, but I understand so little about compilers that I've 
> pretty much stayed out of it. The feature is very much needed.
>
> -Steve

The dual context that warning is referring to is vthis2, which 
the gdc maintainer struggle to implemented for the gdc compiler. 
A correct fix involves templates having their own context.

-Alex


More information about the Digitalmars-d-learn mailing list