1 // RUN: %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s
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
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 kernels loop if( j < f)
15 for (unsigned i
= 0; i
< 5; ++i
);
16 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}}kernels loop
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: ForStmt
31 // CHECK: FunctionTemplateDecl{{.*}}TemplFunc
32 // CHECK-NEXT: TemplateTypeParmDecl
34 // Match the prototype:
35 // CHECK-NEXT: FunctionDecl{{.*}}TemplFunc
36 // CHECK-NEXT: CompoundStmt
38 #pragma acc parallel loop if(T::SomeFloat < typename T::IntTy{})
39 for (unsigned i
= 0; i
< 5; ++i
);
40 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}}parallel loop
41 // CHECK-NEXT: if clause
42 // CHECK-NEXT: BinaryOperator{{.*}} '<dependent type>' '<'
43 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
44 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
45 // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'typename T::IntTy' 'typename T::IntTy'
46 // CHECK-NEXT: InitListExpr{{.*}} 'void'
47 // CHECK-NEXT: ForStmt
50 #pragma acc serial loop if(typename T::IntTy{})
51 for (unsigned i
= 0; i
< 5; ++i
);
52 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}}serial loop
53 // CHECK-NEXT: if clause
54 // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'typename T::IntTy' 'typename T::IntTy'
55 // CHECK-NEXT: InitListExpr{{.*}} 'void'
56 // CHECK-NEXT: ForStmt
59 #pragma acc kernels loop if(T::SomeFloat)
60 for (unsigned i
= 0; i
< 5; ++i
);
61 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}}kernels loop
62 // CHECK-NEXT: if clause
63 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
64 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
65 // CHECK-NEXT: ForStmt
68 #pragma acc parallel loop if(T::BC)
69 for (unsigned i
= 0; i
< 5; ++i
);
70 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}}parallel loop
71 // CHECK-NEXT: if clause
72 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
73 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
74 // CHECK-NEXT: ForStmt
77 // Match the instantiation:
78 // CHECK: FunctionDecl{{.*}}TemplFunc{{.*}}implicit_instantiation
79 // CHECK-NEXT: TemplateArgument type 'InstTy'
80 // CHECK-NEXT: RecordType{{.*}} 'InstTy'
81 // CHECK-NEXT: CXXRecord{{.*}} 'InstTy'
82 // CHECK-NEXT: CompoundStmt
84 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}}parallel loop
85 // CHECK-NEXT: if clause
86 // CHECK-NEXT: BinaryOperator{{.*}} 'bool' '<'
87 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float' <LValueToRValue>
88 // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float'
89 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'
90 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float' <IntegralToFloating>
91 // CHECK-NEXT: CXXFunctionalCastExpr{{.*}}'typename InstTy::IntTy':'int' functional cast to typename struct InstTy::IntTy <NoOp>
92 // CHECK-NEXT: InitListExpr {{.*}}'typename InstTy::IntTy':'int'
93 // CHECK-NEXT: ForStmt
96 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}}serial loop
97 // CHECK-NEXT: if clause
98 // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <IntegralToBoolean>
99 // CHECK-NEXT: CXXFunctionalCastExpr{{.*}}'typename InstTy::IntTy':'int' functional cast to typename struct InstTy::IntTy <NoOp>
100 // CHECK-NEXT: InitListExpr {{.*}}'typename InstTy::IntTy':'int'
101 // CHECK-NEXT: ForStmt
104 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}}kernels loop
105 // CHECK-NEXT: if clause
106 // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean>
107 // CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue>
108 // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float'
109 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'
110 // CHECK-NEXT: ForStmt
113 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}}parallel loop
114 // CHECK-NEXT: if clause
115 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'bool' <UserDefinedConversion>
116 // CHECK-NEXT: CXXMemberCallExpr{{.*}} 'bool'
117 // CHECK-NEXT: MemberExpr{{.*}} .operator bool
118 // CHECK-NEXT: DeclRefExpr{{.*}} 'const BoolConversion' lvalue Var{{.*}} 'BC' 'const BoolConversion'
119 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'
120 // CHECK-NEXT: ForStmt
125 struct BoolConversion
{ operator bool() const;};
128 static constexpr float SomeFloat
= 5.0;
129 static constexpr BoolConversion BC
;