\pagebreak \section{\kcode{dispatch} Construct} \label{sec:dispatch} \index{construct!dispatch@\kcode{dispatch}} \index{dispatch construct@\kcode{dispatch} construct} \index{dispatch construct@\kcode{dispatch} construct!novariants clause@\kcode{novariants} clause} \index{clauses!novariants@\kcode{novariants}} \index{novariants clause@\kcode{novariants} clause} \index{dispatch construct@\kcode{dispatch} construct!nocontext clause@\kcode{nocontext} clause} \index{clauses!nocontext@\kcode{nocontext}} \index{nocontext clause@\kcode{nocontext} clause} The \kcode{dispatch} directive can be applied to a statement that performs a procedure call to control variant substitution for the called procedure. In the example below, the \ucode{foo_variant1()} and \ucode{foo_variant2()} procedures are declared as variants for \ucode{foo()} using the \kcode{declare variant} directive, with matching requirements specified by the \kcode{match} clause's context selector. To be selected for substitution, both variants require that the condition \ucode{foo_sub} evaluates to \plc{true}. In Cases 1 and 2, the calls to \ucode{foo()} are not controlled by a \kcode{dispatch} construct. Hence, there can be no match for the \ucode{foo_variant2()} variant. A \ucode{foo_variant1()} call is substituted for the call to \ucode{foo()} in Case 1, as the matching requirement is satisfied by \ucode{foo_sub} being \plc{true}. In Case 2, there is no variant substitution as \ucode{foo_sub} is \plc{false}. Cases 3 through 6 illustrate some uses of the \kcode{dispatch} construct, including uses of the \kcode{novariants} and \kcode{nocontext} clauses on the directive. In Case 3, variant substitution does not occur as \ucode{foo_sub} is \plc{false}. In Case 4, \ucode{foo_sub} is \plc{true} and the \kcode{dispatch} construct is part of the OpenMP context; therefore, the matching requirements for both variants to \ucode{foo()} are satisfied. As the matching requirements for the \ucode{foo_variant1()} variant are a subset of the matching requirements for the \ucode{foo_variant2()} variant (per the OpenMP specification, its computed score for matching purposes is smaller), \ucode{foo_variant2()} is selected for variant substitution. (Note that prior to OpenMP 6.0, which of the two variants are selected for substitution is implementation defined since the earlier specifications did not require an implementation to treat the \kcode{dispatch} construct as part of the OpenMP context at the call site.) In Case 5, the \kcode{novariants} clause disables variant substitution for the call to \ucode{foo()}, despite the matching requirements being satisfied for both variants. In Case 6, the \kcode{nocontext} clause directs the implementation to not include the \kcode{dispatch} construct in the OpenMP context at the call site for \ucode{foo()}. Hence, the \ucode{foo_variant2()} variant is not considered and \ucode{foo_variant1()} is instead selected for variant substitution. \cexample[6.0]{dispatch}{1} \ffreeexample[6.0]{dispatch}{1}