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.Cfgpredicate condPropagateExpr(AstNode parent, ConditionalCompletion parentCompletion, AstNode child, ConditionalCompletion childCompletion)