[dmd-internals] Three patches for recent regressions
Jason House
jason.james.house at gmail.com
Fri Sep 3 12:04:30 PDT 2010
Is this functionality safe? It looks like there's some kind of type variance going on. I'm not sure when covariance and contravariance should be allowed with D templates.
Sent from my iPhone
On Sep 3, 2010, at 2:36 PM, Don Clugston <dclugston at googlemail.com> wrote:
> On 2 September 2010 09:58, Don Clugston <dclugston at googlemail.com> wrote:
>> On 31 August 2010 11:04, Don Clugston <dclugston at googlemail.com> wrote:
>>> 4751 Regression(1.062, 2.047) ICE(constfold.c) >> after error
>>> 4753 fail_compilation/fail116.d sends dmd into a loop, exhausting memory
>>> 4771 fail_compilation/fail274.d hits a halt in iasm.c
>>>
>>> I suggest we introduce a policy for compiler releases: "No regressions
>>> more recent than 2.041/1.057".
>>> We can gradually push this back until all regressions are gone.
>>
>> There are two other regressions with patches:
>>
>> 4430 Regression(2.037) erroneous matching on specialized template function
>> 3627 -of with a filename with a double extension confuses linker
>>
>> If all those are fixed, we'll be down to 7 D2-specific regressions, 5
>> D1-specific regressions, and 2 which are common to both. (There are a
>> couple of other bugs tagged as 'regression', but which have never
>> actually worked correctly).
>>
>
> And I just created my most fun patch for a long time. Fixes 3 bugs at
> once. See bug 4173.
>
> 4173 Regression(2.037) Explicitly instantiated templates still try to
> do IFTI in some cases
> 1715 Template specialization checks for equality rather than convertibility
> 1970 Templated interfaces not matched
>
> I fixed the regression by allowing arbitrary type deduction of
> templated base classes and interfaces. This lets you do crazy stuff
> like this:
>
> interface TwoWay(A,B) {}
> class C1: TwoWay!(char, float), TwoWay!(int, float) {}
> class C2: TwoWay!(float, char) {}
> class C3 : C2, TwoWay!(int, char) {}
>
> C1 twoway;
> C3 twoway2;
> B foo(A, B)(TwoWay!(A, B) x, TwoWay!(B, A) y) { return B.init;}
>
> static assert(is(typeof(foo(twoway, twoway2)) == float));
> static assert(is(typeof(foo(twoway2, twoway)) == char));
> _______________________________________________
> dmd-internals mailing list
> dmd-internals at puremagic.com
> http://lists.puremagic.com/mailman/listinfo/dmd-internals
More information about the dmd-internals
mailing list