[Issue 15272] New: [2.069-rc2, inline] nothing written to output when -inline is set
    via Digitalmars-d-bugs 
    digitalmars-d-bugs at puremagic.com
       
    Sun Nov  1 10:10:31 PST 2015
    
    
  
https://issues.dlang.org/show_bug.cgi?id=15272
          Issue ID: 15272
           Summary: [2.069-rc2,inline] nothing written to output when
                    -inline is set
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P1
         Component: dmd
          Assignee: nobody at puremagic.com
          Reporter: bb.temp at gmx.com
Created attachment 1560
  --> https://issues.dlang.org/attachment.cgi?id=1560&action=edit
involed project
I have this project that compiles fine with 2.069-rc2 but doesn't work anymore.
So far I didn't manage to reduce the issue because several factors are mixed:
What happens now:
=================
nothing is written to stdout.
what should happens:
====================
stdout filled.
when does this work anyway:
===========================
1/ if I use the 'new' operator instead of my custom 'construct' template.
2/ if I disable the inline switch.
3/ if I create a File with "w" flag before writing stdout.
with the 3rd workaround being totally WTF. So maybe something in File __ctor
fix the issue ?!.
code:
=====
see attachment
shell commands:
===============
dmd
/home/basile/Dev/pasproj/Coedit/cesyms/cesyms.d
/home/basile/Dev/metad/libs/libdparse.a
-I/home/basile/Dev/metad/repos/libdparse/src
-w
-inline
-O
-release
-boundscheck=off
-of../lazproj/cesyms
Attempt to reduce:
==================
So far I'm here but it doesn't capture the essence of the problem.
---
//#!runnable-flags: -O -inline
module runnable;
import core.memory;
import std.stdio, std.array, std.conv;
import std.experimental.allocator.mallocator;
ST* construct(ST, Allocator = Mallocator, A...)(A a)
if(is(ST==struct))
{
    auto memory = Allocator.instance.allocate(ST.sizeof)[0 .. ST.sizeof];
    //GC.addRange(memory.ptr, ST.sizeof);
    return emplace!(ST, A)(memory, a);
}
struct Foo
{
    Foo*[] children;    
    void get(ref Appender!string app)
    {
        app.put("whatever");
        foreach(child; children) child.get(app);
    }
}
void main(string[] args)
{
    Appender!string app;
    Foo* foo = construct!Foo;
    foreach(i; 0..100) 
    { 
        foo.children ~= construct!Foo;
        foreach(j; 0..100) foo.children[i].children ~= construct!Foo;     
    }
    foo.get(app);
    auto s = app.data;
    assert(0, s);
} 
---
the assertion failure doesn't happen at all when GC.addRange() is commented.
Then in the real project project I've added GC.addRange() too to the
struct/class allocators but the bug still happens (empty stdout). It looks like
actually there's a crash before reaching 'write(stuff.serialize)'.
--
    
    
More information about the Digitalmars-d-bugs
mailing list