1 // Check no warnings/errors
2 // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 -fsyntax-only -verify %s
3 // expected-no-diagnostics
4
5 // Check AST and unparsing
6 // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 -ast-dump %s | FileCheck %s --check-prefix=DUMP
7 // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 -ast-print %s | FileCheck %s --check-prefix=PRINT
8
9 // Check same results after serialization round-trip
10 // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 -emit-pch -o %t %s
11 // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 -include-pch %t -ast-dump-all %s | FileCheck %s --check-prefix=DUMP
12 // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 -include-pch %t -ast-print %s | FileCheck %s --check-prefix=PRINT
13
14 #ifndef HEADER
15 #define HEADER
16
17 // placeholder for loop body code.
18 extern "C" void body(...);
19
20
21 // PRINT-LABEL: void foo1(
22 // DUMP-LABEL: FunctionDecl {{.*}} foo1
foo1()23 void foo1() {
24 // PRINT: #pragma omp tile sizes(5, 5)
25 // DUMP: OMPTileDirective
26 // DUMP-NEXT: OMPSizesClause
27 // DUMP-NEXT: IntegerLiteral {{.*}} 5
28 // DUMP-NEXT: IntegerLiteral {{.*}} 5
29 #pragma omp tile sizes(5,5)
30 // PRINT: for (int i = 7; i < 17; i += 3)
31 // DUMP-NEXT: ForStmt
32 for (int i = 7; i < 17; i += 3)
33 // PRINT: for (int j = 7; j < 17; j += 3)
34 // DUMP: ForStmt
35 for (int j = 7; j < 17; j += 3)
36 // PRINT: body(i, j);
37 // DUMP: CallExpr
38 body(i, j);
39 }
40
41
42 // PRINT-LABEL: void foo2(
43 // DUMP-LABEL: FunctionDecl {{.*}} foo2
foo2(int start1,int start2,int end1,int end2)44 void foo2(int start1, int start2, int end1, int end2) {
45 // PRINT: #pragma omp tile sizes(5, 5)
46 // DUMP: OMPTileDirective
47 // DUMP-NEXT: OMPSizesClause
48 // DUMP-NEXT: IntegerLiteral {{.*}} 5
49 // DUMP-NEXT: IntegerLiteral {{.*}} 5
50 #pragma omp tile sizes(5,5)
51 // PRINT: for (int i = start1; i < end1; i += 1)
52 // DUMP-NEXT: ForStmt
53 for (int i = start1; i < end1; i += 1)
54 // PRINT: for (int j = start2; j < end2; j += 1)
55 // DUMP: ForStmt
56 for (int j = start2; j < end2; j += 1)
57 // PRINT: body(i, j);
58 // DUMP: CallExpr
59 body(i, j);
60 }
61
62
63 // PRINT-LABEL: void foo3(
64 // DUMP-LABEL: FunctionDecl {{.*}} foo3
foo3()65 void foo3() {
66 // PRINT: #pragma omp for
67 // DUMP: OMPForDirective
68 // DUMP-NEXT: CapturedStmt
69 // DUMP-NEXT: CapturedDecl
70 #pragma omp for
71 // PRINT: #pragma omp tile sizes(5)
72 // DUMP-NEXT: OMPTileDirective
73 // DUMP-NEXT: OMPSizesClause
74 // DUMP-NEXT: IntegerLiteral {{.*}} 5
75 #pragma omp tile sizes(5)
76 for (int i = 7; i < 17; i += 3)
77 // PRINT: body(i);
78 // DUMP: CallExpr
79 body(i);
80 }
81
82
83 // PRINT-LABEL: void foo4(
84 // DUMP-LABEL: FunctionDecl {{.*}} foo4
foo4()85 void foo4() {
86 // PRINT: #pragma omp for collapse(3)
87 // DUMP: OMPForDirective
88 // DUMP-NEXT: OMPCollapseClause
89 // DUMP-NEXT: ConstantExpr
90 // DUMP-NEXT: value: Int 3
91 // DUMP-NEXT: IntegerLiteral {{.*}} 3
92 // DUMP-NEXT: CapturedStmt
93 // DUMP-NEXT: CapturedDecl
94 #pragma omp for collapse(3)
95 // PRINT: #pragma omp tile sizes(5, 5)
96 // DUMP: OMPTileDirective
97 // DUMP-NEXT: OMPSizesClause
98 // DUMP-NEXT: IntegerLiteral {{.*}} 5
99 // DUMP-NEXT: IntegerLiteral {{.*}} 5
100 #pragma omp tile sizes(5, 5)
101 // PRINT: for (int i = 7; i < 17; i += 1)
102 // DUMP-NEXT: ForStmt
103 for (int i = 7; i < 17; i += 1)
104 // PRINT: for (int j = 7; j < 17; j += 1)
105 // DUMP: ForStmt
106 for (int j = 7; j < 17; j += 1)
107 // PRINT: body(i, j);
108 // DUMP: CallExpr
109 body(i, j);
110 }
111
112
113 // PRINT-LABEL: void foo5(
114 // DUMP-LABEL: FunctionDecl {{.*}} foo5
foo5(int start,int end,int step)115 void foo5(int start, int end, int step) {
116 // PRINT: #pragma omp for collapse(2)
117 // DUMP: OMPForDirective
118 // DUMP-NEXT: OMPCollapseClause
119 // DUMP-NEXT: ConstantExpr
120 // DUMP-NEXT: value: Int 2
121 // DUMP-NEXT: IntegerLiteral {{.*}} 2
122 // DUMP-NEXT: CapturedStmt
123 // DUMP-NEXT: CapturedDecl
124 #pragma omp for collapse(2)
125 // PRINT: for (int i = 7; i < 17; i += 1)
126 // DUMP-NEXT: ForStmt
127 for (int i = 7; i < 17; i += 1)
128 // PRINT: #pragma omp tile sizes(5)
129 // DUMP: OMPTileDirective
130 // DUMP-NEXT: OMPSizesClause
131 // DUMP-NEXT: IntegerLiteral {{.*}} 5
132 #pragma omp tile sizes(5)
133 // PRINT: for (int j = 7; j < 17; j += 1)
134 // DUMP-NEXT: ForStmt
135 for (int j = 7; j < 17; j += 1)
136 // PRINT: body(i, j);
137 // DUMP: CallExpr
138 body(i, j);
139 }
140
141
142 // PRINT-LABEL: void foo6(
143 // DUMP-LABEL: FunctionTemplateDecl {{.*}} foo6
144 template<typename T, T Step, T Tile>
foo6(T start,T end)145 void foo6(T start, T end) {
146 // PRINT: #pragma omp tile sizes(Tile)
147 // DUMP: OMPTileDirective
148 // DUMP-NEXT: OMPSizesClause
149 // DUMP-NEXT: DeclRefExpr {{.*}} 'Tile' 'T'
150 #pragma omp tile sizes(Tile)
151 // PRINT-NEXT: for (T i = start; i < end; i += Step)
152 // DUMP-NEXT: ForStmt
153 for (T i = start; i < end; i += Step)
154 // PRINT-NEXT: body(i);
155 // DUMP: CallExpr
156 body(i);
157 }
158
159 // Also test instantiating the template.
tfoo6()160 void tfoo6() {
161 foo6<int,3,5>(0, 42);
162 }
163
164
165 #endif
166