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. ***