148 lines · cpp
1// RUN: %clang_cc1 -verify -fopenmp -ast-print %s -Wno-openmp-mapping | FileCheck %s2// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s3// RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s4 5// RUN: %clang_cc1 -verify -fopenmp-simd -ast-print %s -Wno-openmp-mapping | FileCheck %s6// RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -emit-pch -o %t %s7// RUN: %clang_cc1 -fopenmp-simd -std=c++11 -include-pch %t -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s8// expected-no-diagnostics9 10#ifndef HEADER11#define HEADER12 13void foo() {}14 15struct S {16 S(): a(0) {}17 S(int v) : a(v) {}18 int a;19 typedef int type;20};21 22template <typename T>23class S7 : public T {24protected:25 T a;26 S7() : a(0) {}27 28public:29 S7(typename T::type v) : a(v) {30#pragma omp target31#pragma omp teams32#pragma omp distribute private(a) private(this->a) private(T::a) allocate(a)33 for (int k = 0; k < a.a; ++k)34 ++this->a.a;35 }36 S7 &operator=(S7 &s) {37#pragma omp target38#pragma omp teams39#pragma omp distribute allocate(a) private(a) private(this->a)40 for (int k = 0; k < s.a.a; ++k)41 ++s.a.a;42 return *this;43 }44};45 46// CHECK: #pragma omp target47// CHECK-NEXT: #pragma omp teams48// CHECK-NEXT: #pragma omp distribute private(this->a) private(this->a) private(T::a) allocate(this->a)49// CHECK: #pragma omp target50// CHECK-NEXT: #pragma omp teams51// CHECK-NEXT: #pragma omp distribute allocate(this->a) private(this->a) private(this->a)52// CHECK: #pragma omp target53// CHECK-NEXT: #pragma omp teams54// CHECK-NEXT: #pragma omp distribute private(this->a) private(this->a) private(this->S::a) allocate(this->a)55 56class S8 : public S7<S> {57 S8() {}58 59public:60 S8(int v) : S7<S>(v){61#pragma omp target62#pragma omp teams63#pragma omp distribute private(a) private(this->a) private(S7<S>::a) 64 for (int k = 0; k < a.a; ++k)65 ++this->a.a;66 }67 S8 &operator=(S8 &s) {68#pragma omp target69#pragma omp teams70#pragma omp distribute private(a) private(this->a)71 for (int k = 0; k < s.a.a; ++k)72 ++s.a.a;73 return *this;74 }75};76 77// CHECK: #pragma omp target78// CHECK-NEXT: #pragma omp teams79// CHECK-NEXT: #pragma omp distribute private(this->a) private(this->a) private(this->S7<S>::a)80// CHECK: #pragma omp target81// CHECK-NEXT: #pragma omp teams82// CHECK-NEXT: #pragma omp distribute private(this->a) private(this->a)83 84template <class T, int N>85T tmain(T argc) {86 T b = argc, c, d, e, f, g;87 static T a;88// CHECK: static T a;89#pragma omp distribute90// CHECK-NEXT: #pragma omp distribute{{$}}91 for (int i=0; i < 2; ++i)a=2;92// CHECK-NEXT: for (int i = 0; i < 2; ++i)93// CHECK-NEXT: a = 2;94#pragma omp target95#pragma omp teams96#pragma omp distribute private(argc, b), firstprivate(c, d), collapse(2)97 for (int i = 0; i < 10; ++i)98 for (int j = 0; j < 10; ++j)foo();99// CHECK-NEXT: #pragma omp target100// CHECK-NEXT: #pragma omp teams101// CHECK-NEXT: #pragma omp distribute private(argc,b) firstprivate(c,d) collapse(2)102// CHECK-NEXT: for (int i = 0; i < 10; ++i)103// CHECK-NEXT: for (int j = 0; j < 10; ++j)104// CHECK-NEXT: foo();105 for (int i = 0; i < 10; ++i)foo();106// CHECK-NEXT: for (int i = 0; i < 10; ++i)107// CHECK-NEXT: foo();108#pragma omp distribute109// CHECK: #pragma omp distribute110 for (int i = 0; i < 10; ++i)foo();111// CHECK-NEXT: for (int i = 0; i < 10; ++i)112// CHECK-NEXT: foo(); 113 return T();114}115 116int main (int argc, char **argv) {117 int b = argc, c, d, e, f, g;118 static int a;119// CHECK: static int a;120#pragma omp distribute121// CHECK-NEXT: #pragma omp distribute122 for (int i=0; i < 2; ++i)a=2;123// CHECK-NEXT: for (int i = 0; i < 2; ++i)124// CHECK-NEXT: a = 2;125#pragma omp target126#pragma omp teams127#pragma omp distribute private(argc,b),firstprivate(argv, c), collapse(2)128 for (int i = 0; i < 10; ++i)129 for (int j = 0; j < 10; ++j)foo();130// CHECK-NEXT: #pragma omp target131// CHECK-NEXT: #pragma omp teams132// CHECK-NEXT: #pragma omp distribute private(argc,b) firstprivate(argv,c) collapse(2)133// CHECK-NEXT: for (int i = 0; i < 10; ++i)134// CHECK-NEXT: for (int j = 0; j < 10; ++j)135// CHECK-NEXT: foo();136 for (int i = 0; i < 10; ++i)foo();137// CHECK-NEXT: for (int i = 0; i < 10; ++i)138// CHECK-NEXT: foo();139#pragma omp distribute140// CHECK: #pragma omp distribute141 for (int i = 0; i < 10; ++i)foo();142// CHECK-NEXT: for (int i = 0; i < 10; ++i)143// CHECK-NEXT: foo();144 return (0);145}146 147#endif148