%\pagebreak \begin{fortranspecific}[4ex] \section{Passing Shared Variable to Procedure in Fortran} \label{sec:fort_shared_var} \index{clauses!shared@\kcode{shared}} \index{shared clause@\kcode{shared} clause!storage association, Fortran} Passing a shared variable to a procedure in Fortran may result in the use of temporary storage in place of the actual argument when the corresponding dummy argument does not have the \bcode{VALUE} or \bcode{CONTIGUOUS} attribute and its data-sharing attribute is implementation-defined as per the rules in Section \docref{Variables Referenced in a Region but not in a Construct} of the OpenMP Specification. These conditions effectively result in references to, and definitions of, the temporary storage during the procedure reference. Furthermore, the value of the shared variable is copied into the intervening temporary storage before the procedure reference when the dummy argument does not have the \bcode{INTENT(OUT)} attribute, and is copied out of the temporary storage into the shared variable when the dummy argument does not have the \bcode{INTENT(IN)} attribute. Any references to (or definitions of) the shared storage that is associated with the dummy argument by any other task must be synchronized with the procedure reference to avoid possible data races. The following examples illustrate the implications of passing a shared variable \ucode{a} to subroutine \ucode{sub1} or \ucode{sub2} in a \kcode{parallel} region. For \ucode{sub1}, an implementation may or may not generate a copy-in/copy-out for the temporary storage associated with variable \ucode{b}. If there is a copy-in/copy-out, the code for copy-in/copy-out will result in a race condition, even though there is an \kcode{atomic} directive for the update of variable \ucode{b(i)} in the subroutine. If the implementation can create a temporary descriptor for \ucode{a(::2)} with the correct stride and passed it to subroutine \ucode{sub1}, the same memory is accessed inside the subroutine and the result (\ucode{sum1}) is then well defined. For \ucode{sub2}, there is the \bcode{CONTIGUOUS} attribute for variable \ucode{b} and the implementation will generate a copy-in/copy-out for the temporary storage. The code will have a race condition and the result (\ucode{sum2}) is not well defined. \topmarker{Fortran} \ffreenexample{fort_shared_var}{1} \end{fortranspecific}