is this a bug with writeln / std.algorithm.remove?
Steven Schveighoffer
schveiguy at yahoo.com
Fri Feb 16 13:28:59 UTC 2018
On 2/16/18 8:16 AM, bauss wrote:
> On Friday, 16 February 2018 at 13:08:09 UTC, bauss wrote:
>> On Friday, 16 February 2018 at 12:15:07 UTC, arturg wrote:
>>> On Friday, 16 February 2018 at 11:45:21 UTC, arturg wrote:
>>>> this code fails to compile:
>>>>
>>>> void delegate(void*) dg;
>>>> void delegate(void*)[] dgs = [dg, dg, dg];
>>>> dgs.writeln;
>>>> dgs.remove(1).writeln();
>>>>
>>>> if you comment out dgs.writeln; it works as expected,
>>>> it works if you use other types then void*:
>>>>
>>>> void delegate(int*) dg;
>>>> void delegate(int*)[] dgs = [dg, dg, dg];
>>>> dgs.writeln;
>>>> dgs.remove(1).writeln();
>>>>
>>>>
>>>> the compiler is DMD64 D Compiler v2.078.2 and the error message is:
>>>>
>>>> /usr/include/dlang/dmd/std/algorithm/mutation.d(1929): Error:
>>>> template std.algorithm.mutation.moveAll cannot deduce function from
>>>> argument types !()(void delegate(void*)[], void delegate(void*)[]),
>>>> candidates are:
>>>> /usr/include/dlang/dmd/std/algorithm/mutation.d(1455):
>>>> std.algorithm.mutation.moveAll(InputRange1, InputRange2)(InputRange1
>>>> src, InputRange2 tgt) if (isInputRange!InputRange1 &&
>>>> isInputRange!InputRange2 && is(typeof(move(src.front, tgt.front))))
>>>> empty.d(9): Error: template instance
>>>> std.algorithm.mutation.remove!(cast(SwapStrategy)2, void
>>>> delegate(void*)[], int) error instantiating
>>>
>>> running all dmd version on run.dlang.io
>>> gives me this output:
>>>
>>> Up to 2.075.1: Success with output:
>>> -----
>>> [void delegate(void*), void delegate(void*), void delegate(void*)]
>>> [void delegate(void*), void delegate(void*)]
>>> -----
>>>
>>> Since 2.076.1: Failure with output:
>>> -----
>>> /path/to/dmd.linux/dmd2/linux/bin64/../../src/phobos/std/algorithm/mutation.d(1929):
>>> Error: template std.algorithm.mutation.moveAll cannot deduce function
>>> from argument types !()(void delegate(void*)[], void
>>> delegate(void*)[]), candidates are:
>>> /path/to/dmd.linux/dmd2/linux/bin64/../../src/phobos/std/algorithm/mutation.d(1455):
>>> std.algorithm.mutation.moveAll(InputRange1, InputRange2)(InputRange1
>>> src, InputRange2 tgt) if (isInputRange!InputRange1 &&
>>> isInputRange!InputRange2 && is(typeof(move(src.front, tgt.front))))
>>> onlineapp.d(7): Error: template instance
>>> std.algorithm.mutation.remove!(cast(SwapStrategy)2, void
>>> delegate(void*)[], int) error instantiating
>>> -----
>>
>> It's definitely a bug, the question is what change has caused it.
>
> Looking at "moveAll" which is the one that causes the error, no changes
> has been made to that which could cause this as within the last 3 months
> only changes made to it has been two asserts that has been inserted.
> Other than that has only been a documentation change a year ago and
> prior to that changes hasn't been made to it for 3 years.
>
> So it's a bug in the compiler, rather than Phobos itself.
>
Strictly speaking, this is not necessarily proof that it's in phobos,
there could have been changes elsewhere that cause one of the conditions
to fail.
However, testing this out, I found something very weird.
If you pragma(msg, isInputRange!(typeof(dgs))); inside your file, then
it compiles (and prints true for that pragma).
Makes no sense at all. Definitely seems like a compiler bug. A
pragma(msg) shouldn't affect the outcome.
-Steve
More information about the Digitalmars-d-learn
mailing list