1*67e74705SXin Li // RUN: %clang_cc1 -verify -fopenmp -ast-print %s | FileCheck %s 2*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s 3*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s 4*67e74705SXin Li // expected-no-diagnostics 5*67e74705SXin Li 6*67e74705SXin Li #ifndef HEADER 7*67e74705SXin Li #define HEADER 8*67e74705SXin Li 9*67e74705SXin Li template <class T> foo(T argc)10*67e74705SXin LiT foo(T argc) { 11*67e74705SXin Li T b = T(); 12*67e74705SXin Li T a = T(); 13*67e74705SXin Li #pragma omp atomic 14*67e74705SXin Li a++; 15*67e74705SXin Li #pragma omp atomic read 16*67e74705SXin Li a = argc; 17*67e74705SXin Li #pragma omp atomic write 18*67e74705SXin Li a = argc + argc; 19*67e74705SXin Li #pragma omp atomic update 20*67e74705SXin Li a = a + argc; 21*67e74705SXin Li #pragma omp atomic capture 22*67e74705SXin Li a = b++; 23*67e74705SXin Li #pragma omp atomic capture 24*67e74705SXin Li { 25*67e74705SXin Li a = b; 26*67e74705SXin Li b++; 27*67e74705SXin Li } 28*67e74705SXin Li #pragma omp atomic seq_cst 29*67e74705SXin Li a++; 30*67e74705SXin Li #pragma omp atomic read seq_cst 31*67e74705SXin Li a = argc; 32*67e74705SXin Li #pragma omp atomic seq_cst write 33*67e74705SXin Li a = argc + argc; 34*67e74705SXin Li #pragma omp atomic update seq_cst 35*67e74705SXin Li a = a + argc; 36*67e74705SXin Li #pragma omp atomic seq_cst capture 37*67e74705SXin Li a = b++; 38*67e74705SXin Li #pragma omp atomic capture seq_cst 39*67e74705SXin Li { 40*67e74705SXin Li a = b; 41*67e74705SXin Li b++; 42*67e74705SXin Li } 43*67e74705SXin Li return T(); 44*67e74705SXin Li } 45*67e74705SXin Li 46*67e74705SXin Li // CHECK: int a = int(); 47*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic 48*67e74705SXin Li // CHECK-NEXT: a++; 49*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic read 50*67e74705SXin Li // CHECK-NEXT: a = argc; 51*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic write 52*67e74705SXin Li // CHECK-NEXT: a = argc + argc; 53*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic update 54*67e74705SXin Li // CHECK-NEXT: a = a + argc; 55*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic capture 56*67e74705SXin Li // CHECK-NEXT: a = b++; 57*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic capture 58*67e74705SXin Li // CHECK-NEXT: { 59*67e74705SXin Li // CHECK-NEXT: a = b; 60*67e74705SXin Li // CHECK-NEXT: b++; 61*67e74705SXin Li // CHECK-NEXT: } 62*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic seq_cst 63*67e74705SXin Li // CHECK-NEXT: a++; 64*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic read seq_cst 65*67e74705SXin Li // CHECK-NEXT: a = argc; 66*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic seq_cst write 67*67e74705SXin Li // CHECK-NEXT: a = argc + argc; 68*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic update seq_cst 69*67e74705SXin Li // CHECK-NEXT: a = a + argc; 70*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic seq_cst capture 71*67e74705SXin Li // CHECK-NEXT: a = b++; 72*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic capture seq_cst 73*67e74705SXin Li // CHECK-NEXT: { 74*67e74705SXin Li // CHECK-NEXT: a = b; 75*67e74705SXin Li // CHECK-NEXT: b++; 76*67e74705SXin Li // CHECK-NEXT: } 77*67e74705SXin Li // CHECK: T a = T(); 78*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic 79*67e74705SXin Li // CHECK-NEXT: a++; 80*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic read 81*67e74705SXin Li // CHECK-NEXT: a = argc; 82*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic write 83*67e74705SXin Li // CHECK-NEXT: a = argc + argc; 84*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic update 85*67e74705SXin Li // CHECK-NEXT: a = a + argc; 86*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic capture 87*67e74705SXin Li // CHECK-NEXT: a = b++; 88*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic capture 89*67e74705SXin Li // CHECK-NEXT: { 90*67e74705SXin Li // CHECK-NEXT: a = b; 91*67e74705SXin Li // CHECK-NEXT: b++; 92*67e74705SXin Li // CHECK-NEXT: } 93*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic seq_cst 94*67e74705SXin Li // CHECK-NEXT: a++; 95*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic read seq_cst 96*67e74705SXin Li // CHECK-NEXT: a = argc; 97*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic seq_cst write 98*67e74705SXin Li // CHECK-NEXT: a = argc + argc; 99*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic update seq_cst 100*67e74705SXin Li // CHECK-NEXT: a = a + argc; 101*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic seq_cst capture 102*67e74705SXin Li // CHECK-NEXT: a = b++; 103*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic capture seq_cst 104*67e74705SXin Li // CHECK-NEXT: { 105*67e74705SXin Li // CHECK-NEXT: a = b; 106*67e74705SXin Li // CHECK-NEXT: b++; 107*67e74705SXin Li // CHECK-NEXT: } 108*67e74705SXin Li main(int argc,char ** argv)109*67e74705SXin Liint main(int argc, char **argv) { 110*67e74705SXin Li int b = 0; 111*67e74705SXin Li int a = 0; 112*67e74705SXin Li // CHECK: int a = 0; 113*67e74705SXin Li #pragma omp atomic 114*67e74705SXin Li a++; 115*67e74705SXin Li #pragma omp atomic read 116*67e74705SXin Li a = argc; 117*67e74705SXin Li #pragma omp atomic write 118*67e74705SXin Li a = argc + argc; 119*67e74705SXin Li #pragma omp atomic update 120*67e74705SXin Li a = a + argc; 121*67e74705SXin Li #pragma omp atomic capture 122*67e74705SXin Li a = b++; 123*67e74705SXin Li #pragma omp atomic capture 124*67e74705SXin Li { 125*67e74705SXin Li a = b; 126*67e74705SXin Li b++; 127*67e74705SXin Li } 128*67e74705SXin Li #pragma omp atomic seq_cst 129*67e74705SXin Li a++; 130*67e74705SXin Li #pragma omp atomic read seq_cst 131*67e74705SXin Li a = argc; 132*67e74705SXin Li #pragma omp atomic seq_cst write 133*67e74705SXin Li a = argc + argc; 134*67e74705SXin Li #pragma omp atomic update seq_cst 135*67e74705SXin Li a = a + argc; 136*67e74705SXin Li #pragma omp atomic seq_cst capture 137*67e74705SXin Li a = b++; 138*67e74705SXin Li #pragma omp atomic capture seq_cst 139*67e74705SXin Li { 140*67e74705SXin Li a = b; 141*67e74705SXin Li b++; 142*67e74705SXin Li } 143*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic 144*67e74705SXin Li // CHECK-NEXT: a++; 145*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic read 146*67e74705SXin Li // CHECK-NEXT: a = argc; 147*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic write 148*67e74705SXin Li // CHECK-NEXT: a = argc + argc; 149*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic update 150*67e74705SXin Li // CHECK-NEXT: a = a + argc; 151*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic capture 152*67e74705SXin Li // CHECK-NEXT: a = b++; 153*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic capture 154*67e74705SXin Li // CHECK-NEXT: { 155*67e74705SXin Li // CHECK-NEXT: a = b; 156*67e74705SXin Li // CHECK-NEXT: b++; 157*67e74705SXin Li // CHECK-NEXT: } 158*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic seq_cst 159*67e74705SXin Li // CHECK-NEXT: a++; 160*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic read seq_cst 161*67e74705SXin Li // CHECK-NEXT: a = argc; 162*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic seq_cst write 163*67e74705SXin Li // CHECK-NEXT: a = argc + argc; 164*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic update seq_cst 165*67e74705SXin Li // CHECK-NEXT: a = a + argc; 166*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic seq_cst capture 167*67e74705SXin Li // CHECK-NEXT: a = b++; 168*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic capture seq_cst 169*67e74705SXin Li // CHECK-NEXT: { 170*67e74705SXin Li // CHECK-NEXT: a = b; 171*67e74705SXin Li // CHECK-NEXT: b++; 172*67e74705SXin Li // CHECK-NEXT: } 173*67e74705SXin Li return foo(a); 174*67e74705SXin Li } 175*67e74705SXin Li 176*67e74705SXin Li #endif 177