xref: /aosp_15_r20/external/clang/test/OpenMP/function-attr.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -x c++ -triple x86_64-apple-darwin10  -stack-protector 2 -emit-llvm -o - %s | FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li // Check that function attributes are added to the OpenMP runtime functions.
4*67e74705SXin Li 
5*67e74705SXin Li template <class T>
6*67e74705SXin Li struct S {
7*67e74705SXin Li   T f;
SS8*67e74705SXin Li   S(T a) : f(a) {}
SS9*67e74705SXin Li   S() : f() {}
operator TS10*67e74705SXin Li   operator T() { return T(); }
~SS11*67e74705SXin Li   ~S() {}
12*67e74705SXin Li };
13*67e74705SXin Li 
14*67e74705SXin Li // CHECK: define internal void @.omp.copyprivate.copy_func(i8*, i8*) [[ATTR0:#[0-9]+]] {
15*67e74705SXin Li 
16*67e74705SXin Li void foo0();
17*67e74705SXin Li 
foo1()18*67e74705SXin Li int foo1() {
19*67e74705SXin Li   char a;
20*67e74705SXin Li 
21*67e74705SXin Li #pragma omp parallel
22*67e74705SXin Li   a = 2;
23*67e74705SXin Li #pragma omp single copyprivate(a)
24*67e74705SXin Li   foo0();
25*67e74705SXin Li 
26*67e74705SXin Li   return 0;
27*67e74705SXin Li }
28*67e74705SXin Li 
29*67e74705SXin Li // CHECK: define internal void @.omp_task_privates_map.({{.*}}) [[ATTR3:#[0-9]+]] {
30*67e74705SXin Li // CHECK: define internal i32 @.omp_task_entry.({{.*}}) [[ATTR0]] {
31*67e74705SXin Li // CHECK: define internal i32 @.omp_task_destructor.({{.*}}) [[ATTR0]] {
32*67e74705SXin Li 
foo2()33*67e74705SXin Li int foo2() {
34*67e74705SXin Li   S<double> s_arr[] = {1, 2};
35*67e74705SXin Li   S<double> var(3);
36*67e74705SXin Li #pragma omp task private(s_arr, var)
37*67e74705SXin Li   s_arr[0] = var;
38*67e74705SXin Li   return 0;
39*67e74705SXin Li }
40*67e74705SXin Li 
41*67e74705SXin Li // CHECK: define internal void @.omp.reduction.reduction_func(i8*, i8*) [[ATTR0]] {
42*67e74705SXin Li 
foo3(int n,float * a,float * b)43*67e74705SXin Li float foo3(int n, float *a, float *b) {
44*67e74705SXin Li   int i;
45*67e74705SXin Li   float result;
46*67e74705SXin Li 
47*67e74705SXin Li #pragma omp parallel for private(i) reduction(+:result)
48*67e74705SXin Li   for (i=0; i < n; i++)
49*67e74705SXin Li     result = result + (a[i] * b[i]);
50*67e74705SXin Li   return result;
51*67e74705SXin Li }
52*67e74705SXin Li 
53*67e74705SXin Li // CHECK: attributes [[ATTR0]] = {{{.*}} sspstrong {{.*}}}
54*67e74705SXin Li // CHECK: attributes [[ATTR3]] = {{{.*}} sspstrong {{.*}}}
55