122 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_HELPER9int some_int();10short some_short();11long some_long();12struct CorrectConvert {13 operator int();14} Convert;15 16 17void NormalUses() {18 // CHECK: FunctionDecl{{.*}}NormalUses19 // CHECK-NEXT: CompoundStmt20 21#pragma acc parallel loop num_gangs(some_int(), some_long(), some_short())22 for (unsigned i = 0; i < 5; ++i);23 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop24 // CHECK-NEXT: num_gangs clause25 // CHECK-NEXT: CallExpr{{.*}}'int'26 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>27 // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'28 // CHECK-NEXT: CallExpr{{.*}}'long'29 // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>30 // CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'31 // CHECK-NEXT: CallExpr{{.*}}'short'32 // CHECK-NEXT: ImplicitCastExpr{{.*}}'short (*)()' <FunctionToPointerDecay>33 // CHECK-NEXT: DeclRefExpr{{.*}}'short ()' lvalue Function{{.*}} 'some_short' 'short ()'34 // CHECK-NEXT: ForStmt35 // CHECK: NullStmt36 37#pragma acc kernels loop num_gangs(some_int())38 for (unsigned i = 0; i < 5; ++i);39 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop40 // CHECK-NEXT: num_gangs clause41 // CHECK-NEXT: CallExpr{{.*}}'int'42 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>43 // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'44 // CHECK-NEXT: ForStmt45 // CHECK: NullStmt46}47 48template<typename T, typename U>49void TemplUses(T t, U u) {50 // CHECK-NEXT: FunctionTemplateDecl51 // CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 0 T52 // CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 1 U53 // CHECK-NEXT: FunctionDecl{{.*}} TemplUses 'void (T, U)'54 // CHECK-NEXT: ParmVarDecl{{.*}} t 'T'55 // CHECK-NEXT: ParmVarDecl{{.*}} u 'U'56 // CHECK-NEXT: CompoundStmt57 58#pragma acc kernels loop num_gangs(u)59 for (unsigned i = 0; i < 5; ++i);60 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop61 // CHECK-NEXT: num_gangs clause62 // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'63 // CHECK-NEXT: ForStmt64 // CHECK: NullStmt65 66#pragma acc parallel loop num_gangs(u, U::value)67 for (unsigned i = 0; i < 5; ++i);68 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop69 // CHECK-NEXT: num_gangs clause70 // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'71 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue72 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'73 // CHECK-NEXT: ForStmt74 // CHECK: NullStmt75 76 // Check the instantiated versions of the above.77 // CHECK-NEXT: FunctionDecl{{.*}} used TemplUses 'void (CorrectConvert, HasInt)' implicit_instantiation78 // CHECK-NEXT: TemplateArgument type 'CorrectConvert'79 // CHECK-NEXT: RecordType{{.*}} 'CorrectConvert'80 // CHECK-NEXT: CXXRecord{{.*}} 'CorrectConvert'81 // CHECK-NEXT: TemplateArgument type 'HasInt'82 // CHECK-NEXT: RecordType{{.*}} 'HasInt'83 // CHECK-NEXT: CXXRecord{{.*}} 'HasInt'84 // CHECK-NEXT: ParmVarDecl{{.*}} t 'CorrectConvert'85 // CHECK-NEXT: ParmVarDecl{{.*}} u 'HasInt'86 // CHECK-NEXT: CompoundStmt87 88 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop89 // CHECK-NEXT: num_gangs clause90 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>91 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'92 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char93 // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar94 // CHECK-NEXT: ForStmt95 // CHECK: NullStmt96 97 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop98 // CHECK-NEXT: num_gangs clause99 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>100 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'101 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char102 // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar103 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>104 // CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'105 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'106 // CHECK-NEXT: ForStmt107 // CHECK: NullStmt108}109 110struct HasInt {111 using IntTy = int;112 using ShortTy = short;113 static constexpr int value = 1;114 115 operator char();116};117 118void Inst() {119 TemplUses<CorrectConvert, HasInt>({}, {});120}121#endif // PCH_HELPER122