Bug 3401 – Segfault(expression.c) on invariant + method overload

Status
RESOLVED
Resolution
FIXED
Severity
regression
Priority
P2
Component
dmd
Product
D
Version
D1 (retired)
Platform
Other
OS
All
Creation time
2009-10-14T08:55:00Z
Last change time
2014-04-18T09:12:04Z
Keywords
ice-on-valid-code, patch
Assigned to
nobody
Creator
moritzwarning

Comments

Comment #0 by moritzwarning — 2009-10-14T08:55:43Z
dmd 1.049 and svn r102 crash on this code. class A { invariant { // assert (true); } void fill () { } } class B : A { void fill () { } } Program received signal SIGSEGV, Segmentation fault. VarExp (this=0x96f20c0, loc={filename = 0x96daa88 "tango.io.Buffer.d", linnum = 20}, var=0x0) at expression.c:3914 3914 this->type = var->type; Current language: auto; currently c++ (gdb) bt #0 VarExp (this=0x96f20c0, loc={filename = 0x96daa88 "tango.io.Buffer.d", linnum = 20}, var=0x0) at expression.c:3914 #1 0x080c3765 in FuncDeclaration::mergeFensure (this=0x96db4b0, sf=0x0) at func.c:1575 #2 0x080c4089 in FuncDeclaration::semantic3 (this=0x96db4b0, sc=0x96f14f8) at func.c:742 #3 0x0811948d in AggregateDeclaration::semantic3 (this=0x96db2e8, sc=0x96f14f8) at struct.c:88 #4 0x080eac3d in Module::semantic3 (this=0x96da980) at module.c:804 #5 0x080e8cf3 in main (argc=Cannot access memory at address 0x0 ) at mars.c:1115
Comment #1 by moritzwarning — 2009-10-14T08:56:46Z
The backtrace is for dmd svn r102. This ticket may also need a better title.
Comment #2 by clugdbug — 2009-10-15T01:57:40Z
Crashing in VarExp::VarExp(). var is NULL.
Comment #3 by clugdbug — 2009-10-15T02:07:03Z
func.c, line 1568 (DMD 1.050), in mergeFensure(): Need to check fdensure as well as fensure. FuncDeclaration *fdv = (FuncDeclaration *)foverrides.data[i]; sf = fdv->mergeFensure(sf); - if (fdv->fensure) + if (fdv->fensure && fdv->fdensure) { //printf("fdv->fensure: %s\n", fdv->fensure->toChars()); // Make the call: __ensure(result) Expression *eresult = NULL; Likewise in mergeFrequire, line 1524 should probably be: FuncDeclaration *fdv = (FuncDeclaration *)foverrides.data[i]; sf = fdv->mergeFrequire(sf); - if (fdv->frequire) + if (fdv->frequire && fdv->fdrequire) { //printf("fdv->frequire: %s\n", fdv->frequire->toChars()); /* Make the call: * try { __require(); } * catch { frequire; } */ Expression *eresult = NULL; Expression *e = new CallExp(loc, new VarExp(loc, fdv->fdrequire), eresult); Statement *s2 = new ExpStatement(loc, e);
Comment #4 by moritzwarning — 2009-10-15T13:02:23Z
The test case compiles and runs with dmd svn r215.
Comment #5 by moritzwarning — 2009-10-15T14:03:32Z
*** Issue 3405 has been marked as a duplicate of this issue. ***
Comment #6 by bugzilla — 2009-11-06T11:30:59Z
Fixed dmd 1.051 and 2.036