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 #pragma omp declare target 10 // CHECK: #pragma omp declare target 11 void foo() {} 12 // CHECK-NEXT: void foo() 13 #pragma omp end declare target 14 // CHECK: #pragma omp end declare target 15 16 extern "C" { 17 #pragma omp declare target 18 // CHECK: #pragma omp declare target 19 void foo_c() {} 20 // CHECK-NEXT: void foo_c() 21 #pragma omp end declare target 22 // CHECK: #pragma omp end declare target 23 } 24 25 extern "C++" { 26 #pragma omp declare target 27 // CHECK: #pragma omp declare target 28 void foo_cpp() {} 29 // CHECK-NEXT: void foo_cpp() 30 #pragma omp end declare target 31 // CHECK: #pragma omp end declare target 32 } 33 34 #pragma omp declare target 35 template <class T> 36 struct C { 37 // CHECK: template <class T = int> struct C 38 T t; 39 // CHECK-NEXT: int t; 40 static T ts; 41 // CHECK-NEXT: #pragma omp declare target 42 // CHECK-NEXT: static int ts; 43 // CHECK: #pragma omp end declare target 44 45 C(T t) : t(t) { 46 } 47 // CHECK: #pragma omp declare target 48 // CHECK-NEXT: C(int t) : t(t) { 49 // CHECK-NEXT: } 50 // CHECK: #pragma omp end declare target 51 52 T foo() { 53 return t; 54 } 55 // CHECK: #pragma omp declare target 56 // CHECK-NEXT: int foo() { 57 // CHECK-NEXT: return this->t; 58 // CHECK-NEXT: } 59 // CHECK: #pragma omp end declare target 60 }; 61 62 // CHECK: template <class T> struct C { 63 // CHECK: #pragma omp declare target 64 // CHECK-NEXT: static T ts; 65 // CHECK-NEXT: #pragma omp end declare target 66 67 template<class T> 68 T C<T>::ts = 1; 69 // CHECK: #pragma omp declare target 70 // CHECK: T ts = 1; 71 // CHECK: #pragma omp end declare target 72 73 // CHECK: #pragma omp declare target 74 // CHECK: int test1() 75 int test1() { 76 C<int> c(1); 77 return c.foo() + c.ts; 78 } 79 #pragma omp end declare target 80 // CHECK: #pragma omp end declare target 81 82 int a1; 83 void f1() { 84 } 85 #pragma omp declare target (a1, f1) 86 // CHECK: #pragma omp declare target 87 // CHECK: int a1; 88 // CHECK: #pragma omp end declare target 89 // CHECK: #pragma omp declare target 90 // CHECK: void f1() 91 // CHECK: #pragma omp end declare target 92 93 int b1, b2, b3; 94 void f2() { 95 } 96 #pragma omp declare target to(b1) to(b2), to(b3, f2) 97 // CHECK: #pragma omp declare target 98 // CHECK: int b1; 99 // CHECK: #pragma omp end declare target 100 // CHECK: #pragma omp declare target 101 // CHECK: int b2; 102 // CHECK: #pragma omp end declare target 103 // CHECK: #pragma omp declare target 104 // CHECK: int b3; 105 // CHECK: #pragma omp end declare target 106 // CHECK: #pragma omp declare target 107 // CHECK: void f2() 108 // CHECK: #pragma omp end declare target 109 110 int c1, c2, c3; 111 void f3() { 112 } 113 #pragma omp declare target link(c1) link(c2), link(c3, f3) 114 // CHECK: #pragma omp declare target link 115 // CHECK: int c1; 116 // CHECK: #pragma omp end declare target 117 // CHECK: #pragma omp declare target link 118 // CHECK: int c2; 119 // CHECK: #pragma omp end declare target 120 // CHECK: #pragma omp declare target link 121 // CHECK: int c3; 122 // CHECK: #pragma omp end declare target 123 // CHECK: #pragma omp declare target link 124 // CHECK: void f3() 125 // CHECK: #pragma omp end declare target 126 127 int main (int argc, char **argv) { 128 foo(); 129 foo_c(); 130 foo_cpp(); 131 test1(); 132 return (0); 133 } 134 135 // CHECK: #pragma omp declare target 136 // CHECK-NEXT: int ts = 1; 137 // CHECK-NEXT: #pragma omp end declare target 138 #endif 139