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