[libc++][NFC] Replace typedefs with using aliases in <string> (#126070)
[llvm-project.git] / clang / test / SemaOpenACC / combined-construct-if-ast.cpp
blobf0796409d942d798e18b7dd40f96fa4e4d59dc60
1 // RUN: %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s
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
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 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
25 // CHECK: NullStmt
29 template<typename T>
30 void TemplFunc() {
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
48 // CHECK: NullStmt
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
57 // CHECK: NullStmt
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
66 // CHECK: NullStmt
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
75 // CHECK: NullStmt
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
94 // CHECK: NullStmt
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
102 // CHECK: NullStmt
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
111 // CHECK: NullStmt
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
121 // CHECK: NullStmt
125 struct BoolConversion{ operator bool() const;};
126 struct InstTy {
127 using IntTy = int;
128 static constexpr float SomeFloat = 5.0;
129 static constexpr BoolConversion BC;
132 void Instantiate() {
133 TemplFunc<InstTy>();
135 #endif