2016-04-18 21 views
3

restrictとして修飾されたポインタとしてdoubleのポインタを持つ関数があります。インテルコンパイラはrestrictを使用しますが、GCCの場合は修飾子を__restrict__に置き換えます。特定のC++コンパイラでrestrict修飾子を使用したコンパイラエラー

void Stats::calc_flux_2nd(double* restrict data, 
          double* restrict datamean, 
          double* restrict w) 
{ 
    // ... 

    // Set a pointer to the field that contains w, 
    // either interpolated or the original 
    double* restrict calcw = w; 

    // ... 

このコードは、GCCやクランを使用して問題なくコンパイルしますが、IBM BlueGeneコンパイラは次のエラーを与える:私は変更しないよう

(W) Incorrect assignment of a restrict qualified pointer. 
Only outer-to-inner scope assignments between restrict pointers are 
allowed. This may result in incorrect program behavior. 

私はこのエラーを解釈する方法を理解していません私が未定義の動作を導入しているかどうか、またはIBM BlueGeneコンパイラが間違っているかどうかはわかりません。

+2

restrictは、C++キーワードではないことがわかる限り、Cキーワードです。 –

+0

@Chiel変数wへの代入を取り除くと、警告は消えますか?制限がGCC/clangのバージョンと全く同じように動作していないようです。 – Leandros

+0

@Leandros割り当てなしで宣言を導入すると、エラーは発生しません。明らかにIBMは、私の見解ではリスクはないが、既存の 'double * restrict'に' double * restrict'を割り当てるのは好きではありません。私は制限されていない動作を呼び出すことができます制限されていないポインタを非制限的なポインタを割り当てることが想像することができます... – Chiel

答えて

4

構文はIBMのXL C/C++コンパイラではサポートされていませんが、documentationにも記載されています。制限されたポインタを相互に割り当てることはできません。これを修正するには、新しいブロックスコープと新しいポインタセットを作成します。

{ 
    int * restrict x; 
    int * restrict y; 
    x = y; /* undefined */ 
    { 
    int * restrict x1 = x; /* okay */ 
    int * restrict y1 = y; /* okay */ 
    x = y1; /* undefined */ 
    } 
} 
+1

私はC++では公式のキーワードではないことを知っていますが、すべての関連するコンパイラがそれをサポートしており、それがなければ、適切にベクトル化するコードを書くことはほとんど不可能です。それにもかかわらず、IBMは未定義の動作について私に警告しています。私はそれを私たちのコードに入れないようにしたいと思います。 – Chiel

+0

私が知る限り、IBMのコンパイラはいくらかGNU Cと互換性があり、公式のCキーワードの代わりに '__restrict__'または' __restrict'を使ってみてください。 – Leandros

+1

適切なコンパイラに適切なrestrictキーワードを使用していますが、エラーはどこにありません。 – Chiel

関連する問題