https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91517

--- Comment #2 from Peter Boyle <paboyle at ph dot ed.ac.uk> ---
GCC preprocessor moves location of _Pragma operator in sequence in a variadic
macro:
Simpler case:

#define thread_for( i, num, ... )  for ( uint64_t i=0;i<num;i++) { __VA_ARGS__
}

thread_for(i,N,{
    _Pragma("omp critical") { a+=i; }
});


for(uint64_t i=0;i<N;i++) { _Pragma("omp critical"){ a+=i;} }

Produces:

# 1 "tmp.cc"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "tmp.cc"

#pragma omp critical
# 3 "tmp.cc"
for ( uint64_t i=0;i<N;i++) { { { a+=i; } } }

  ;

for(uint64_t i=0;i<N;i++) {
# 8 "tmp.cc"
#pragma omp critical
# 8 "tmp.cc"
 { a+=i;} }

Clang preprocessor preserves _Pragma in right place:

# 1 "tmp.cc"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 374 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "tmp.cc" 2

for ( uint64_t i=0;i<N;i++) { {
# 3 "tmp.cc"
#pragma omp critical
# 3 "tmp.cc"
 { a+=i; }} };

for(uint64_t i=0;i<N;i++) {
# 8 "tmp.cc"
#pragma omp critical
# 8 "tmp.cc"
{ a+=i;} }

Reply via email to