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
11 struct CorrectConvert
{
17 // CHECK: FunctionDecl{{.*}}NormalUses
18 // CHECK-NEXT: CompoundStmt
20 #pragma acc kernels loop vector_length(some_short())
21 for (unsigned i
= 0; i
< 5; ++i
);
22 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop
23 // CHECK-NEXT: vector_length clause
24 // CHECK-NEXT: CallExpr{{.*}}'short'
25 // CHECK-NEXT: ImplicitCastExpr{{.*}}'short (*)()' <FunctionToPointerDecay>
26 // CHECK-NEXT: DeclRefExpr{{.*}}'short ()' lvalue Function{{.*}} 'some_short' 'short ()'
27 // CHECK-NEXT: ForStmt
30 template<typename T
, typename U
>
31 void TemplUses(T t
, U u
) {
32 // CHECK-NEXT: FunctionTemplateDecl
33 // CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 0 T
34 // CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 1 U
35 // CHECK-NEXT: FunctionDecl{{.*}} TemplUses 'void (T, U)'
36 // CHECK-NEXT: ParmVarDecl{{.*}} t 'T'
37 // CHECK-NEXT: ParmVarDecl{{.*}} u 'U'
38 // CHECK-NEXT: CompoundStmt
40 #pragma acc kernels loop vector_length(u)
41 for (unsigned i
= 0; i
< 5; ++i
);
42 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop
43 // CHECK-NEXT: vector_length clause
44 // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
45 // CHECK-NEXT: ForStmt
48 #pragma acc parallel loop vector_length(U::value)
49 for (unsigned i
= 0; i
< 5; ++i
);
50 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop
51 // CHECK-NEXT: vector_length clause
52 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
53 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'
54 // CHECK-NEXT: ForStmt
57 // Check the instantiated versions of the above.
58 // CHECK-NEXT: FunctionDecl{{.*}} used TemplUses 'void (CorrectConvert, HasInt)' implicit_instantiation
59 // CHECK-NEXT: TemplateArgument type 'CorrectConvert'
60 // CHECK-NEXT: RecordType{{.*}} 'CorrectConvert'
61 // CHECK-NEXT: CXXRecord{{.*}} 'CorrectConvert'
62 // CHECK-NEXT: TemplateArgument type 'HasInt'
63 // CHECK-NEXT: RecordType{{.*}} 'HasInt'
64 // CHECK-NEXT: CXXRecord{{.*}} 'HasInt'
65 // CHECK-NEXT: ParmVarDecl{{.*}} t 'CorrectConvert'
66 // CHECK-NEXT: ParmVarDecl{{.*}} u 'HasInt'
67 // CHECK-NEXT: CompoundStmt
69 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop
70 // CHECK-NEXT: vector_length clause
71 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
72 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
73 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
74 // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
75 // CHECK-NEXT: ForStmt
78 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop
79 // CHECK-NEXT: vector_length clause
80 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
81 // CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'
82 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'
83 // CHECK-NEXT: ForStmt
89 using ShortTy
= short;
90 static constexpr int value
= 1;
96 TemplUses
<CorrectConvert
, HasInt
>({}, {});