Holds if child
is a sub expression of parent
, and whenever a last node
of child
(normally child
itself) has parent
as a successor with label
childCompletion
, then edges out of parent
must have label
parentCompletion
.
For example, for an expression !x
, when child = x
has conditional
completion c
then parent = !x
must have the dual completion of c
.
Similarly, for an expression x && y
, when child = {x, y}
has conditional
completion c
, then parent = x && y
must have the same completion of c
.
Import path
import codeql.controlflow.Cfg
predicate condPropagateExpr(AstNode parent, ConditionalCompletion parentCompletion, AstNode child, ConditionalCompletion childCompletion)