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コンパイラが間違っているかどうかはわかりません。
restrictは、C++キーワードではないことがわかる限り、Cキーワードです。 –
@Chiel変数wへの代入を取り除くと、警告は消えますか?制限がGCC/clangのバージョンと全く同じように動作していないようです。 – Leandros
@Leandros割り当てなしで宣言を導入すると、エラーは発生しません。明らかにIBMは、私の見解ではリスクはないが、既存の 'double * restrict'に' double * restrict'を割り当てるのは好きではありません。私は制限されていない動作を呼び出すことができます制限されていないポインタを非制限的なポインタを割り当てることが想像することができます... – Chiel