blob: 816ff79376639027c190108767ee0099fcbacd59 [file] [log] [blame]
Alexey Bataev94a4f0c2016-03-03 05:21:39 +00001// 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 reduction(+ : int, char : omp_out *= omp_in)
10// CHECK: #pragma omp declare reduction (+ : int : omp_out *= omp_in)
11// CHECK-NEXT: #pragma omp declare reduction (+ : char : omp_out *= omp_in)
12
Alexey Bataev94a4f0c2016-03-03 05:21:39 +000013template <class T>
14class SSS {
15public:
16#pragma omp declare reduction(fun : T : omp_out += omp_in) initializer(omp_priv = omp_orig + 15)
17 // CHECK: #pragma omp declare reduction (fun : T : omp_out += omp_in) initializer(omp_priv = omp_orig + 15)
Serge Pavlova67a4d22016-11-10 08:49:37 +000018 // CHECK: #pragma omp declare reduction (fun : int : omp_out += omp_in) initializer(omp_priv = omp_orig + 15)
Alexey Bataev94a4f0c2016-03-03 05:21:39 +000019};
20
21SSS<int> d;
22
23void init(SSS<int> &lhs, SSS<int> rhs);
24
25#pragma omp declare reduction(fun : SSS < int > : omp_out = omp_in) initializer(init(omp_priv, omp_orig))
26// CHECK: #pragma omp declare reduction (fun : SSS<int> : omp_out = omp_in) initializer(init(omp_priv, omp_orig))
27
Alexey Bataev94a4f0c2016-03-03 05:21:39 +000028// CHECK: template <typename T> T foo(T a) {
29// CHECK: #pragma omp declare reduction (fun : T : omp_out += omp_in) initializer(omp_priv = omp_orig + 15);
30// CHECK: {
31// CHECK: #pragma omp declare reduction (fun : T : omp_out += omp_in) initializer(omp_priv = omp_orig + 15);
32// CHECK: }
33// CHECK: return a;
34// CHECK: }
Serge Pavlova67a4d22016-11-10 08:49:37 +000035
36// CHECK: template<> int foo<int>(int a) {
37// CHECK: #pragma omp declare reduction (fun : int : omp_out += omp_in) initializer(omp_priv = omp_orig + 15);
38// CHECK: {
39// CHECK: #pragma omp declare reduction (fun : int : omp_out += omp_in) initializer(omp_priv = omp_orig + 15);
40// CHECK: }
41// CHECK: return a;
42// CHECK: }
Alexey Bataev94a4f0c2016-03-03 05:21:39 +000043template <typename T>
44T foo(T a) {
45#pragma omp declare reduction(fun : T : omp_out += omp_in) initializer(omp_priv = omp_orig + 15)
46 {
47#pragma omp declare reduction(fun : T : omp_out += omp_in) initializer(omp_priv = omp_orig + 15)
48 }
49 return a;
50}
51
52int main() {
53 int i = 0;
54 SSS<int> sss;
55 // TODO: Add support for scoped reduction identifiers
56 // #pragma omp parallel reduction(SSS<int>::fun : i)
57 // TODO-CHECK: #pragma omp parallel reduction(SSS<int>::fun: i)
58 {
59 i += 1;
60 }
61 // #pragma omp parallel reduction(::fun:sss)
62 // TODO-CHECK: #pragma omp parallel reduction(::fun: sss)
63 {
64 }
65 return foo(15);
66}
67
68#endif