xref: /llvm-project/clang/test/SemaOpenACC/compute-construct-ast.cpp (revision 39351f8e46e3e42b945ed686537f182b4c313289)
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 
7 #ifndef PCH_HELPER
8 #define PCH_HELPER
9 
10 void NormalFunc() {
11   // CHECK-LABEL: NormalFunc
12   // CHECK-NEXT: CompoundStmt
13   // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel
14   // CHECK-NEXT: default(none)
15   // CHECK-NEXT: CompoundStmt
16 #pragma acc parallel default(none)
17   {
18 #pragma acc parallel
19   // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel
20   // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel
21   // CHECK-NEXT: default(present)
22   // CHECK-NEXT: CompoundStmt
23 #pragma acc parallel default(present)
24     {}
25   }
26   // CHECK-NEXT: OpenACCComputeConstruct {{.*}}serial
27   // CHECK-NEXT: CompoundStmt
28 #pragma acc serial
29   {
30 #pragma acc serial
31   // CHECK-NEXT: OpenACCComputeConstruct {{.*}}serial
32   // CHECK-NEXT: OpenACCComputeConstruct {{.*}}serial
33   // CHECK-NEXT: CompoundStmt
34 #pragma acc serial
35     {}
36   }
37   // CHECK-NEXT: OpenACCComputeConstruct {{.*}}kernels
38   // CHECK-NEXT: CompoundStmt
39 #pragma acc kernels
40   {
41 #pragma acc kernels
42   // CHECK-NEXT: OpenACCComputeConstruct {{.*}}kernels
43   // CHECK-NEXT: OpenACCComputeConstruct {{.*}}kernels
44   // CHECK-NEXT: CompoundStmt
45 #pragma acc kernels
46     {}
47   }
48 }
49 
50 template<typename T>
51 void TemplFunc() {
52 #pragma acc parallel default(none)
53   {
54     typename T::type I;
55   }
56 
57 #pragma acc serial default(present)
58   {
59     typename T::type I;
60   }
61 
62 #pragma acc kernels
63   {
64     typename T::type I;
65   }
66 
67   // CHECK-LABEL: FunctionTemplateDecl {{.*}}TemplFunc
68   // CHECK-NEXT: TemplateTypeParmDecl
69 
70   // Template Pattern:
71   // CHECK-NEXT: FunctionDecl
72   // CHECK-NEXT: CompoundStmt
73   // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel
74   // CHECK-NEXT: default(none)
75   // CHECK-NEXT: CompoundStmt
76   // CHECK-NEXT: DeclStmt
77   // CHECK-NEXT: VarDecl{{.*}} I 'typename T::type'
78   // CHECK-NEXT: OpenACCComputeConstruct {{.*}}serial
79   // CHECK-NEXT: default(present)
80   // CHECK-NEXT: CompoundStmt
81   // CHECK-NEXT: DeclStmt
82   // CHECK-NEXT: VarDecl{{.*}} I 'typename T::type'
83   // CHECK-NEXT: OpenACCComputeConstruct {{.*}}kernels
84   // CHECK-NEXT: CompoundStmt
85   // CHECK-NEXT: DeclStmt
86   // CHECK-NEXT: VarDecl{{.*}} I 'typename T::type'
87 
88   // Check instantiation.
89   // CHECK-LABEL: FunctionDecl{{.*}} used TemplFunc 'void ()' implicit_instantiation
90   // CHECK-NEXT: TemplateArgument type 'S'
91   // CHECK-NEXT: RecordType
92   // CHECK-NEXT: CXXRecord
93   // CHECK-NEXT: CompoundStmt
94   // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel
95   // CHECK-NEXT: default(none)
96   // CHECK-NEXT: CompoundStmt
97   // CHECK-NEXT: DeclStmt
98   // CHECK-NEXT: VarDecl{{.*}} I 'typename S::type':'int'
99   // CHECK-NEXT: OpenACCComputeConstruct {{.*}}serial
100   // CHECK-NEXT: default(present)
101   // CHECK-NEXT: CompoundStmt
102   // CHECK-NEXT: DeclStmt
103   // CHECK-NEXT: VarDecl{{.*}} I 'typename S::type':'int'
104   // CHECK-NEXT: OpenACCComputeConstruct {{.*}}kernels
105   // CHECK-NEXT: CompoundStmt
106   // CHECK-NEXT: DeclStmt
107   // CHECK-NEXT: VarDecl{{.*}} I 'typename S::type':'int'
108 }
109 
110 struct S {
111   using type = int;
112 };
113 
114 void use() {
115   TemplFunc<S>();
116 }
117 
118 struct HasCtor { HasCtor(); operator int(); ~HasCtor();};
119 
120 void useCtorType() {
121   // CHECK-LABEL: useCtorType
122   // CHECK-NEXT: CompoundStmt
123 
124 #pragma acc kernels num_workers(HasCtor{})
125   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} kernels
126   // CHECK-NEXT: num_workers clause
127   // CHECK-NEXT: ImplicitCastExpr{{.*}}'int' <UserDefinedConversion>
128   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'int'
129   // CHECK-NEXT: MemberExpr{{.*}}.operator int
130   // CHECK-NEXT: MaterializeTemporaryExpr{{.*}}'HasCtor'
131   // CHECK-NEXT: CXXBindTemporaryExpr{{.*}}'HasCtor'
132   // CHECK-NEXT: CXXTemporaryObjectExpr{{.*}}'HasCtor'
133 
134   while(true);
135   // CHECK-NEXT: WhileStmt
136   // CHECK-NEXT: CXXBoolLiteralExpr
137   // CHECK-NEXT: NullStmt
138 }
139 #endif
140