142f4e505SErich Keane 242f4e505SErich Keane // RUN: %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s 342f4e505SErich Keane 442f4e505SErich Keane // Test this with PCH. 542f4e505SErich Keane // RUN: %clang_cc1 %s -fopenacc -emit-pch -o %t %s 642f4e505SErich Keane // RUN: %clang_cc1 %s -fopenacc -include-pch %t -ast-dump-all | FileCheck %s 742f4e505SErich Keane 842f4e505SErich Keane #ifndef PCH_HELPER 942f4e505SErich Keane #define PCH_HELPER 1042f4e505SErich Keane 1142f4e505SErich Keane void NormalFunc() { 1242f4e505SErich Keane // CHECK-LABEL: NormalFunc 1342f4e505SErich Keane // CHECK-NEXT: CompoundStmt 1442f4e505SErich Keane 1542f4e505SErich Keane #pragma acc loop 16b0cfbfd7SErich Keane for(int i = 0; i < 5;++i); 1742f4e505SErich Keane // CHECK-NEXT: OpenACCLoopConstruct{{.*}} <orphan> 1842f4e505SErich Keane // CHECK-NEXT: ForStmt 19b0cfbfd7SErich Keane // CHECK-NEXT: DeclStmt 20b0cfbfd7SErich Keane // CHECK-NEXT: VarDecl {{.*}} used i 'int' 21b0cfbfd7SErich Keane // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0 22b0cfbfd7SErich Keane // CHECK-NEXT: <<<NULL>> 23b0cfbfd7SErich Keane // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<' 24b0cfbfd7SErich Keane // CHECK-NEXT: ImplicitCastExpr 25b0cfbfd7SErich Keane // CHECK-NEXT: DeclRefExpr 26b0cfbfd7SErich Keane // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5 27b0cfbfd7SErich Keane // CHECK-NEXT: UnaryOperator{{.*}} prefix '++' 28b0cfbfd7SErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int' 2942f4e505SErich Keane // CHECK-NEXT: NullStmt 3042f4e505SErich Keane 3142f4e505SErich Keane int array[5]; 3242f4e505SErich Keane // CHECK-NEXT: DeclStmt 3342f4e505SErich Keane // CHECK-NEXT: VarDecl 3442f4e505SErich Keane #pragma acc loop 3542f4e505SErich Keane for(auto x : array){} 3642f4e505SErich Keane // CHECK-NEXT: OpenACCLoopConstruct{{.*}} <orphan> 3742f4e505SErich Keane // CHECK-NEXT: CXXForRangeStmt 3842f4e505SErich Keane // CHECK: CompoundStmt 3942f4e505SErich Keane 4042f4e505SErich Keane #pragma acc parallel 4142f4e505SErich Keane // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel 4242f4e505SErich Keane // CHECK-NEXT: CompoundStmt 4342f4e505SErich Keane { 4442f4e505SErich Keane #pragma acc parallel 45*e4d57d6aSerichkeane // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel 4642f4e505SErich Keane // CHECK-NEXT: CompoundStmt 4742f4e505SErich Keane { 4842f4e505SErich Keane #pragma acc loop 49b0cfbfd7SErich Keane for(int i = 0; i < 5;++i); 50*e4d57d6aSerichkeane // CHECK-NEXT: OpenACCLoopConstruct{{.*}} parent: parallel 5142f4e505SErich Keane // CHECK-NEXT: ForStmt 52b0cfbfd7SErich Keane // CHECK-NEXT: DeclStmt 53b0cfbfd7SErich Keane // CHECK-NEXT: VarDecl {{.*}} used i 'int' 54b0cfbfd7SErich Keane // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0 5542f4e505SErich Keane // CHECK-NEXT: <<<NULL>>> 56b0cfbfd7SErich Keane // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<' 57b0cfbfd7SErich Keane // CHECK-NEXT: ImplicitCastExpr 58b0cfbfd7SErich Keane // CHECK-NEXT: DeclRefExpr 59b0cfbfd7SErich Keane // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5 60b0cfbfd7SErich Keane // CHECK-NEXT: UnaryOperator{{.*}} prefix '++' 61b0cfbfd7SErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int' 6242f4e505SErich Keane // CHECK-NEXT: NullStmt 6342f4e505SErich Keane } 6442f4e505SErich Keane } 6542f4e505SErich Keane } 6642f4e505SErich Keane 6742f4e505SErich Keane template<typename T> 6842f4e505SErich Keane void TemplFunc() { 6942f4e505SErich Keane // CHECK-LABEL: FunctionTemplateDecl {{.*}}TemplFunc 7042f4e505SErich Keane // CHECK-NEXT: TemplateTypeParmDecl 7142f4e505SErich Keane // CHECK-NEXT: FunctionDecl{{.*}}TemplFunc 7242f4e505SErich Keane // CHECK-NEXT: CompoundStmt 7342f4e505SErich Keane 7442f4e505SErich Keane #pragma acc loop 7542f4e505SErich Keane // CHECK-NEXT: OpenACCLoopConstruct{{.*}} <orphan> 7642f4e505SErich Keane for(typename T::type t = 0; t < 5;++t) { 7742f4e505SErich Keane // CHECK-NEXT: ForStmt 7842f4e505SErich Keane // CHECK-NEXT: DeclStmt 7942f4e505SErich Keane // CHECK-NEXT: VarDecl{{.*}} referenced t 'typename T::type' 8042f4e505SErich Keane // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0 8142f4e505SErich Keane // CHECK-NEXT: <<<NULL>> 8242f4e505SErich Keane // CHECK-NEXT: BinaryOperator{{.*}} '<dependent type>' '<' 8342f4e505SErich Keane // CHECK-NEXT: DeclRefExpr {{.*}} 'typename T::type' lvalue Var 8442f4e505SErich Keane // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5 8542f4e505SErich Keane // CHECK-NEXT: UnaryOperator{{.*}} '<dependent type>' lvalue prefix '++' 8642f4e505SErich Keane // CHECK-NEXT: DeclRefExpr {{.*}} 'typename T::type' lvalue Var 8742f4e505SErich Keane // CHECK-NEXT: CompoundStmt 8842f4e505SErich Keane typename T::type I; 8942f4e505SErich Keane // CHECK-NEXT: DeclStmt 9042f4e505SErich Keane // CHECK-NEXT: VarDecl{{.*}} I 'typename T::type' 9142f4e505SErich Keane 9242f4e505SErich Keane } 9342f4e505SErich Keane 94*e4d57d6aSerichkeane #pragma acc serial 95*e4d57d6aSerichkeane { 96*e4d57d6aSerichkeane // CHECK-NEXT: OpenACCComputeConstruct {{.*}}serial 97*e4d57d6aSerichkeane // CHECK-NEXT: CompoundStmt 9842f4e505SErich Keane #pragma acc parallel 9942f4e505SErich Keane { 10042f4e505SErich Keane // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel 10142f4e505SErich Keane // CHECK-NEXT: CompoundStmt 10242f4e505SErich Keane #pragma acc loop 103*e4d57d6aSerichkeane // CHECK-NEXT: OpenACCLoopConstruct{{.*}} parent: parallel 10442f4e505SErich Keane // CHECK-NEXT: ForStmt 105b0cfbfd7SErich Keane // CHECK-NEXT: DeclStmt 106b0cfbfd7SErich Keane // CHECK-NEXT: VarDecl {{.*}} i 'int' 107b0cfbfd7SErich Keane // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0 10842f4e505SErich Keane // CHECK-NEXT: <<<NULL>>> 109b0cfbfd7SErich Keane // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<' 110b0cfbfd7SErich Keane // CHECK-NEXT: ImplicitCastExpr 111b0cfbfd7SErich Keane // CHECK-NEXT: DeclRefExpr 112b0cfbfd7SErich Keane // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5 113b0cfbfd7SErich Keane // CHECK-NEXT: UnaryOperator{{.*}} prefix '++' 114b0cfbfd7SErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int' 11542f4e505SErich Keane // CHECK-NEXT: NullStmt 116b0cfbfd7SErich Keane for(int i = 0; i < 5;++i); 11742f4e505SErich Keane 11842f4e505SErich Keane #pragma acc loop 119*e4d57d6aSerichkeane // CHECK-NEXT: OpenACCLoopConstruct{{.*}} parent: parallel 12042f4e505SErich Keane // CHECK-NEXT: ForStmt 121b0cfbfd7SErich Keane // CHECK-NEXT: DeclStmt 122b0cfbfd7SErich Keane // CHECK-NEXT: VarDecl {{.*}} i 'int' 123b0cfbfd7SErich Keane // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0 12442f4e505SErich Keane // CHECK-NEXT: <<<NULL>>> 125b0cfbfd7SErich Keane // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<' 126b0cfbfd7SErich Keane // CHECK-NEXT: ImplicitCastExpr 127b0cfbfd7SErich Keane // CHECK-NEXT: DeclRefExpr 128b0cfbfd7SErich Keane // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5 129b0cfbfd7SErich Keane // CHECK-NEXT: UnaryOperator{{.*}} prefix '++' 130b0cfbfd7SErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int' 13142f4e505SErich Keane // CHECK-NEXT: NullStmt 132b0cfbfd7SErich Keane for(int i = 0; i < 5;++i); 13342f4e505SErich Keane } 13442f4e505SErich Keane } 13542f4e505SErich Keane 13642f4e505SErich Keane typename T::type array[5]; 13742f4e505SErich Keane // CHECK-NEXT: DeclStmt 13842f4e505SErich Keane // CHECK-NEXT: VarDecl 13942f4e505SErich Keane 14042f4e505SErich Keane #pragma acc loop 14142f4e505SErich Keane for(auto x : array){} 14242f4e505SErich Keane // CHECK-NEXT: OpenACCLoopConstruct{{.*}} <orphan> 14342f4e505SErich Keane // CHECK-NEXT: CXXForRangeStmt 14442f4e505SErich Keane // CHECK: CompoundStmt 14542f4e505SErich Keane 14642f4e505SErich Keane // Instantiation: 14742f4e505SErich Keane // CHECK-NEXT: FunctionDecl{{.*}} TemplFunc 'void ()' implicit_instantiation 14842f4e505SErich Keane // CHECK-NEXT: TemplateArgument type 'S' 14942f4e505SErich Keane // CHECK-NEXT: RecordType{{.*}} 'S' 15042f4e505SErich Keane // CHECK-NEXT: CXXRecord{{.*}} 'S' 15142f4e505SErich Keane // CHECK-NEXT: CompoundStmt 15242f4e505SErich Keane 15342f4e505SErich Keane // CHECK-NEXT: OpenACCLoopConstruct{{.*}} <orphan> 15442f4e505SErich Keane // CHECK-NEXT: ForStmt 15542f4e505SErich Keane // CHECK-NEXT: DeclStmt 15642f4e505SErich Keane // CHECK-NEXT: VarDecl{{.*}} used t 'typename S::type':'int' 15742f4e505SErich Keane // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0 15842f4e505SErich Keane // CHECK-NEXT: <<<NULL>> 15942f4e505SErich Keane // CHECK-NEXT: BinaryOperator{{.*}} 'bool' '<' 16042f4e505SErich Keane // CHECK-NEXT: ImplicitCastExpr{{.*}} 'typename S::type':'int' <LValueToRValue> 16142f4e505SErich Keane // CHECK-NEXT: DeclRefExpr {{.*}} 'typename S::type':'int' lvalue Var 16242f4e505SErich Keane // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5 16342f4e505SErich Keane // CHECK-NEXT: UnaryOperator{{.*}} 'typename S::type':'int' lvalue prefix '++' 16442f4e505SErich Keane // CHECK-NEXT: DeclRefExpr {{.*}} 'typename S::type':'int' lvalue Var 16542f4e505SErich Keane // CHECK-NEXT: CompoundStmt 16642f4e505SErich Keane // CHECK-NEXT: DeclStmt 16742f4e505SErich Keane // CHECK-NEXT: VarDecl{{.*}} I 'typename S::type':'int' 16842f4e505SErich Keane 169*e4d57d6aSerichkeane // CHECK-NEXT: OpenACCComputeConstruct {{.*}}serial 17042f4e505SErich Keane // CHECK-NEXT: CompoundStmt 17142f4e505SErich Keane // 172*e4d57d6aSerichkeane // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel 17342f4e505SErich Keane // CHECK-NEXT: CompoundStmt 17442f4e505SErich Keane 175*e4d57d6aSerichkeane // CHECK-NEXT: OpenACCLoopConstruct{{.*}} parent: parallel 17642f4e505SErich Keane // CHECK-NEXT: ForStmt 177b0cfbfd7SErich Keane // CHECK-NEXT: DeclStmt 178b0cfbfd7SErich Keane // CHECK-NEXT: VarDecl {{.*}} i 'int' 179b0cfbfd7SErich Keane // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0 18042f4e505SErich Keane // CHECK-NEXT: <<<NULL>>> 181b0cfbfd7SErich Keane // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<' 182b0cfbfd7SErich Keane // CHECK-NEXT: ImplicitCastExpr 183b0cfbfd7SErich Keane // CHECK-NEXT: DeclRefExpr 184b0cfbfd7SErich Keane // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5 185b0cfbfd7SErich Keane // CHECK-NEXT: UnaryOperator{{.*}} prefix '++' 186b0cfbfd7SErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int' 18742f4e505SErich Keane // CHECK-NEXT: NullStmt 18842f4e505SErich Keane 189*e4d57d6aSerichkeane // CHECK-NEXT: OpenACCLoopConstruct{{.*}} parent: parallel 19042f4e505SErich Keane // CHECK-NEXT: ForStmt 191b0cfbfd7SErich Keane // CHECK-NEXT: DeclStmt 192b0cfbfd7SErich Keane // CHECK-NEXT: VarDecl {{.*}} i 'int' 193b0cfbfd7SErich Keane // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0 19442f4e505SErich Keane // CHECK-NEXT: <<<NULL>>> 195b0cfbfd7SErich Keane // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<' 196b0cfbfd7SErich Keane // CHECK-NEXT: ImplicitCastExpr 197b0cfbfd7SErich Keane // CHECK-NEXT: DeclRefExpr 198b0cfbfd7SErich Keane // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5 199b0cfbfd7SErich Keane // CHECK-NEXT: UnaryOperator{{.*}} prefix '++' 200b0cfbfd7SErich Keane // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int' 20142f4e505SErich Keane // CHECK-NEXT: NullStmt 20242f4e505SErich Keane 20342f4e505SErich Keane // CHECK-NEXT: DeclStmt 20442f4e505SErich Keane // CHECK-NEXT: VarDecl 20542f4e505SErich Keane // CHECK-NEXT: OpenACCLoopConstruct{{.*}} <orphan> 20642f4e505SErich Keane // CHECK-NEXT: CXXForRangeStmt 20742f4e505SErich Keane // CHECK: CompoundStmt 20842f4e505SErich Keane } 20942f4e505SErich Keane 21042f4e505SErich Keane struct S { 21142f4e505SErich Keane using type = int; 21242f4e505SErich Keane }; 21342f4e505SErich Keane 21442f4e505SErich Keane void use() { 21542f4e505SErich Keane TemplFunc<S>(); 21642f4e505SErich Keane } 21742f4e505SErich Keane #endif 21842f4e505SErich Keane 219