.include common

destructor_is_virtual( c:node )
destructor_is_virtual( c ) :- \
    classD(c,_,_,def), \
    destructorM(dest), \
    parent( def, dest ), \
    virtualM(dest).

destructor_should_be_virtual( c:node )

destructor_should_be_virtual( c ) :- \
    classD(c,_,_,def), \
    funcD( f, _, _, _ ), \
    anc( def, f ), \
    virtualM( f ), \
    !destructor_is_virtual( c ).

destructor_should_be_virtual( c ) :- \
    classD( derived, _, _, _ ), \
    classD( c, _, _, _ ), \
    base( b, c ), \
    anc( derived, b ), \
    !destructor_is_virtual( c ).
    
destructor_should_be_virtual( C ), classD( C, N, _, _ )?
