在某些C ++编译器上使用restrict限定符的编译器错误

时间:2016-04-18 13:22:19

标签: c++ restrict

我有一个函数,其double指针作为参数被限定为restrict。请注意,英特尔编译器使用restrict,但在GCC的情况下,我们会将限定符替换为__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或Clang编译时没有任何问题,但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编译器是否错误。

1 个答案:

答案 0 :(得分: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 */
  }
}