.include common

var_lval( v:node, l:node )
var_lval( v, l ) :- varE( l, v ).
var_lval( v, l ) :- var_lval( v, m ), plusPlusE( l, m ).
var_lval( v, l ) :- var_lval( v, m ), minusMinusE( l, m ).
var_lval( v, l ) :- var_lval( v, m ), dotE( l, m, _ ).
var_lval( v, l ) :- \
    var_lval( v, m ), expType( m, t ), arrayT(t,_,_), arraySubscriptE( l, m, _ ).
#TODO: pointer arithmatic!!

shouldnt_be_const( v:node )
shouldnt_be_const( v ) :- var_lval( v, l ), anyAssignE( _, l, _ ).
shouldnt_be_const( v ) :- var_lval( v, l ), plusPlusE( _, l ).
shouldnt_be_const( v ) :- var_lval( v, l ), minusMinusE( _, l ).
shouldnt_be_const( v ) :- var_lval( v, l ), addressOfE( _, l).

should_be_const( v:node )
should_be_const( v ) :- varSym( v ), !shouldnt_be_const( v ).

should_be_const( V ), symbol_decl( V, D )?
