[clang] b2b1eec - [OpenACC] enable 'copyin' clause sema for 'data'/'enter data'
via cfe-commits
cfe-commits at lists.llvm.org
Fri Dec 13 07:31:24 PST 2024
Author: erichkeane
Date: 2024-12-13T07:31:18-08:00
New Revision: b2b1eec2b249698337d90a77c000340f0248c9cd
URL: https://github.com/llvm/llvm-project/commit/b2b1eec2b249698337d90a77c000340f0248c9cd
DIFF: https://github.com/llvm/llvm-project/commit/b2b1eec2b249698337d90a77c000340f0248c9cd.diff
LOG: [OpenACC] enable 'copyin' clause sema for 'data'/'enter data'
stop reporting 'copyin' as not implemented on a data/enter data
construct, and enforce sema rules.
Added:
clang/test/SemaOpenACC/data-construct-copyin-ast.cpp
clang/test/SemaOpenACC/data-construct-copyin-clause.c
Modified:
clang/lib/Sema/SemaOpenACC.cpp
clang/test/AST/ast-print-openacc-data-construct.cpp
clang/test/SemaOpenACC/data-construct-ast.cpp
clang/test/SemaOpenACC/data-construct-async-clause.c
clang/test/SemaOpenACC/data-construct-if-ast.cpp
clang/test/SemaOpenACC/data-construct-if-clause.c
clang/test/SemaOpenACC/data-construct-wait-ast.cpp
clang/test/SemaOpenACC/data-construct-wait-clause.c
clang/test/SemaOpenACC/data-construct.cpp
Removed:
################################################################################
diff --git a/clang/lib/Sema/SemaOpenACC.cpp b/clang/lib/Sema/SemaOpenACC.cpp
index d1425aa4eeccea..91a5cd0d71b2f0 100644
--- a/clang/lib/Sema/SemaOpenACC.cpp
+++ b/clang/lib/Sema/SemaOpenACC.cpp
@@ -962,11 +962,13 @@ OpenACCClause *SemaOpenACCClauseVisitor::VisitCopyClause(
OpenACCClause *SemaOpenACCClauseVisitor::VisitCopyInClause(
SemaOpenACC::OpenACCParsedClause &Clause) {
- // Restrictions only properly implemented on 'compute'/'combined' constructs,
- // and 'compute'/'combined' constructs are the only construct that can do
- // anything with this yet, so skip/treat as unimplemented in this case.
+ // Restrictions only properly implemented on 'compute'/'combined'/'data'
+ // constructs, and 'compute'/'combined'/'data' constructs are the only
+ // construct that can do anything with this yet, so skip/treat as
+ // unimplemented in this case.
if (!isOpenACCComputeDirectiveKind(Clause.getDirectiveKind()) &&
- !isOpenACCCombinedDirectiveKind(Clause.getDirectiveKind()))
+ !isOpenACCCombinedDirectiveKind(Clause.getDirectiveKind()) &&
+ !isOpenACCDataDirectiveKind(Clause.getDirectiveKind()))
return isNotImplemented();
// ActOnVar ensured that everything is a valid variable reference, so there
// really isn't anything to do here. GCC does some duplicate-finding, though
diff --git a/clang/test/AST/ast-print-openacc-data-construct.cpp b/clang/test/AST/ast-print-openacc-data-construct.cpp
index 3e828b594bc9c7..d5d034f5d0bc9f 100644
--- a/clang/test/AST/ast-print-openacc-data-construct.cpp
+++ b/clang/test/AST/ast-print-openacc-data-construct.cpp
@@ -14,8 +14,7 @@ void foo() {
#pragma acc data device_type(int)
;
-// CHECK: #pragma acc enter data
-// CHECK-NOT: copyin(Var)
+// CHECK: #pragma acc enter data copyin(Var)
#pragma acc enter data copyin(Var)
;
// CHECK: #pragma acc exit data
@@ -34,7 +33,7 @@ void foo() {
// CHECK: #pragma acc data default(none) if(i == array[1])
#pragma acc data default(none) if(i == array[1])
;
-// CHECK: #pragma acc enter data if(i == array[1])
+// CHECK: #pragma acc enter data copyin(Var) if(i == array[1])
#pragma acc enter data copyin(Var) if(i == array[1])
;
// CHECK: #pragma acc exit data if(i == array[1])
@@ -47,7 +46,7 @@ void foo() {
// CHECK: #pragma acc data default(none) async(i)
#pragma acc data default(none) async(i)
;
-// CHECK: #pragma acc enter data async(i)
+// CHECK: #pragma acc enter data copyin(i) async(i)
#pragma acc enter data copyin(i) async(i)
// CHECK: #pragma acc exit data async
#pragma acc exit data copyout(i) async
@@ -56,7 +55,7 @@ void foo() {
#pragma acc data default(none) wait()
;
-// CHECK: #pragma acc enter data wait()
+// CHECK: #pragma acc enter data copyin(Var) wait()
#pragma acc enter data copyin(Var) wait()
// CHECK: #pragma acc exit data wait(*iPtr, i)
@@ -66,7 +65,7 @@ void foo() {
#pragma acc data default(none) wait(queues:*iPtr, i)
;
-// CHECK: #pragma acc enter data wait(devnum: i : *iPtr, i)
+// CHECK: #pragma acc enter data copyin(Var) wait(devnum: i : *iPtr, i)
#pragma acc enter data copyin(Var) wait(devnum:i:*iPtr, i)
// CHECK: #pragma acc exit data wait(devnum: i : queues: *iPtr, i)
@@ -79,4 +78,26 @@ void foo() {
// CHECK: #pragma acc data default(present)
#pragma acc data default(present)
;
+
+// CHECK: #pragma acc data default(none) no_create(i, array[1], array, array[1:2])
+#pragma acc data default(none) no_create(i, array[1], array, array[1:2])
+ ;
+
+// CHECK: #pragma acc data default(none) no_create(i, array[1], array, array[1:2])
+// CHECK-NOT: present(i, array[1], array, array[1:2])
+#pragma acc data default(none) no_create(i, array[1], array, array[1:2]) present(i, array[1], array, array[1:2])
+ ;
+
+// CHECK: #pragma acc data default(none) copy(i, array[1], array, array[1:2]) pcopy(i, array[1], array, array[1:2]) present_or_copy(i, array[1], array, array[1:2])
+#pragma acc data default(none) copy(i, array[1], array, array[1:2]) pcopy(i, array[1], array, array[1:2]) present_or_copy(i, array[1], array, array[1:2])
+ ;
+
+// CHECK: #pragma acc enter data copyin(i, array[1], array, array[1:2]) pcopyin(readonly: i, array[1], array, array[1:2]) present_or_copyin(i, array[1], array, array[1:2])
+#pragma acc enter data copyin(i, array[1], array, array[1:2]) pcopyin(readonly:i, array[1], array, array[1:2]) present_or_copyin(i, array[1], array, array[1:2])
+
+// CHECK-NOT: #pragma acc exit data copyout(i, array[1], array, array[1:2]) pcopyout(zero: i, array[1], array, array[1:2]) present_or_copyout(i, array[1], array, array[1:2])
+#pragma acc exit data copyout(i, array[1], array, array[1:2]) pcopyout(zero: i, array[1], array, array[1:2]) present_or_copyout(i, array[1], array, array[1:2])
+
+// CHECK: #pragma acc enter data create(i, array[1], array, array[1:2]) pcreate(zero: i, array[1], array, array[1:2]) present_or_create(i, array[1], array, array[1:2])
+#pragma acc enter data create(i, array[1], array, array[1:2]) pcreate(zero: i, array[1], array, array[1:2]) present_or_create(i, array[1], array, array[1:2])
}
diff --git a/clang/test/SemaOpenACC/data-construct-ast.cpp b/clang/test/SemaOpenACC/data-construct-ast.cpp
index 60ed295fcd42eb..90763daf690fee 100644
--- a/clang/test/SemaOpenACC/data-construct-ast.cpp
+++ b/clang/test/SemaOpenACC/data-construct-ast.cpp
@@ -27,6 +27,8 @@ void NormalFunc() {
// CHECK: NullStmt
#pragma acc enter data copyin(Var)
// CHECK-NEXT: OpenACCEnterDataConstruct{{.*}} enter data
+ // CHECK-NEXT: copyin clause
+ // CHECK-NEXT: DeclRefExpr{{.*}}'Var' 'int'
#pragma acc exit data copyout(Var)
// CHECK-NEXT: OpenACCExitDataConstruct{{.*}} exit data
#pragma acc host_data use_device(Var)
@@ -55,6 +57,8 @@ void TemplFunc() {
// CHECK: NullStmt
#pragma acc enter data copyin(Var)
// CHECK-NEXT: OpenACCEnterDataConstruct{{.*}} enter data
+ // CHECK-NEXT: copyin clause
+ // CHECK-NEXT: DeclRefExpr{{.*}}'Var' 'T'
#pragma acc exit data copyout(Var)
// CHECK-NEXT: OpenACCExitDataConstruct{{.*}} exit data
#pragma acc host_data use_device(Var)
@@ -78,6 +82,8 @@ void TemplFunc() {
// CHECK: NullStmt
// CHECK-NEXT: OpenACCEnterDataConstruct{{.*}} enter data
+ // CHECK-NEXT: copyin clause
+ // CHECK-NEXT: DeclRefExpr{{.*}}'Var' 'int'
// CHECK-NEXT: OpenACCExitDataConstruct{{.*}} exit data
diff --git a/clang/test/SemaOpenACC/data-construct-async-clause.c b/clang/test/SemaOpenACC/data-construct-async-clause.c
index 053cc976939b53..4e75c2b56a5a5c 100644
--- a/clang/test/SemaOpenACC/data-construct-async-clause.c
+++ b/clang/test/SemaOpenACC/data-construct-async-clause.c
@@ -5,10 +5,8 @@ void Test() {
struct NotConvertible{} NC;
// No special rules for this clause on the data constructs, so not much to
// test that isn't covered by combined/compute.
- // expected-warning at +1{{OpenACC clause 'copyin' not yet implemented}}
#pragma acc data copyin(I) async(I)
;
- // expected-warning at +1{{OpenACC clause 'copyin' not yet implemented}}
#pragma acc enter data copyin(I) async(I)
// expected-warning at +1{{OpenACC clause 'copyout' not yet implemented}}
#pragma acc exit data copyout(I) async(I)
@@ -17,11 +15,9 @@ void Test() {
#pragma acc host_data use_device(I) async(I)
;
- // expected-warning at +2{{OpenACC clause 'copyin' not yet implemented}}
// expected-error at +1{{OpenACC clause 'async' requires expression of integer type ('struct NotConvertible' invalid)}}
#pragma acc data copyin(NC) async(NC)
;
- // expected-warning at +2{{OpenACC clause 'copyin' not yet implemented}}
// expected-error at +1{{OpenACC clause 'async' requires expression of integer type ('struct NotConvertible' invalid)}}
#pragma acc enter data copyin(NC) async(NC)
// expected-warning at +2{{OpenACC clause 'copyout' not yet implemented}}
@@ -32,12 +28,10 @@ void Test() {
#pragma acc host_data use_device(NC) async(NC)
;
- // expected-warning at +3{{OpenACC clause 'copyin' not yet implemented}}
// expected-error at +2{{OpenACC 'async' clause cannot appear more than once on a 'data' directive}}
// expected-note at +1{{previous clause is here}}
#pragma acc data copyin(I) async(I) async(I)
;
- // expected-warning at +3{{OpenACC clause 'copyin' not yet implemented}}
// expected-error at +2{{expected ')'}}
// expected-note at +1{{to match this '('}}
#pragma acc enter data copyin(I) async(I, I)
diff --git a/clang/test/SemaOpenACC/data-construct-copyin-ast.cpp b/clang/test/SemaOpenACC/data-construct-copyin-ast.cpp
new file mode 100644
index 00000000000000..fd21d60c84431f
--- /dev/null
+++ b/clang/test/SemaOpenACC/data-construct-copyin-ast.cpp
@@ -0,0 +1,137 @@
+// RUN: %clang_cc1 %s -fopenacc -Wno-openacc-deprecated-clause-alias -ast-dump | FileCheck %s
+
+// Test this with PCH.
+// RUN: %clang_cc1 %s -fopenacc -Wno-openacc-deprecated-clause-alias -emit-pch -o %t %s
+// RUN: %clang_cc1 %s -fopenacc -Wno-openacc-deprecated-clause-alias -include-pch %t -ast-dump-all | FileCheck %s
+
+#ifndef PCH_HELPER
+#define PCH_HELPER
+
+int Global;
+short GlobalArray[5];
+void NormalUses(float *PointerParam) {
+ // CHECK: FunctionDecl{{.*}}NormalUses
+ // CHECK: ParmVarDecl
+ // CHECK-NEXT: CompoundStmt
+
+#pragma acc data copyin(GlobalArray) pcopyin(readonly:PointerParam[Global]) present_or_copyin(Global)
+ ;
+ // CHECK-NEXT: OpenACCDataConstruct{{.*}} data
+ // CHECK-NEXT: copyin clause
+ // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'
+ // CHECK-NEXT: pcopyin clause : readonly
+ // CHECK-NEXT: ArraySubscriptExpr{{.*}}'float' lvalue
+ // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float *' <LValueToRValue>
+ // CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}}'PointerParam' 'float *'
+ // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
+ // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
+ // CHECK-NEXT: present_or_copyin clause
+ // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
+ // CHECK-NEXT: NullStmt
+
+#pragma acc enter data copyin(GlobalArray) pcopyin(readonly:PointerParam[Global]) present_or_copyin(Global)
+ // CHECK-NEXT: OpenACCEnterDataConstruct{{.*}} enter data
+ // CHECK-NEXT: copyin clause
+ // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'
+ // CHECK-NEXT: pcopyin clause : readonly
+ // CHECK-NEXT: ArraySubscriptExpr{{.*}}'float' lvalue
+ // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float *' <LValueToRValue>
+ // CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}}'PointerParam' 'float *'
+ // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
+ // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
+ // CHECK-NEXT: present_or_copyin clause
+ // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
+}
+
+template<auto &NTTP, typename T, typename U>
+void TemplUses(T t, U u) {
+ // CHECK-NEXT: FunctionTemplateDecl
+ // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}}referenced 'auto &' depth 0 index 0 NTTP
+ // CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 1 T
+ // CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 2 U
+ // CHECK-NEXT: FunctionDecl{{.*}} TemplUses 'void (T, U)'
+ // CHECK-NEXT: ParmVarDecl{{.*}} referenced t 'T'
+ // CHECK-NEXT: ParmVarDecl{{.*}} referenced u 'U'
+ // CHECK-NEXT: CompoundStmt
+
+#pragma acc data copyin(t) pcopyin(readonly: NTTP, u) present_or_copyin(u[0:t])
+ ;
+ // CHECK-NEXT: OpenACCDataConstruct{{.*}} data
+ // CHECK-NEXT: copyin clause
+ // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
+ // CHECK-NEXT: pcopyin clause : readonly
+ // CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &'
+ // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
+ // CHECK-NEXT: present_or_copyin clause
+ // CHECK-NEXT: ArraySectionExpr
+ // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
+ // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
+ // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
+ // CHECK-NEXT: NullStmt
+
+#pragma acc enter data copyin(t) pcopyin(readonly: NTTP, u) present_or_copyin(u[0:t])
+ // CHECK-NEXT: OpenACCEnterDataConstruct{{.*}} enter data
+ // CHECK-NEXT: copyin clause
+ // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
+ // CHECK-NEXT: pcopyin clause : readonly
+ // CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &'
+ // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
+ // CHECK-NEXT: present_or_copyin clause
+ // CHECK-NEXT: ArraySectionExpr
+ // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
+ // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
+ // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
+
+ // Check the instantiated versions of the above.
+ // CHECK-NEXT: FunctionDecl{{.*}} used TemplUses 'void (int, int *)' implicit_instantiation
+ // CHECK-NEXT: TemplateArgument decl
+ // CHECK-NEXT: Var{{.*}} 'CEVar' 'const unsigned int'
+ // CHECK-NEXT: TemplateArgument type 'int'
+ // CHECK-NEXT: BuiltinType{{.*}} 'int'
+ // CHECK-NEXT: TemplateArgument type 'int *'
+ // CHECK-NEXT: PointerType{{.*}} 'int *'
+ // CHECK-NEXT: BuiltinType{{.*}} 'int'
+ // CHECK-NEXT: ParmVarDecl{{.*}} used t 'int'
+ // CHECK-NEXT: ParmVarDecl{{.*}} used u 'int *'
+ // CHECK-NEXT: CompoundStmt
+
+ // CHECK-NEXT: OpenACCDataConstruct{{.*}} data
+ // CHECK-NEXT: copyin clause
+ // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
+ // CHECK-NEXT: pcopyin clause : readonly
+ // CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}}'const unsigned int' lvalue
+ // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} referenced 'auto &' depth 0 index 0 NTTP
+ // CHECK-NEXT: DeclRefExpr{{.*}}'const unsigned int' lvalue Var{{.*}} 'CEVar' 'const unsigned int'
+ // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'
+ // CHECK-NEXT: present_or_copyin clause
+ // CHECK-NEXT: ArraySectionExpr
+ // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <LValueToRValue>
+ // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'
+ // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
+ // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
+ // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
+ // CHECK-NEXT: NullStmt
+
+ // CHECK-NEXT: OpenACCEnterDataConstruct{{.*}} enter data
+ // CHECK-NEXT: copyin clause
+ // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
+ // CHECK-NEXT: pcopyin clause : readonly
+ // CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}}'const unsigned int' lvalue
+ // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} referenced 'auto &' depth 0 index 0 NTTP
+ // CHECK-NEXT: DeclRefExpr{{.*}}'const unsigned int' lvalue Var{{.*}} 'CEVar' 'const unsigned int'
+ // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'
+ // CHECK-NEXT: present_or_copyin clause
+ // CHECK-NEXT: ArraySectionExpr
+ // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <LValueToRValue>
+ // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'
+ // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
+ // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
+ // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
+}
+
+void Inst() {
+ static constexpr unsigned CEVar = 1;
+ int i;
+ TemplUses<CEVar>(i, &i);
+}
+#endif
diff --git a/clang/test/SemaOpenACC/data-construct-copyin-clause.c b/clang/test/SemaOpenACC/data-construct-copyin-clause.c
new file mode 100644
index 00000000000000..36d190b81480fa
--- /dev/null
+++ b/clang/test/SemaOpenACC/data-construct-copyin-clause.c
@@ -0,0 +1,71 @@
+// RUN: %clang_cc1 %s -fopenacc -verify
+
+typedef struct IsComplete {
+ struct S { int A; } CompositeMember;
+ int ScalarMember;
+ float ArrayMember[5];
+ void *PointerMember;
+} Complete;
+void uses(int IntParam, short *PointerParam, float ArrayParam[5], Complete CompositeParam) {
+ int LocalInt;
+ short *LocalPointer;
+ float LocalArray[5];
+ Complete LocalComposite;
+ // Check Appertainment:
+#pragma acc data copyin(LocalInt)
+ ;
+#pragma acc enter data copyin(LocalInt)
+
+ // expected-warning at +1{{OpenACC clause name 'pcopyin' is a deprecated clause name and is now an alias for 'copyin'}}
+#pragma acc data pcopyin(LocalInt)
+ ;
+
+ // expected-warning at +1{{OpenACC clause name 'present_or_copyin' is a deprecated clause name and is now an alias for 'copyin'}}
+#pragma acc data present_or_copyin(LocalInt)
+ ;
+
+ // Valid cases:
+#pragma acc data copyin(LocalInt, LocalPointer, LocalArray)
+ ;
+#pragma acc data copyin(LocalArray[2:1])
+ ;
+#pragma acc data copyin(readonly:LocalArray[2:1])
+ ;
+
+#pragma acc data copyin(LocalComposite.ScalarMember, LocalComposite.ScalarMember)
+ ;
+
+ // expected-error at +1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
+#pragma acc data copyin(1 + IntParam)
+ ;
+
+ // expected-error at +1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
+#pragma acc data copyin(+IntParam)
+ ;
+
+ // expected-error at +1{{OpenACC sub-array length is unspecified and cannot be inferred because the subscripted value is not an array}}
+#pragma acc data copyin(PointerParam[2:])
+ ;
+
+ // expected-error at +1{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}}
+#pragma acc data copyin(ArrayParam[2:5])
+ ;
+
+ // expected-error at +2{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}}
+ // expected-error at +1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
+#pragma acc data copyin((float*)ArrayParam[2:5])
+ ;
+ // expected-error at +1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
+#pragma acc data copyin((float)ArrayParam[2])
+ ;
+ // expected-error at +2{{invalid tag 'invalid' on 'copyin' clause}}
+ // expected-error at +1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
+#pragma acc data copyin(invalid:(float)ArrayParam[2])
+ ;
+
+ // expected-error at +1{{OpenACC 'copyin' clause is not valid on 'exit data' directive}}
+#pragma acc exit data copyin(LocalInt)
+ // expected-error at +1{{OpenACC 'pcopyin' clause is not valid on 'host_data' directive}}
+#pragma acc host_data pcopyin(LocalInt)
+ ;
+}
diff --git a/clang/test/SemaOpenACC/data-construct-if-ast.cpp b/clang/test/SemaOpenACC/data-construct-if-ast.cpp
index a522b30357df89..24bc8ffc8fe0c4 100644
--- a/clang/test/SemaOpenACC/data-construct-if-ast.cpp
+++ b/clang/test/SemaOpenACC/data-construct-if-ast.cpp
@@ -52,6 +52,8 @@ void TemplFunc() {
#pragma acc enter data copyin(Global) if(typename T::IntTy{})
;
// CHECK-NEXT: OpenACCEnterDataConstruct{{.*}}enter data
+ // CHECK-NEXT: copyin clause
+ // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'
// CHECK-NEXT: if clause
// CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'typename T::IntTy' 'typename T::IntTy'
// CHECK-NEXT: InitListExpr{{.*}} 'void'
@@ -93,6 +95,8 @@ void TemplFunc() {
// CHECK-NEXT: NullStmt
// CHECK-NEXT: OpenACCEnterDataConstruct{{.*}}enter data
+ // CHECK-NEXT: copyin clause
+ // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'
// CHECK-NEXT: if clause
// CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <IntegralToBoolean>
// CHECK-NEXT: CXXFunctionalCastExpr{{.*}}'typename InstTy::IntTy':'int' functional cast to typename struct InstTy::IntTy <NoOp>
diff --git a/clang/test/SemaOpenACC/data-construct-if-clause.c b/clang/test/SemaOpenACC/data-construct-if-clause.c
index 906b252d219b44..3f80bb8c4d002a 100644
--- a/clang/test/SemaOpenACC/data-construct-if-clause.c
+++ b/clang/test/SemaOpenACC/data-construct-if-clause.c
@@ -9,10 +9,8 @@ void Foo() {
#pragma acc data default(present) if(1) if (2)
;
- // expected-warning at +1{{OpenACC clause 'copyin' not yet implemented}}
#pragma acc enter data copyin(Var) if(1)
- // expected-warning at +3{{OpenACC clause 'copyin' not yet implemented}}
// expected-error at +2{{OpenACC 'if' clause cannot appear more than once on a 'enter data' directive}}
// expected-note at +1{{previous clause is here}}
#pragma acc enter data copyin(Var) if(1) if (2)
diff --git a/clang/test/SemaOpenACC/data-construct-wait-ast.cpp b/clang/test/SemaOpenACC/data-construct-wait-ast.cpp
index 40409099d80588..20d4affec1c870 100644
--- a/clang/test/SemaOpenACC/data-construct-wait-ast.cpp
+++ b/clang/test/SemaOpenACC/data-construct-wait-ast.cpp
@@ -21,11 +21,15 @@ void NormalUses() {
#pragma acc data copyin(I) wait
;
// CHECK-NEXT: OpenACCDataConstruct{{.*}}data
+ // CHECK-NEXT: copyin clause
+ // CHECK-NEXT: DeclRefExpr{{.*}}'I' 'int'
// CHECK-NEXT: wait clause
// CHECK-NEXT: <<<NULL>>>
// CHECK-NEXT: NullStmt
#pragma acc enter data copyin(I) wait()
// CHECK: OpenACCEnterDataConstruct{{.*}}enter data
+ // CHECK-NEXT: copyin clause
+ // CHECK-NEXT: DeclRefExpr{{.*}}'I' 'int'
// CHECK-NEXT: wait clause
// CHECK-NEXT: <<<NULL>>>
#pragma acc exit data copyout(I) wait(some_int(), some_long())
@@ -41,6 +45,8 @@ void NormalUses() {
#pragma acc data copyin(I) wait(queues:some_int(), some_long())
;
// CHECK: OpenACCDataConstruct{{.*}}data
+ // CHECK-NEXT: copyin clause
+ // CHECK-NEXT: DeclRefExpr{{.*}}'I' 'int'
// CHECK-NEXT: wait clause has queues tag
// CHECK-NEXT: <<<NULL>>>
// CHECK-NEXT: CallExpr{{.*}}'int'
@@ -52,6 +58,8 @@ void NormalUses() {
// CHECK-NEXT: NullStmt
#pragma acc enter data copyin(I) wait(devnum: some_int() :some_int(), some_long())
// CHECK: OpenACCEnterDataConstruct{{.*}}enter data
+ // CHECK-NEXT: copyin clause
+ // CHECK-NEXT: DeclRefExpr{{.*}}'I' 'int'
// CHECK-NEXT: wait clause has devnum
// CHECK-NEXT: CallExpr{{.*}}'int'
// CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
@@ -101,12 +109,16 @@ void TemplUses(U u) {
#pragma acc data copyin(I) wait
;
// CHECK: OpenACCDataConstruct{{.*}}data
+ // CHECK-NEXT: copyin clause
+ // CHECK-NEXT: DeclRefExpr{{.*}}'I' 'U'
// CHECK-NEXT: wait clause
// CHECK-NEXT: <<<NULL>>>
// CHECK-NEXT: NullStmt
#pragma acc enter data copyin(I) wait()
// CHECK: OpenACCEnterDataConstruct{{.*}}enter data
+ // CHECK-NEXT: copyin clause
+ // CHECK-NEXT: DeclRefExpr{{.*}}'I' 'U'
// CHECK-NEXT: wait clause
// CHECK-NEXT: <<<NULL>>>
@@ -121,6 +133,8 @@ void TemplUses(U u) {
#pragma acc data copyin(I) wait(queues: U::value, u)
;
// CHECK: OpenACCDataConstruct{{.*}}data
+ // CHECK-NEXT: copyin clause
+ // CHECK-NEXT: DeclRefExpr{{.*}}'I' 'U'
// CHECK-NEXT: wait clause has queues tag
// CHECK-NEXT: <<<NULL>>>
// CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
@@ -130,6 +144,8 @@ void TemplUses(U u) {
#pragma acc enter data copyin(I) wait(devnum:u:queues: U::value, u)
// CHECK: OpenACCEnterDataConstruct{{.*}}data
+ // CHECK-NEXT: copyin clause
+ // CHECK-NEXT: DeclRefExpr{{.*}}'I' 'U'
// CHECK-NEXT: wait clause has devnum has queues tag
// CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
// CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
@@ -156,11 +172,15 @@ void TemplUses(U u) {
// CHECK-NEXT: VarDecl
// CHECK: OpenACCDataConstruct{{.*}}data
+ // CHECK-NEXT: copyin clause
+ // CHECK-NEXT: DeclRefExpr{{.*}}'I' 'HasInt'
// CHECK-NEXT: wait clause
// CHECK-NEXT: <<<NULL>>>
// CHECK-NEXT: NullStmt
// CHECK: OpenACCEnterDataConstruct{{.*}}enter data
+ // CHECK-NEXT: copyin clause
+ // CHECK-NEXT: DeclRefExpr{{.*}}'I' 'HasInt'
// CHECK-NEXT: wait clause
// CHECK-NEXT: <<<NULL>>>
@@ -176,6 +196,8 @@ void TemplUses(U u) {
// CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
// CHECK: OpenACCDataConstruct{{.*}}data
+ // CHECK-NEXT: copyin clause
+ // CHECK-NEXT: DeclRefExpr{{.*}}'I' 'HasInt'
// CHECK-NEXT: wait clause has queues tag
// CHECK-NEXT: <<<NULL>>>
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
@@ -188,6 +210,8 @@ void TemplUses(U u) {
// CHECK-NEXT: NullStmt
// CHECK: OpenACCEnterDataConstruct{{.*}}enter data
+ // CHECK-NEXT: copyin clause
+ // CHECK-NEXT: DeclRefExpr{{.*}}'I' 'HasInt'
// CHECK-NEXT: wait clause has devnum has queues tag
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
// CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
diff --git a/clang/test/SemaOpenACC/data-construct-wait-clause.c b/clang/test/SemaOpenACC/data-construct-wait-clause.c
index 50a29df8b03bf0..59cd793de7435d 100644
--- a/clang/test/SemaOpenACC/data-construct-wait-clause.c
+++ b/clang/test/SemaOpenACC/data-construct-wait-clause.c
@@ -7,11 +7,9 @@ int getI();
void uses() {
int arr[5];
- // expected-warning at +1{{OpenACC clause 'copyin' not yet implemented}}
#pragma acc data copyin(arr[0]) wait
;
- // expected-warning at +1{{OpenACC clause 'copyin' not yet implemented}}
#pragma acc enter data copyin(arr[0]) wait()
// expected-warning at +1{{OpenACC clause 'copyout' not yet implemented}}
@@ -22,23 +20,19 @@ void uses() {
#pragma acc host_data use_device(arr[0]) wait(getS(), getI())
;
- // expected-warning at +1{{OpenACC clause 'copyin' not yet implemented}}
#pragma acc data copyin(arr[0]) wait(devnum:getS(): getI())
;
- // expected-warning at +1{{OpenACC clause 'copyin' not yet implemented}}
#pragma acc enter data copyin(arr[0]) wait(devnum:getS(): queues: getI()) wait(devnum:getI(): queues: getS(), getI(), 5)
// expected-warning at +2{{OpenACC clause 'copyout' not yet implemented}}
// expected-error at +1{{OpenACC clause 'wait' requires expression of integer type ('struct NotConvertible' invalid)}}
#pragma acc exit data copyout(arr[0]) wait(devnum:NC : 5)
- // expected-warning at +2{{OpenACC clause 'copyin' not yet implemented}}
// expected-error at +1{{OpenACC clause 'wait' requires expression of integer type ('struct NotConvertible' invalid)}}
#pragma acc data copyin(arr[0]) wait(devnum:5 : NC)
;
- // expected-warning at +4{{OpenACC clause 'copyin' not yet implemented}}
// expected-error at +3{{OpenACC clause 'wait' requires expression of integer type ('int[5]' invalid)}}
// expected-error at +2{{OpenACC clause 'wait' requires expression of integer type ('int[5]' invalid)}}
// expected-error at +1{{OpenACC clause 'wait' requires expression of integer type ('struct NotConvertible' invalid)}}
diff --git a/clang/test/SemaOpenACC/data-construct.cpp b/clang/test/SemaOpenACC/data-construct.cpp
index 3f95f4055802a3..2ae1d14b850748 100644
--- a/clang/test/SemaOpenACC/data-construct.cpp
+++ b/clang/test/SemaOpenACC/data-construct.cpp
@@ -23,7 +23,6 @@ void AtLeastOneOf() {
// Data
#pragma acc data copy(Var)
;
- // expected-warning at +1{{OpenACC clause 'copyin' not yet implemented}}
#pragma acc data copyin(Var)
;
// expected-warning at +1{{OpenACC clause 'copyout' not yet implemented}}
@@ -63,7 +62,6 @@ void AtLeastOneOf() {
;
// Enter Data
- // expected-warning at +1{{OpenACC clause 'copyin' not yet implemented}}
#pragma acc enter data copyin(Var)
#pragma acc enter data create(Var)
// expected-warning at +1{{OpenACC clause 'attach' not yet implemented}}
More information about the cfe-commits
mailing list