segfault in invariant { assert(super); }
    SimonN via Digitalmars-d-learn 
    digitalmars-d-learn at puremagic.com
       
    Sat Dec 19 20:01:43 PST 2015
    
    
  
Hi,
the following code compiles fine, then segfaults upon running.
     class Base {
         this(int) { }
     }
     class Derived : Base {
         this(int a) { super(a); }
         invariant() { assert (super); }
     }
     void main()
     {
         new Derived(5);
     }
Tested both with dmd 2.069.2 on Linux 64-bit, and on dpaste's dmd 
2.069.1:
     http://dpaste.dzfl.pl/4b9475c668f1
Backtrace on my home machine:
     Program received signal SIGSEGV, Segmentation fault.
     0x00000000004246a5 in _D9invariant12_d_invariantFC6ObjectZv ()
     (gdb) bt
     #0  0x00000000004246a5 in 
_D9invariant12_d_invariantFC6ObjectZv ()
     #1  0x0000000000647bf0 in _D3app7Derived6__initZ ()
     #2  0x00007fffff7ff030 in ?? ()
     #3  0x000000000042301f in _D3app7Derived12__invariant1MxFZv 
(this=0x0)
         at source/app.d:7
     Backtrace stopped: previous frame inner to this frame 
(corrupt stack?)
So, looks like endless recursion inside the invairant.
Questions:
1) Is this recursion expected?
2) The example is a dustmite'd version of this: I have a public 
final method Base.f(), and the compiler won't let me call f() in 
Derived's invariant. This is understandable, because f() is also 
a public method of Derived. However, I can call super.f() 
explicitly in Derived's invariant, with no compiler error. Is 
that expected to work, or should it lead to a similar segfault? 
(I get the segfault.)
-- Simon
    
    
More information about the Digitalmars-d-learn
mailing list