xref: /llvm-project/clang/test/SemaOpenACC/loop-construct-auto_seq_independent-ast.cpp (revision b0cfbfd74bfd9d077f7c1854a1b38dcbe9d402e4)
1 // RUN: %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s
2 
3 // Test this with PCH.
4 // RUN: %clang_cc1 %s -fopenacc -emit-pch -o %t %s
5 // RUN: %clang_cc1 %s -fopenacc -include-pch %t -ast-dump-all | FileCheck %s
6 #ifndef PCH_HELPER
7 #define PCH_HELPER
8 
9 void NormalUses() {
10   // CHECK: FunctionDecl{{.*}}NormalUses
11   // CHECK-NEXT: CompoundStmt
12 
13 #pragma acc loop auto
14   for(int i = 0; i < 5; ++i){}
15   // CHECK-NEXT: OpenACCLoopConstruct{{.*}}
16   // CHECK-NEXT: auto clause
17   // CHECK-NEXT: ForStmt
18   // CHECK-NEXT: DeclStmt
19   // CHECK-NEXT: VarDecl{{.*}} i 'int'
20   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
21   // CHECK-NEXT: <<<NULL>>>
22   // CHECK-NEXT: BinaryOperator{{.*}}'<'
23   // CHECK-NEXT: ImplicitCastExpr
24   // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
25   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 5
26   // CHECK-NEXT: UnaryOperator{{.*}}++
27   // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
28   // CHECK-NEXT: CompoundStmt
29 
30 #pragma acc loop seq
31   for(;;){}
32   // CHECK-NEXT: OpenACCLoopConstruct{{.*}}
33   // CHECK-NEXT: seq clause
34   // CHECK-NEXT: ForStmt
35   // CHECK-NEXT: <<<NULL>>>
36   // CHECK-NEXT: <<<NULL>>>
37   // CHECK-NEXT: <<<NULL>>>
38   // CHECK-NEXT: <<<NULL>>>
39   // CHECK-NEXT: CompoundStmt
40 
41 #pragma acc loop independent
42   for(int i = 0; i < 5; ++i){}
43   // CHECK-NEXT: OpenACCLoopConstruct{{.*}}
44   // CHECK-NEXT: independent clause
45   // CHECK-NEXT: ForStmt
46   // CHECK-NEXT: DeclStmt
47   // CHECK-NEXT: VarDecl{{.*}} i 'int'
48   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
49   // CHECK-NEXT: <<<NULL>>>
50   // CHECK-NEXT: BinaryOperator{{.*}}'<'
51   // CHECK-NEXT: ImplicitCastExpr
52   // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
53   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 5
54   // CHECK-NEXT: UnaryOperator{{.*}}++
55   // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
56   // CHECK-NEXT: CompoundStmt
57 }
58 
59 template<typename T>
60 void TemplUses() {
61   // CHECK: FunctionTemplateDecl{{.*}}TemplUses
62   // CHECK-NEXT: TemplateTypeParmDecl
63   // CHECK-NEXT: FunctionDecl{{.*}} TemplUses
64   // CHECK-NEXT: CompoundStmt
65 
66 #pragma acc loop auto
67   for(int i = 0; i < 5; ++i){}
68   // CHECK-NEXT: OpenACCLoopConstruct{{.*}}
69   // CHECK-NEXT: auto clause
70   // CHECK-NEXT: ForStmt
71   // CHECK-NEXT: DeclStmt
72   // CHECK-NEXT: VarDecl{{.*}} i 'int'
73   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
74   // CHECK-NEXT: <<<NULL>>>
75   // CHECK-NEXT: BinaryOperator{{.*}}'<'
76   // CHECK-NEXT: ImplicitCastExpr
77   // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
78   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 5
79   // CHECK-NEXT: UnaryOperator{{.*}}++
80   // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
81   // CHECK-NEXT: CompoundStmt
82 
83 #pragma acc loop seq
84   for(;;){}
85   // CHECK-NEXT: OpenACCLoopConstruct{{.*}}
86   // CHECK-NEXT: seq clause
87   // CHECK-NEXT: ForStmt
88   // CHECK-NEXT: <<<NULL>>>
89   // CHECK-NEXT: <<<NULL>>>
90   // CHECK-NEXT: <<<NULL>>>
91   // CHECK-NEXT: <<<NULL>>>
92   // CHECK-NEXT: CompoundStmt
93 
94 #pragma acc loop independent
95   for(int i = 0; i < 5; ++i){}
96   // CHECK-NEXT: OpenACCLoopConstruct{{.*}}
97   // CHECK-NEXT: independent clause
98   // CHECK-NEXT: ForStmt
99   // CHECK-NEXT: DeclStmt
100   // CHECK-NEXT: VarDecl{{.*}} i 'int'
101   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
102   // CHECK-NEXT: <<<NULL>>>
103   // CHECK-NEXT: BinaryOperator{{.*}}'<'
104   // CHECK-NEXT: ImplicitCastExpr
105   // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
106   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 5
107   // CHECK-NEXT: UnaryOperator{{.*}}++
108   // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
109   // CHECK-NEXT: CompoundStmt
110 
111   // Instantiations.
112   // CHECK-NEXT: FunctionDecl{{.*}}TemplUses 'void ()' implicit_instantiation
113   // CHECK-NEXT: TemplateArgument
114   // CHECK-NEXT: BuiltinType
115   // CHECK-NEXT: CompoundStmt
116 
117   // CHECK-NEXT: OpenACCLoopConstruct{{.*}}
118   // CHECK-NEXT: auto clause
119   // CHECK-NEXT: ForStmt
120   // CHECK-NEXT: DeclStmt
121   // CHECK-NEXT: VarDecl{{.*}} i 'int'
122   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
123   // CHECK-NEXT: <<<NULL>>>
124   // CHECK-NEXT: BinaryOperator{{.*}}'<'
125   // CHECK-NEXT: ImplicitCastExpr
126   // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
127   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 5
128   // CHECK-NEXT: UnaryOperator{{.*}}++
129   // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
130   // CHECK-NEXT: CompoundStmt
131 
132   // CHECK-NEXT: OpenACCLoopConstruct{{.*}}
133   // CHECK-NEXT: seq clause
134   // CHECK-NEXT: ForStmt
135   // CHECK-NEXT: <<<NULL>>>
136   // CHECK-NEXT: <<<NULL>>>
137   // CHECK-NEXT: <<<NULL>>>
138   // CHECK-NEXT: <<<NULL>>>
139   // CHECK-NEXT: CompoundStmt
140 
141   // CHECK-NEXT: OpenACCLoopConstruct{{.*}}
142   // CHECK-NEXT: independent clause
143   // CHECK-NEXT: ForStmt
144   // CHECK-NEXT: DeclStmt
145   // CHECK-NEXT: VarDecl{{.*}} i 'int'
146   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
147   // CHECK-NEXT: <<<NULL>>>
148   // CHECK-NEXT: BinaryOperator{{.*}}'<'
149   // CHECK-NEXT: ImplicitCastExpr
150   // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
151   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 5
152   // CHECK-NEXT: UnaryOperator{{.*}}++
153   // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
154   // CHECK-NEXT: CompoundStmt
155 }
156 
157 void Inst() {
158   TemplUses<int>();
159 }
160 #endif // PCH_HELPER
161