On Sunday, 6 January 2013 at 23:16:13 UTC, Phil Lavoie wrote:
since moving the constructor away seems to work correctly (-version=Working).

Mmmm... But no construction happens, empty parameters equals default .init. Perhaps it's a bug related to confusing lvalue/rvalue and it's trying to access a temporary variable outside it's scope (so it has garbage data); but even with garbage data...

  @property bool empty() {
    writeln("Empty!");
    _current = glGetError();
    return ( _current == GL_NO_ERROR );
  }
  @property GLenum front() {
    writeln("Front!");
    return _current;
  }
  void popFront() { writeln("PopFront!"); }
}

If it dies before printing 'Empty!' or 'Front!' then it could be a temporary reference variable bug (I really doubt ctor, although a garbage pointer would cause the problem too).

If it dies instead at glGetError it likely is a hidden global variable is getting messed up/not initialized (though seems unlikely).

Decompile the assembly code around the foreach loop and the working version, that will give us a definitive explanation of what's really going on.


Mmmm I wonder... __traits(compiles) allowed me to see a hidden added 'void* this;' pointer in a union; Perhaps...

 else {
    //Crashes in non defined version.
    assert(__traits(compiles, {
      foreach( GLenum err; GLErrors() ) {
        const int a;
        a++; // breaking on purpose, may show full unrolling
             // of compiler re-written code
        writeln( glError( err ) );
      }
    }));
 }

Reply via email to