226 lines · cpp
1// RUN: %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s2 3// Test this with PCH.4// RUN: %clang_cc1 %s -fopenacc -emit-pch -o %t %s5// RUN: %clang_cc1 %s -fopenacc -include-pch %t -ast-dump-all | FileCheck %s6 7#ifndef PCH_HELPER8#define PCH_HELPER9 10int some_int();11long some_long();12 13void NormalFunc() {14 // CHECK-LABEL: NormalFunc15 // CHECK-NEXT: CompoundStmt16 17#pragma acc wait async(some_int())18 // CHECK-NEXT: OpenACCWaitConstruct{{.*}}wait19 // CHECK-NEXT: <<<NULL>>20 // CHECK-NEXT: async clause21 // CHECK-NEXT: CallExpr{{.*}}'int'22 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>23 // CHECK-NEXT: DeclRefExpr{{.*}}'some_int'24#pragma acc wait async25 // CHECK-NEXT: OpenACCWaitConstruct{{.*}}wait26 // CHECK-NEXT: <<<NULL>>27 // CHECK-NEXT: async clause28#pragma acc wait(some_int(), some_long()) if (some_int() < some_long())29 // CHECK-NEXT: OpenACCWaitConstruct{{.*}}wait30 // CHECK-NEXT: <<<NULL>>31 // CHECK-NEXT: CallExpr{{.*}}'int'32 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>33 // CHECK-NEXT: DeclRefExpr{{.*}}'some_int'34 // CHECK-NEXT: CallExpr{{.*}}'long'35 // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>36 // CHECK-NEXT: DeclRefExpr{{.*}}'some_long'37 // CHECK-NEXT: if clause38 // CHECK-NEXT: BinaryOperator{{.*}} 'bool' '<'39 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'long'40 // CHECK-NEXT: CallExpr{{.*}}'int'41 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>42 // CHECK-NEXT: DeclRefExpr{{.*}}'some_int'43 // CHECK-NEXT: CallExpr{{.*}}'long'44 // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>45 // CHECK-NEXT: DeclRefExpr{{.*}}'some_long'46#pragma acc wait(queues:some_int(), some_long())47 // CHECK-NEXT: OpenACCWaitConstruct{{.*}}wait48 // CHECK-NEXT: <<<NULL>>49 // CHECK-NEXT: CallExpr{{.*}}'int'50 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>51 // CHECK-NEXT: DeclRefExpr{{.*}}'some_int'52 // CHECK-NEXT: CallExpr{{.*}}'long'53 // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>54 // CHECK-NEXT: DeclRefExpr{{.*}}'some_long'55#pragma acc wait(devnum:some_int() : queues:some_int(), some_long())56 // CHECK-NEXT: OpenACCWaitConstruct{{.*}}wait57 // CHECK-NEXT: CallExpr{{.*}}'int'58 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>59 // CHECK-NEXT: DeclRefExpr{{.*}}'some_int'60 // CHECK-NEXT: CallExpr{{.*}}'int'61 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>62 // CHECK-NEXT: DeclRefExpr{{.*}}'some_int'63 // CHECK-NEXT: CallExpr{{.*}}'long'64 // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>65 // CHECK-NEXT: DeclRefExpr{{.*}}'some_long'66#pragma acc wait(devnum:some_int() : some_int(), some_long())67 // CHECK-NEXT: OpenACCWaitConstruct{{.*}}wait68 // CHECK-NEXT: CallExpr{{.*}}'int'69 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>70 // CHECK-NEXT: DeclRefExpr{{.*}}'some_int'71 // CHECK-NEXT: CallExpr{{.*}}'int'72 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>73 // CHECK-NEXT: DeclRefExpr{{.*}}'some_int'74 // CHECK-NEXT: CallExpr{{.*}}'long'75 // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>76 // CHECK-NEXT: DeclRefExpr{{.*}}'some_long'77}78 79template<typename T>80void TemplFunc(T t) {81 // CHECK-LABEL: FunctionTemplateDecl {{.*}}TemplFunc82 // CHECK-NEXT: TemplateTypeParmDecl83 // CHECK-NEXT: FunctionDecl{{.*}}TemplFunc84 // CHECK-NEXT: ParmVarDecl{{.*}} t 'T'85 // CHECK-NEXT: CompoundStmt86 87#pragma acc wait async(T::value)88 // CHECK-NEXT: OpenACCWaitConstruct{{.*}}wait89 // CHECK-NEXT: <<<NULL>>90 // CHECK-NEXT: async clause91 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>'92 // CHECK-NEXT: NestedNameSpecifier{{.*}} 'T'93#pragma acc wait async94 // CHECK-NEXT: OpenACCWaitConstruct{{.*}}wait95 // CHECK-NEXT: <<<NULL>>96 // CHECK-NEXT: async clause97#pragma acc wait(t, T::value) if (T::value > t)98 // CHECK-NEXT: OpenACCWaitConstruct{{.*}}wait99 // CHECK-NEXT: <<<NULL>>100 // CHECK-NEXT: DeclRefExpr{{.*}} 'T' lvalue ParmVar{{.*}} 't' 'T'101 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>'102 // CHECK-NEXT: NestedNameSpecifier{{.*}} 'T'103 // CHECK-NEXT: if clause104 // CHECK-NEXT: BinaryOperator{{.*}} '<dependent type>' '>'105 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>'106 // CHECK-NEXT: NestedNameSpecifier{{.*}} 'T'107 // CHECK-NEXT: DeclRefExpr{{.*}} 'T' lvalue ParmVar{{.*}} 't' 'T'108#pragma acc wait(queues:typename T::IntTy{}, T::value) if (typename T::IntTy{} < typename T::ShortTy{})109 // CHECK-NEXT: OpenACCWaitConstruct{{.*}}wait110 // CHECK-NEXT: <<<NULL>>111 // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}}'typename T::IntTy' list112 // CHECK-NEXT: InitListExpr113 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>'114 // CHECK-NEXT: NestedNameSpecifier{{.*}} 'T'115 // CHECK-NEXT: if clause116 // CHECK-NEXT: BinaryOperator{{.*}} '<dependent type>' '<'117 // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}}'typename T::IntTy' list118 // CHECK-NEXT: InitListExpr119 // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}}'typename T::ShortTy' list120 // CHECK-NEXT: InitListExpr121#pragma acc wait(devnum:typename T::ShortTy{} : queues:some_int(), T::value)122 // CHECK-NEXT: OpenACCWaitConstruct{{.*}}wait123 // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}}'typename T::ShortTy' list124 // CHECK-NEXT: InitListExpr125 // CHECK-NEXT: CallExpr{{.*}}'int'126 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>127 // CHECK-NEXT: DeclRefExpr{{.*}}'some_int'128 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>'129 // CHECK-NEXT: NestedNameSpecifier{{.*}} 'T'130#pragma acc wait(devnum:typename T::ShortTy{} : T::value, some_long())131 // CHECK-NEXT: OpenACCWaitConstruct{{.*}}wait132 // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}}'typename T::ShortTy' list133 // CHECK-NEXT: InitListExpr134 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>'135 // CHECK-NEXT: NestedNameSpecifier{{.*}} 'T'136 // CHECK-NEXT: CallExpr{{.*}}'long'137 // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>138 // CHECK-NEXT: DeclRefExpr{{.*}}'some_long'139 140 // Instantiation:141 // CHECK-NEXT: FunctionDecl{{.*}} TemplFunc 'void (HasInt)' implicit_instantiation142 // CHECK-NEXT: TemplateArgument type 'HasInt'143 // CHECK-NEXT: RecordType{{.*}} 'HasInt'144 // CHECK-NEXT: CXXRecord{{.*}} 'HasInt'145 // CHECK-NEXT: ParmVarDecl{{.*}} t 'HasInt'146 // CHECK-NEXT: CompoundStmt147 148 // CHECK-NEXT: OpenACCWaitConstruct{{.*}}wait149 // CHECK-NEXT: <<<NULL>>150 // CHECK-NEXT: async clause151 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int'152 // CHECK-NEXT: DeclRefExpr{{.*}}'value' 'const int'153 // CHECK-NEXT: NestedNameSpecifier {{.*}}'HasInt'154 //155 // CHECK-NEXT: OpenACCWaitConstruct{{.*}}wait156 // CHECK-NEXT: <<<NULL>>157 // CHECK-NEXT: async clause158 //159 // CHECK-NEXT: OpenACCWaitConstruct{{.*}}wait160 // CHECK-NEXT: <<<NULL>>161 // CHECK-NEXT: ImplicitCastExpr{{.*}}'char' <UserDefinedConversion>162 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'163 // CHECK-NEXT: MemberExpr{{.*}}.operator char164 // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar{{.*}} 't' 'HasInt'165 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int'166 // CHECK-NEXT: DeclRefExpr{{.*}}'value' 'const int'167 // CHECK-NEXT: NestedNameSpecifier {{.*}}'HasInt'168 // CHECK-NEXT: if clause169 // CHECK-NEXT: BinaryOperator{{.*}} 'bool' '>'170 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int'171 // CHECK-NEXT: DeclRefExpr{{.*}}'value' 'const int'172 // CHECK-NEXT: NestedNameSpecifier {{.*}}'HasInt'173 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int' <IntegralCast>174 // CHECK-NEXT: ImplicitCastExpr{{.*}}'char' <UserDefinedConversion>175 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'176 // CHECK-NEXT: MemberExpr{{.*}}.operator char177 // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar{{.*}} 't' 'HasInt'178 //179 // CHECK-NEXT: OpenACCWaitConstruct{{.*}}wait180 // CHECK-NEXT: <<<NULL>>181 // CHECK-NEXT: CXXFunctionalCastExpr{{.*}}'typename HasInt::IntTy':'int'182 // CHECK-NEXT: InitListExpr{{.*}}'typename HasInt::IntTy':'int'183 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int'184 // CHECK-NEXT: DeclRefExpr{{.*}}'value' 'const int'185 // CHECK-NEXT: NestedNameSpecifier {{.*}}'HasInt'186 // CHECK-NEXT: if clause187 // CHECK-NEXT: BinaryOperator{{.*}} 'bool' '<'188 // CHECK-NEXT: CXXFunctionalCastExpr{{.*}}'typename HasInt::IntTy':'int'189 // CHECK-NEXT: InitListExpr{{.*}}'typename HasInt::IntTy':'int'190 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int'191 // CHECK-NEXT: CXXFunctionalCastExpr{{.*}}'typename HasInt::ShortTy':'short'192 // CHECK-NEXT: InitListExpr{{.*}}'typename HasInt::ShortTy':'short'193 //194 // CHECK-NEXT: OpenACCWaitConstruct{{.*}}wait195 // CHECK-NEXT: CXXFunctionalCastExpr{{.*}}'typename HasInt::ShortTy':'short'196 // CHECK-NEXT: InitListExpr{{.*}}'typename HasInt::ShortTy':'short'197 // CHECK-NEXT: CallExpr{{.*}}'int'198 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>199 // CHECK-NEXT: DeclRefExpr{{.*}}'some_int'200 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int'201 // CHECK-NEXT: DeclRefExpr{{.*}}'value' 'const int'202 // CHECK-NEXT: NestedNameSpecifier {{.*}}'HasInt'203 //204 // CHECK-NEXT: OpenACCWaitConstruct{{.*}}wait205 // CHECK-NEXT: CXXFunctionalCastExpr{{.*}}'typename HasInt::ShortTy':'short'206 // CHECK-NEXT: InitListExpr{{.*}}'typename HasInt::ShortTy':'short'207 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int'208 // CHECK-NEXT: DeclRefExpr{{.*}}'value' 'const int'209 // CHECK-NEXT: NestedNameSpecifier {{.*}}'HasInt'210 // CHECK-NEXT: CallExpr{{.*}}'long'211 // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>212 // CHECK-NEXT: DeclRefExpr{{.*}}'some_long'213}214 215struct HasInt {216 using IntTy = int;217 using ShortTy = short;218 static constexpr int value = 1;219 220 operator char();221};222void use() {223 TemplFunc(HasInt{});224}225#endif226