xref: /llvm-project/clang/test/SemaOpenACC/data-construct-ast.cpp (revision fbb14dd97702db242a31e1b36ca8a3554a73c212)
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 
14   int Var;
15   // CHECK-NEXT: DeclStmt
16   // CHECK-NEXT: VarDecl
17 
18   // TODO OpenACC: these constructs require the clauses to be legal, but we
19   // don't have the clauses implemented yet.  As we implement them, they needed
20   // to be added to the 'check' lines.
21 
22 #pragma acc data default(none)
23   while (Var);
24   // CHECK-NEXT: OpenACCDataConstruct{{.*}}data
25   // CHECK-NEXT: default(none)
26   // CHECK-NEXT: WhileStmt
27   // CHECK: NullStmt
28 #pragma acc enter data copyin(Var)
29   // CHECK-NEXT: OpenACCEnterDataConstruct{{.*}} enter data
30   // CHECK-NEXT: copyin clause
31   // CHECK-NEXT: DeclRefExpr{{.*}}'Var' 'int'
32 #pragma acc exit data copyout(Var)
33   // CHECK-NEXT: OpenACCExitDataConstruct{{.*}} exit data
34   // CHECK-NEXT: copyout clause
35   // CHECK-NEXT: DeclRefExpr{{.*}}'Var' 'int'
36 #pragma acc host_data use_device(Var)
37   while (Var);
38   // CHECK-NEXT: OpenACCHostDataConstruct{{.*}} host_data
39   // CHECK-NEXT: use_device clause
40   // CHECK-NEXT: DeclRefExpr{{.*}}'Var' 'int'
41   // CHECK-NEXT: WhileStmt
42   // CHECK: NullStmt
43 }
44 
45 template<typename T>
46 void TemplFunc() {
47   // CHECK-LABEL: FunctionTemplateDecl {{.*}}TemplFunc
48   // CHECK-NEXT: TemplateTypeParmDecl
49   // CHECK-NEXT: FunctionDecl{{.*}}TemplFunc
50   // CHECK-NEXT: CompoundStmt
51 
52   T Var;
53   // CHECK-NEXT: DeclStmt
54   // CHECK-NEXT: VarDecl
55 
56 #pragma acc data default(none)
57   while (Var);
58   // CHECK-NEXT: OpenACCDataConstruct{{.*}}data
59   // CHECK-NEXT: default(none)
60   // CHECK-NEXT: WhileStmt
61   // CHECK: NullStmt
62 #pragma acc enter data copyin(Var)
63   // CHECK-NEXT: OpenACCEnterDataConstruct{{.*}} enter data
64   // CHECK-NEXT: copyin clause
65   // CHECK-NEXT: DeclRefExpr{{.*}}'Var' 'T'
66 #pragma acc exit data copyout(Var)
67   // CHECK-NEXT: OpenACCExitDataConstruct{{.*}} exit data
68   // CHECK-NEXT: copyout clause
69   // CHECK-NEXT: DeclRefExpr{{.*}}'Var' 'T'
70 #pragma acc host_data use_device(Var)
71   while (Var);
72   // CHECK-NEXT: OpenACCHostDataConstruct{{.*}} host_data
73   // CHECK-NEXT: use_device clause
74   // CHECK-NEXT: DeclRefExpr{{.*}}'Var' 'T'
75   // CHECK-NEXT: WhileStmt
76   // CHECK: NullStmt
77 
78   // Instantiation:
79   // CHECK-NEXT: FunctionDecl{{.*}} TemplFunc 'void ()' implicit_instantiation
80   // CHECK-NEXT: TemplateArgument type 'int'
81   // CHECK-NEXT: BuiltinType{{.*}} 'int'
82   // CHECK-NEXT: CompoundStmt
83 
84   // CHECK-NEXT: DeclStmt
85   // CHECK-NEXT: VarDecl
86 
87   // CHECK-NEXT: OpenACCDataConstruct{{.*}}data
88   // CHECK-NEXT: default(none)
89   // CHECK-NEXT: WhileStmt
90   // CHECK: NullStmt
91 
92   // CHECK-NEXT: OpenACCEnterDataConstruct{{.*}} enter data
93   // CHECK-NEXT: copyin clause
94   // CHECK-NEXT: DeclRefExpr{{.*}}'Var' 'int'
95 
96   // CHECK-NEXT: OpenACCExitDataConstruct{{.*}} exit data
97   // CHECK-NEXT: copyout clause
98   // CHECK-NEXT: DeclRefExpr{{.*}}'Var' 'int'
99 
100   // CHECK-NEXT: OpenACCHostDataConstruct{{.*}} host_data
101   // CHECK-NEXT: use_device clause
102   // CHECK-NEXT: DeclRefExpr{{.*}}'Var' 'int'
103   // CHECK-NEXT: WhileStmt
104   // CHECK: NullStmt
105 }
106 void use() {
107   TemplFunc<int>();
108 }
109 #endif
110