[dmd-beta] dmd 2.051 beta

Stephan Dilly Dilly at funatics.de
Fri Dec 17 08:35:48 PST 2010


I see this is a very weird problem but i have the same errors with my 
current code base even at some placed when i do not use -release -inline 
-noboundscheck and that makes this release unusable for me if it stays 
like this. problem is that i cannot reduce it to a small testcase case 
.. if i change a bit (and the codebase is big) it suddenly disappears.

I think it is a major issue especially because it smells like mem 
corruption or something and it should not be shipped like that.


On 17.12.2010 17:25, Steve Schveighoffer wrote:
> 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.
>
>
> _______________________________________________
> dmd-beta mailing list
> dmd-beta at puremagic.com
> http://lists.puremagic.com/mailman/listinfo/dmd-beta
>



More information about the dmd-beta mailing list