@@ -1117,16 +1117,44 @@ ReturnPosition getReturnPosition(ReturnNodeExt ret) {
11171117 result = getReturnPosition0 ( ret , ret .getKind ( ) )
11181118}
11191119
1120+ /**
1121+ * Checks whether `inner` can return to `call` in the call context `innercc`.
1122+ * Assumes a context of `inner = viableCallableExt(call)`.
1123+ */
11201124bindingset [ innercc, inner, call]
11211125predicate checkCallContextReturn ( CallContext innercc , DataFlowCallable inner , DataFlowCall call ) {
1122- resolveReturn ( innercc , inner , call )
1126+ innercc instanceof CallContextAny
1127+ or
1128+ exists ( DataFlowCallable c0 , DataFlowCall call0 |
1129+ callEnclosingCallable ( call0 , inner ) and
1130+ innercc = TReturn ( c0 , call0 ) and
1131+ c0 = prunedViableImplInCallContextReverse ( call0 , call )
1132+ )
11231133}
11241134
1135+ /**
1136+ * Checks whether `call` can resolve to `calltarget` in the call context `cc`.
1137+ * Assumes a context of `calltarget = viableCallableExt(call)`.
1138+ */
11251139bindingset [ cc, call, calltarget]
11261140predicate checkCallContextCall ( CallContext cc , DataFlowCall call , DataFlowCallable calltarget ) {
1127- calltarget = resolveCall ( call , cc )
1141+ exists ( DataFlowCall ctx | cc = TSpecificCall ( ctx ) |
1142+ if reducedViableImplInCallContext ( call , _, ctx )
1143+ then calltarget = prunedViableImplInCallContext ( call , ctx )
1144+ else any ( )
1145+ )
1146+ or
1147+ cc instanceof CallContextSomeCall
1148+ or
1149+ cc instanceof CallContextAny
1150+ or
1151+ cc instanceof CallContextReturn
11281152}
11291153
1154+ /**
1155+ * Resolves a return from `callable` in `cc` to `call`. This is equivalent to
1156+ * `callable = viableCallableExt(call) and checkCallContextReturn(cc, callable, call)`.
1157+ */
11301158bindingset [ cc, callable]
11311159predicate resolveReturn ( CallContext cc , DataFlowCallable callable , DataFlowCall call ) {
11321160 cc instanceof CallContextAny and callable = viableCallableExt ( call )
@@ -1138,6 +1166,10 @@ predicate resolveReturn(CallContext cc, DataFlowCallable callable, DataFlowCall
11381166 )
11391167}
11401168
1169+ /**
1170+ * Resolves a call from `call` in `cc` to `result`. This is equivalent to
1171+ * `result = viableCallableExt(call) and checkCallContextCall(cc, call, result)`.
1172+ */
11411173bindingset [ call, cc]
11421174DataFlowCallable resolveCall ( DataFlowCall call , CallContext cc ) {
11431175 exists ( DataFlowCall ctx | cc = TSpecificCall ( ctx ) |
0 commit comments