blob: e76a410522e8b6e454392009e0b7ed3697fe539a [file] [log] [blame]
Alexey Bataev5ec3eb12013-07-19 03:13:43 +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
9void foo() {}
10
Alexey Bataevd5af8e42013-10-01 05:32:34 +000011
Alexey Bataevaf7849e2014-03-05 06:45:14 +000012template <typename T, int C>
Alexey Bataevd5af8e42013-10-01 05:32:34 +000013T tmain(T argc, T *argv) {
14 T b = argc, c, d, e, f, g;
15 static T a;
16#pragma omp parallel
17 a=2;
Alexey Bataevaadd52e2014-02-13 05:29:23 +000018#pragma omp parallel default(none), private(argc,b) firstprivate(argv) shared (d) if (argc > 0)
Alexey Bataevd5af8e42013-10-01 05:32:34 +000019 foo();
Alexey Bataevaf7849e2014-03-05 06:45:14 +000020#pragma omp parallel if (C)
21 foo();
Alexey Bataevd5af8e42013-10-01 05:32:34 +000022 return 0;
23}
Alexey Bataevaf7849e2014-03-05 06:45:14 +000024// CHECK: template <typename T = int, int C = 2> int tmain(int argc, int *argv) {
Alexey Bataevd5af8e42013-10-01 05:32:34 +000025// CHECK-NEXT: int b = argc, c, d, e, f, g;
26// CHECK-NEXT: static int a;
27// CHECK-NEXT: #pragma omp parallel
28// CHECK-NEXT: a = 2;
Alexey Bataevaadd52e2014-02-13 05:29:23 +000029// CHECK-NEXT: #pragma omp parallel default(none) private(argc,b) firstprivate(argv) shared(d) if(argc > 0)
Alexey Bataevd5af8e42013-10-01 05:32:34 +000030// CHECK-NEXT: foo()
Alexey Bataevaf7849e2014-03-05 06:45:14 +000031// CHECK-NEXT: #pragma omp parallel if(2)
32// CHECK-NEXT: foo()
33// CHECK: template <typename T = float, int C = 0> float tmain(float argc, float *argv) {
Alexey Bataevd5af8e42013-10-01 05:32:34 +000034// CHECK-NEXT: float b = argc, c, d, e, f, g;
35// CHECK-NEXT: static float a;
36// CHECK-NEXT: #pragma omp parallel
37// CHECK-NEXT: a = 2;
Alexey Bataevaadd52e2014-02-13 05:29:23 +000038// CHECK-NEXT: #pragma omp parallel default(none) private(argc,b) firstprivate(argv) shared(d) if(argc > 0)
Alexey Bataevd5af8e42013-10-01 05:32:34 +000039// CHECK-NEXT: foo()
Alexey Bataevaf7849e2014-03-05 06:45:14 +000040// CHECK-NEXT: #pragma omp parallel if(0)
41// CHECK-NEXT: foo()
42// CHECK: template <typename T, int C> T tmain(T argc, T *argv) {
Alexey Bataevd5af8e42013-10-01 05:32:34 +000043// CHECK-NEXT: T b = argc, c, d, e, f, g;
44// CHECK-NEXT: static T a;
45// CHECK-NEXT: #pragma omp parallel
46// CHECK-NEXT: a = 2;
Alexey Bataevaadd52e2014-02-13 05:29:23 +000047// CHECK-NEXT: #pragma omp parallel default(none) private(argc,b) firstprivate(argv) shared(d) if(argc > 0)
Alexey Bataevd5af8e42013-10-01 05:32:34 +000048// CHECK-NEXT: foo()
Alexey Bataevaf7849e2014-03-05 06:45:14 +000049// CHECK-NEXT: #pragma omp parallel if(C)
50// CHECK-NEXT: foo()
Alexey Bataevd5af8e42013-10-01 05:32:34 +000051
Alexey Bataev5ec3eb12013-07-19 03:13:43 +000052int main (int argc, char **argv) {
Alexey Bataevd5af8e42013-10-01 05:32:34 +000053 float x;
Alexey Bataev5ec3eb12013-07-19 03:13:43 +000054 int b = argc, c, d, e, f, g;
55 static int a;
56// CHECK: static int a;
57#pragma omp parallel
58// CHECK-NEXT: #pragma omp parallel
59 a=2;
60// CHECK-NEXT: a = 2;
Alexey Bataevaadd52e2014-02-13 05:29:23 +000061#pragma omp parallel default(none), private(argc,b) firstprivate(argv) if (argc > 0)
62// CHECK-NEXT: #pragma omp parallel default(none) private(argc,b) firstprivate(argv) if(argc > 0)
Alexey Bataev5ec3eb12013-07-19 03:13:43 +000063 foo();
64// CHECK-NEXT: foo();
Alexey Bataevaf7849e2014-03-05 06:45:14 +000065 return tmain<int, 2>(b, &b) + tmain<float, 0>(x, &x);
Alexey Bataev5ec3eb12013-07-19 03:13:43 +000066}
67
68#endif