1 // RUN: %clang_cc1 -verify -fopenmp -x c++ -std=c++11 -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 -x c++ -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 simd 10 void add_1(float *d) __attribute__((cold)); 11 12 // CHECK: #pragma omp declare simd 13 // CHECK-NEXT: void add_1(float *d) __attribute__((cold)); 14 // 15 16 #pragma omp declare simd 17 template <class C> void h(C *hp, C *hp2, C *hq, C *lin) { 18 } 19 20 // CHECK: #pragma omp declare simd 21 // CHECK-NEXT: template <class C = int> void h(int *hp, int *hp2, int *hq, int *lin) { 22 // CHECK-NEXT: h((float *)hp, (float *)hp2, (float *)hq, (float *)lin); 23 // CHECK-NEXT: } 24 25 // CHECK: #pragma omp declare simd 26 // CHECK-NEXT: template <class C = float> void h(float *hp, float *hp2, float *hq, float *lin) { 27 // CHECK-NEXT: } 28 29 // CHECK: #pragma omp declare simd 30 // CHECK: template <class C> void h(C *hp, C *hp2, C *hq, C *lin) { 31 // CHECK-NEXT: } 32 // 33 34 // Explicit specialization with <C=int>. 35 // Pragmas need to be same, otherwise standard says that's undefined behavior. 36 #pragma omp declare simd 37 template <> 38 void h(int *hp, int *hp2, int *hq, int *lin) 39 { 40 // Implicit specialization with <C=float>. 41 // This is special case where the directive is stored by Sema and is 42 // generated together with the (pending) function instatiation. 43 h((float*) hp, (float*) hp2, (float*) hq, (float*) lin); 44 } 45 46 class VV { 47 // CHECK: #pragma omp declare simd 48 // CHECK-NEXT: int add(int a, int b) __attribute__((cold)) { 49 // CHECK-NEXT: return a + b; 50 // CHECK-NEXT: } 51 #pragma omp declare simd 52 int add(int a, int b) __attribute__((cold)) { return a + b; } 53 54 // CHECK: #pragma omp declare simd 55 // CHECK-NEXT: float taddpf(float *a, float *b) { 56 // CHECK-NEXT: return *a + *b; 57 // CHECK-NEXT: } 58 #pragma omp declare simd 59 float taddpf(float *a, float *b) { return *a + *b; } 60 61 // CHECK: #pragma omp declare simd 62 // CHECK-NEXT: #pragma omp declare simd 63 // CHECK-NEXT: int tadd(int b) { 64 // CHECK-NEXT: return this->x[b] + b; 65 // CHECK-NEXT: } 66 #pragma omp declare simd 67 #pragma omp declare simd 68 int tadd(int b) { return x[b] + b; } 69 70 private: 71 int x[10]; 72 }; 73 74 // CHECK: template <int X = 16> class TVV { 75 // CHECK: #pragma omp declare simd 76 // CHECK-NEXT: int tadd(int a, int b); 77 // CHECK: #pragma omp declare simd 78 // CHECK-NEXT: float taddpf(float *a, float *b) { 79 // CHECK-NEXT: return *a + *b; 80 // CHECK-NEXT: } 81 // CHECK: #pragma omp declare simd 82 // CHECK-NEXT: #pragma omp declare simd 83 // CHECK-NEXT: int tadd(int b) { 84 // CHECK-NEXT: return this->x[b] + b; 85 // CHECK-NEXT: } 86 // CHECK: } 87 template <int X> 88 class TVV { 89 public: 90 // CHECK: template <int X> class TVV { 91 #pragma omp declare simd 92 int tadd(int a, int b) { return a + b; } 93 94 // CHECK: #pragma omp declare simd 95 // CHECK-NEXT: int tadd(int a, int b) { 96 // CHECK-NEXT: return a + b; 97 // CHECK-NEXT: } 98 99 #pragma omp declare simd 100 float taddpf(float *a, float *b) { return *a + *b; } 101 102 // CHECK: #pragma omp declare simd 103 // CHECK-NEXT: float taddpf(float *a, float *b) { 104 // CHECK-NEXT: return *a + *b; 105 // CHECK-NEXT: } 106 107 #pragma omp declare simd 108 #pragma omp declare simd 109 int tadd(int b) { return x[b] + b; } 110 111 // CHECK: #pragma omp declare simd 112 // CHECK-NEXT: #pragma omp declare simd 113 // CHECK-NEXT: int tadd(int b) { 114 // CHECK-NEXT: return this->x[b] + b; 115 // CHECK-NEXT: } 116 117 private: 118 int x[X]; 119 }; 120 // CHECK: }; 121 122 // CHECK: TVV<16> t16; 123 TVV<16> t16; 124 125 void f() { 126 float a = 1.0f, b = 2.0f; 127 float r = t16.taddpf(&a, &b); 128 int res = t16.tadd(b); 129 } 130 131 #endif 132