brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.6 KiB · dcb78ff Raw
101 lines · cpp
1// RUN: %clang_cc1 -verify -fopenmp -ast-print %s | 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 | FileCheck %s4 5// RUN: %clang_cc1 -verify -fopenmp-simd -ast-print %s | 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 | FileCheck %s8// expected-no-diagnostics9 10#ifndef HEADER11#define HEADER12 13template <typename T>14void bar(T &x, T &y) { x.a += y.a; }15 16namespace N117{18  struct A { int a; A() : a(0) {} };19  #pragma omp declare reduction(+: A : bar(omp_out, omp_in))20  #pragma omp declare reduction(-: struct A : bar(omp_out, omp_in))21}22// CHECK: namespace N1 {23// CHECK: #pragma omp declare reduction (+ : A : bar(omp_out, omp_in))24// CHECK: #pragma omp declare reduction (- : struct A : bar(omp_out, omp_in))25 26#pragma omp declare reduction(+ : int, char : omp_out *= omp_in)27// CHECK: #pragma omp declare reduction (+ : int : omp_out *= omp_in){{$}}28// CHECK-NEXT: #pragma omp declare reduction (+ : char : omp_out *= omp_in)29 30 31template <class T>32class SSS {33public:34#pragma omp declare reduction(fun : T : omp_out += omp_in) initializer(omp_priv = omp_orig + 15)35#pragma omp declare reduction(fun1 : T : omp_out=1, omp_out=foo(omp_in)) initializer(omp_priv = omp_orig + 14)36  static T foo(T &);37};38 39// CHECK: template <class T> class SSS {40// CHECK: #pragma omp declare reduction (fun : T : omp_out += omp_in) initializer(omp_priv = omp_orig + 15)41// CHECK: #pragma omp declare reduction (fun1 : T : omp_out = 1 , omp_out = foo(omp_in)) initializer(omp_priv = omp_orig + 14)42// CHECK: };43// CHECK: template<> class SSS<int> {44// CHECK: #pragma omp declare reduction (fun : int : omp_out += omp_in) initializer(omp_priv = omp_orig + 15)45// CHECK: #pragma omp declare reduction (fun1 : int : omp_out = 1 , omp_out = foo(omp_in)) initializer(omp_priv = omp_orig + 14)46// CHECK: };47 48SSS<int> d;49 50void init(SSS<int> &lhs, SSS<int> rhs);51 52#pragma omp declare reduction(fun : SSS < int > : omp_out = omp_in) initializer(init(omp_priv, omp_orig))53// CHECK: #pragma omp declare reduction (fun : SSS<int> : omp_out = omp_in) initializer(init(omp_priv, omp_orig))54 55// CHECK: template <typename T> T foo(T a) {56// CHECK: #pragma omp declare reduction (fun : T : omp_out += omp_in) initializer(omp_priv = omp_orig + 15);57// CHECK: {58// CHECK: #pragma omp declare reduction (fun : T : omp_out += omp_in) initializer(omp_priv = omp_orig + 15);59// CHECK: }60// CHECK: return a;61// CHECK: }62 63// CHECK: template<> int foo<int>(int a) {64// CHECK: #pragma omp declare reduction (fun : int : omp_out += omp_in) initializer(omp_priv = omp_orig + 15);65// CHECK: {66// CHECK: #pragma omp declare reduction (fun : int : omp_out += omp_in) initializer(omp_priv = omp_orig + 15);67// CHECK: }68// CHECK: return a;69// CHECK: }70template <typename T>71T foo(T a) {72#pragma omp declare reduction(fun : T : omp_out += omp_in) initializer(omp_priv = omp_orig + 15)73  {74#pragma omp declare reduction(fun : T : omp_out += omp_in) initializer(omp_priv = omp_orig + 15)75  }76  return a;77}78 79int main() {80  int i = 0;81  SSS<int> sss;82  // TODO: Add support for scoped reduction identifiers83  //  #pragma omp parallel reduction(SSS<int>::fun : i)84  // TODO-CHECK: #pragma omp parallel reduction(SSS<int>::fun: i)85  {86    i += 1;87  }88  // #pragma omp parallel reduction(::fun:sss)89  // TODO-CHECK: #pragma omp parallel reduction(::fun: sss)90  {91  }92  N1::A a;93  // CHECK: #pragma omp parallel reduction(+: a)94  #pragma omp parallel reduction(+: a)95  {96  }97  return foo(15);98}99 100#endif101