https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102409
--- Comment #1 from Tobias Burnus <burnus at gcc dot gnu.org> --- Reduced example: #define TEST(T) T #define PARALLEL(X) TEST(X) PARALLEL( for (int i = 0; i < N; i++) { \ _Pragma("omp ordered") \ S[0] += C[i] + D[i]; \ }) This gives the invalid: #pragma omp ordered for (int i = 0; i < N; i++) { S[0] += C[i] + D[i]; } However, when TEST and not PARALLEL is used, the result is as expected: for (int i = 0; i < N; i++) { #pragma omp ordered S[0] += C[i] + D[i]; }