[dmd-beta] dmd 2.051 beta
Steve Schveighoffer
schveiguy at yahoo.com
Fri Dec 17 08:25:29 PST 2010
1. I can reproduce in Windows.
2. I noticed that only that exact set of parameters causes the problem (any set
of one or two of those parameters does not fail)
3. I have *no clue* about the source of the error. The message appears to
originate from the std.process.shell function (which I'm guessing could
potentially be inlined?), but there are no calls to the shell function in your
program either directly or indirectly (phobos has only one call to shell in any
code, and that is in a std.process unit test that I verified is not being
compiled).
4. Do you need both -release and -noboundscheck? I thought -noboundscheck was
implied with -release, no? At least this might get you running again for now, I
agree we shouldn't ignore this bug though.
Without being able to understand the reason the compiler chooses to compile
shell, I can't really determine how to fix it (it does seem like a compiler bug
to me). Don maybe has found a minimal case?
I don't think there is an error in appender or put, the following code compiles
and runs fine with all the given parameters:
import std.array;
import std.range;
void main() {
Appender!string app;
put(app, "hello".dup);
}
Which is in direct conflict with the error message which says:
C:\dmd2\windows\bin\..\..\src\phobos\std\range.d(292): Error: static assert
"Cannot put a char[] into a Appender!(string)"
Now, I found some interesting weirdness inside the std.range.put function.
I'll quote the put clause that is being used to insert the char[] into the
appender with some additional printouts:
static if (hasMember!(R, "put") ||
(isPointer!R && is(pointerTarget!R == struct) &&
hasMember!(pointerTarget!R, "put")))
{
//================ I ADDDED THESE THREE LINES
pragma(msg, "isArray = "~((isArray!R) ? "yes" : "no"));
pragma(msg, "canAddElement = "~(is(typeof(r.put(e))) ? "yes" : "no"));
pragma(msg, "canAddArray = "~(is(typeof(r.put((&e)[0..1]))) ? "yes" :
"no"));
// commit to using the "put" method
static if (!isArray!R && is(typeof(r.put(e))))
{
pragma(msg, "here " ~ __LINE__.stringof); //================== line
282, I added this
r.put(e);
}
else static if (!isArray!R && is(typeof(r.put((&e)[0..1]))))
{
pragma(msg, "here " ~ __LINE__.stringof); //================== line
287 I added this
r.put((&e)[0..1]);
}
else
{
static assert(false,
"Cannot put a "~E.stringof~" into a "~R.stringof); //
============== line 292
}
}
With my added pragma msg's, the compiler does not error(!), and instead prints
this:
isArray = no
canAddElement = yes
canAddArray = yes
here 282
isArray = no
canAddElement = yes
canAddArray = yes
here 282
isArray = no
canAddElement = yes <<< this is the "normally" failing case, see below
canAddArray = no
here 282
isArray = no
canAddElement = yes
canAddArray = no
here 282
If I comment out the pragma(msg) that prints 'canAddArray', the error occurs:
isArray = no
canAddElement = yes
here 282
isArray = no
canAddElement = yes
here 282
isArray = no
canAddElement = no <<< note the difference from the non-error run!!!!
C:\dmd2\windows\bin\..\..\src\phobos\std\range.d(292): Error: static assert
"Cannot put a char[] into a Appender!(string)"
C:\dmd2\windows\bin\..\..\src\phobos\std\format.d(985): instantiated from
here: put!(Appender!(string),char[])
C:\dmd2\windows\bin\..\..\src\phobos\std\format.d(1579): instantiated
from here: formatValue!(Appender!(string),uint,immutable(char))
C:\dmd2\windows\bin\..\..\src\phobos\std\format.d(306): instantiated from
here: formatGeneric!(Appender!(string),uint,immutable(char))
C:\dmd2\windows\bin\..\..\src\phobos\std\process.d(339): instantiated
from here: formattedWrite!(Appender!(string),immutable(char),uint)
So I'm not sure what to take away from this except in these specific conditions,
the compiler has a bug. What causes the problem, I'm not sure. I tried
reordering the pragmas, but it does not matter.
I can't really do anything to fix this, it has to be a compiler fix. If you ask
me, this smells like a memory corruption issue (the unprovoked call to shell,
things changing just by reading them, etc.).
-Steve
----- Original Message ----
> From: Stephan Dilly <Dilly at Funatics.de>
> To: Discuss the dmd beta releases for D <dmd-beta at puremagic.com>
> Sent: Thu, December 16, 2010 7:02:23 PM
> Subject: Re: [dmd-beta] dmd 2.051 beta
>
> i don't know why but it still does not build with the same errors here.
> maybe a win32 only issue ? can someone reproduce this under windows ? it
> happens in almost all my projects when trying to build with these
> parameters.
More information about the dmd-beta
mailing list