Ich habe eine Funktion, die Zeiger double
als Argument hat, die als restrict
qualifiziert sind. Beachten Sie, dass der Intel-Compiler restrict
verwendet, aber wir ersetzen den Qualifier durch __restrict__
im Falle von GCC.Compiler-Fehler mit restric Qualifier auf bestimmten C++ - Compiler
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;
// ...
Dieser Code kompiliert ohne Probleme GCC oder Clang verwenden, aber der IBM Bluegene Compiler gibt den folgenden Fehler:
(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.
Ich verstehe nicht, wie man diesen Fehler interpretieren, wie ich das nicht ändern Signatur der Variablen, noch weiß ich, ob ich ein undefiniertes Verhalten einführe oder ob der IBM BlueGene Compiler falsch ist.
Beschränken ist nur ein C-Schlüsselwort, soweit ich sagen kann, ist es kein C++ - Schlüsselwort. –
@Chiel Wenn Sie die Zuweisung zur Variablen "w" entfernen, verschwindet die Warnung? Es klingt, als würde restrict im Vergleich zu den GCC/clang-Versionen nicht genau funktionieren. – Leandros
@Leandros Wenn ich eine Deklaration ohne Zuweisung einführe, löst sie keine Fehler aus. Offensichtlich mag IBM es nicht gern, einem 'doppelten * restrict' ein 'double * restrict' zuzuweisen, obwohl meiner Meinung nach kein Risiko besteht. Ich kann mir vorstellen, dass das Zuweisen eines nicht einschränkenden Zeigers zu einer eingeschränkten Variablen ein undefiniertes Verhalten auslösen kann, aber das verwirrt mich ... – Chiel