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