xref: /llvm-project/clang/test/SemaOpenACC/data-construct-if-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 void NormalFunc(int j, float f) {
10   // CHECK: FunctionDecl{{.*}}NormalFunc
11   // CHECK-NEXT: ParmVarDecl
12   // CHECK-NEXT: ParmVarDecl
13   // CHECK-NEXT: CompoundStmt
14 #pragma acc data if( j < f) default(none)
15   ;
16   // CHECK-NEXT: OpenACCDataConstruct{{.*}}data
17   // CHECK-NEXT: if clause
18   // CHECK-NEXT: BinaryOperator{{.*}} 'bool' '<'
19   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float' <IntegralToFloating>
20   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
21   // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'j' 'int'
22   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float' <LValueToRValue>
23   // CHECK-NEXT: DeclRefExpr{{.*}} 'float' lvalue ParmVar{{.*}} 'f' 'float'
24   // CHECK-NEXT: default(none)
25   // CHECK-NEXT: NullStmt
26 
27 }
28 
29 int Global;
30 
31 template<typename T>
32 void TemplFunc() {
33   // CHECK: FunctionTemplateDecl{{.*}}TemplFunc
34   // CHECK-NEXT: TemplateTypeParmDecl
35 
36   // Match the prototype:
37   // CHECK-NEXT: FunctionDecl{{.*}}TemplFunc
38   // CHECK-NEXT: CompoundStmt
39 
40 #pragma acc data default(none) if(T::SomeFloat < typename T::IntTy{})
41   ;
42   // CHECK-NEXT: OpenACCDataConstruct{{.*}}data
43   // CHECK-NEXT: default(none)
44   // CHECK-NEXT: if clause
45   // CHECK-NEXT: BinaryOperator{{.*}} '<dependent type>' '<'
46   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
47   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
48   // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'typename T::IntTy' 'typename T::IntTy'
49   // CHECK-NEXT: InitListExpr{{.*}} 'void'
50   // CHECK-NEXT: NullStmt
51 
52 #pragma acc enter data copyin(Global) if(typename T::IntTy{})
53   ;
54   // CHECK-NEXT: OpenACCEnterDataConstruct{{.*}}enter data
55   // CHECK-NEXT: copyin clause
56   // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'
57   // CHECK-NEXT: if clause
58   // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'typename T::IntTy' 'typename T::IntTy'
59   // CHECK-NEXT: InitListExpr{{.*}} 'void'
60   // CHECK-NEXT: NullStmt
61 
62 #pragma acc exit data copyout(Global) if(T::SomeFloat)
63   ;
64   // CHECK-NEXT: OpenACCExitDataConstruct{{.*}}exit data
65   // CHECK-NEXT: copyout clause
66   // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'
67   // CHECK-NEXT: if clause
68   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
69   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
70   // CHECK-NEXT: NullStmt
71 
72 #pragma acc host_data use_device(Global) if(T::BC)
73   ;
74   // CHECK-NEXT: OpenACCHostDataConstruct{{.*}}host_data
75   // CHECK-NEXT: use_device clause
76   // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'
77   // CHECK-NEXT: if clause
78   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
79   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
80   // CHECK-NEXT: NullStmt
81 
82   // Match the instantiation:
83   // CHECK: FunctionDecl{{.*}}TemplFunc{{.*}}implicit_instantiation
84   // CHECK-NEXT: TemplateArgument type 'InstTy'
85   // CHECK-NEXT: RecordType{{.*}} 'InstTy'
86   // CHECK-NEXT: CXXRecord{{.*}} 'InstTy'
87   // CHECK-NEXT: CompoundStmt
88 
89   // CHECK-NEXT: OpenACCDataConstruct{{.*}}data
90   // CHECK-NEXT: default(none)
91   // CHECK-NEXT: if clause
92   // CHECK-NEXT: BinaryOperator{{.*}} 'bool' '<'
93   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float' <LValueToRValue>
94   // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float'
95   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'
96   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float' <IntegralToFloating>
97   // CHECK-NEXT: CXXFunctionalCastExpr{{.*}}'typename InstTy::IntTy':'int' functional cast to typename struct InstTy::IntTy <NoOp>
98   // CHECK-NEXT: InitListExpr {{.*}}'typename InstTy::IntTy':'int'
99   // CHECK-NEXT: NullStmt
100 
101   // CHECK-NEXT: OpenACCEnterDataConstruct{{.*}}enter data
102   // CHECK-NEXT: copyin clause
103   // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'
104   // CHECK-NEXT: if clause
105   // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <IntegralToBoolean>
106   // CHECK-NEXT: CXXFunctionalCastExpr{{.*}}'typename InstTy::IntTy':'int' functional cast to typename struct InstTy::IntTy <NoOp>
107   // CHECK-NEXT: InitListExpr {{.*}}'typename InstTy::IntTy':'int'
108   // CHECK-NEXT: NullStmt
109 
110   // CHECK-NEXT: OpenACCExitDataConstruct{{.*}}exit data
111   // CHECK-NEXT: copyout clause
112   // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'
113   // CHECK-NEXT: if clause
114   // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean>
115   // CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue>
116   // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float'
117   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'
118   // CHECK-NEXT: NullStmt
119 
120   // CHECK-NEXT: OpenACCHostDataConstruct{{.*}}host_data
121   // CHECK-NEXT: use_device clause
122   // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'
123   // CHECK-NEXT: if clause
124   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'bool' <UserDefinedConversion>
125   // CHECK-NEXT: CXXMemberCallExpr{{.*}} 'bool'
126   // CHECK-NEXT: MemberExpr{{.*}} .operator bool
127   // CHECK-NEXT: DeclRefExpr{{.*}} 'const BoolConversion' lvalue Var{{.*}} 'BC' 'const BoolConversion'
128   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'
129   // CHECK-NEXT: NullStmt
130 
131 }
132 
133 struct BoolConversion{ operator bool() const;};
134 struct InstTy {
135   using IntTy = int;
136   static constexpr float SomeFloat = 5.0;
137   static constexpr BoolConversion BC;
138 };
139 
140 void Instantiate() {
141   TemplFunc<InstTy>();
142 }
143 #endif
144