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