暗黙のスコープを持たない変数を自動スコープ宣言するときに、コンパイラは、スカラーの場合は指定された順序で前述の S1 ~ S3 の規則に対して、および配列の場合は前述の A1 の規則に対して、変数の使われ方を比較検査します。規則に一致する場合、コンパイラはその規則に従って変数のスコープを決定します。規則に一致しない場合、コンパイラは次の規則を試します。コンパイラは、一致するものが見つからなかった場合は、その変数のスコープ判定を中止します。その変数のスコープは SHARED と宣言され、あたかも IF (.FALSE.) または if(0) 節が指定されているかのように結合並列領域が直列化されます。
自動スコープ宣言が失敗する理由は 2 つあります。1 つは、変数の使われ方が前述のどれにも一致しないため、もう 1 つは、ソースコードが複雑すぎて、コンパイラが十分な解析を行えないためです。こうした原因としてよくあるのは、たとえば、関数呼び出しや複雑な配列添え字、メモリー別名、ユーザー実装の同期などです。「6.5 現在の実装の既知の制限事項」を参照してください。
Fortran では、変数が __auto または default(__auto) 節を使用して自動スコープ宣言され、その変数に OpenMP 仕様に従って事前定義されたスコープがある場合、コンパイラはその事前定義されたスコープに従って変数のスコープを宣言します。
Fortran では、次の変数に事前定義されるスコープがあります。
threadprivate 指令の変数および共通ブロックは threadprivate です。
Do または並列 Do 構文の Do ループ内のループ反復変数は、その構文内では private です。
並列構文内の逐次ループでループ反復変数として使用される変数は、その並列構文内では private です。
暗黙の DO または FORALL インデックスは private です。
Cray ポインタの指示先は、Cray Fortran を関連付ける記憶領域の共有属性を継承します。
C/C++ では、変数が __auto または default(__auto) 節を使用して自動スコープ宣言され、その変数に OpenMP 仕様に従って事前定義されたスコープがある場合、コンパイラはその事前定義されたスコープに従って変数のスコープを宣言します。
C/C++ では、次の変数に事前定義されるスコープがあります。
threadprivate 指令の変数は threadprivate です。
構文内のスコープで宣言された自動記憶領域を持つ変数は private です。
割り当てられたヒープ記憶領域を持つ変数は shared です。
静的データメンバーは shared です。
for または parallel for 構文の for ループ内のループ反復変数は、その構文内では private です。
可変メンバーを持たない const-qualified 型の変数は shared です。
C および C++ の自動スコープ宣言が適用されるのは、基本データ型の 整数、浮動小数点、ポインタのみです。ユーザーが構造変数またはクラス変数の自動スコープ宣言を指定する場合、コンパイラは変数を shared としてスコープ宣言し、それを包含する並列領域は 1 つのスレッドとして実行されます。