[clang] 1da0730 - [OpenACC] enable 'copyout' clause sema for data constructs

via cfe-commits cfe-commits at lists.llvm.org
Fri Dec 13 07:51:28 PST 2024


Author: erichkeane
Date: 2024-12-13T07:50:29-08:00
New Revision: 1da0730ba5994537119ed61205a599cb3929c43a

URL: https://github.com/llvm/llvm-project/commit/1da0730ba5994537119ed61205a599cb3929c43a
DIFF: https://github.com/llvm/llvm-project/commit/1da0730ba5994537119ed61205a599cb3929c43a.diff

LOG: [OpenACC] enable 'copyout' clause sema for data constructs

Same as the previous few, this just enables copyout for data constructs
and ensures we have sufficient test coverage.

Added: 
    clang/test/SemaOpenACC/data-construct-copyout-ast.cpp
    clang/test/SemaOpenACC/data-construct-copyout-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 91a5cd0d71b2f0..6906fd00822fcb 100644
--- a/clang/lib/Sema/SemaOpenACC.cpp
+++ b/clang/lib/Sema/SemaOpenACC.cpp
@@ -981,11 +981,13 @@ OpenACCClause *SemaOpenACCClauseVisitor::VisitCopyInClause(
 
 OpenACCClause *SemaOpenACCClauseVisitor::VisitCopyOutClause(
     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 d5d034f5d0bc9f..65ab0158b4852d 100644
--- a/clang/test/AST/ast-print-openacc-data-construct.cpp
+++ b/clang/test/AST/ast-print-openacc-data-construct.cpp
@@ -17,8 +17,7 @@ void foo() {
 // CHECK: #pragma acc enter data copyin(Var)
 #pragma acc enter data copyin(Var)
   ;
-// CHECK: #pragma acc exit data
-// CHECK-NOT: copyout(Var)
+// CHECK: #pragma acc exit data copyout(Var)
 #pragma acc exit data copyout(Var)
   ;
 // CHECK: #pragma acc host_data
@@ -36,7 +35,7 @@ void foo() {
 // 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])
+// CHECK: #pragma acc exit data copyout(Var) if(i == array[1])
 #pragma acc exit data copyout(Var) if(i == array[1])
   ;
 // CHECK: #pragma acc host_data if(i == array[1])
@@ -48,7 +47,7 @@ void foo() {
   ;
 // CHECK: #pragma acc enter data copyin(i) async(i)
 #pragma acc enter data copyin(i) async(i)
-// CHECK: #pragma acc exit data async
+// CHECK: #pragma acc exit data copyout(i) async
 #pragma acc exit data copyout(i) async
 
 // CHECK: #pragma acc data default(none) wait
@@ -58,7 +57,7 @@ void foo() {
 // CHECK: #pragma acc enter data copyin(Var) wait()
 #pragma acc enter data copyin(Var) wait()
 
-// CHECK: #pragma acc exit data wait(*iPtr, i)
+// CHECK: #pragma acc exit data copyout(Var) wait(*iPtr, i)
 #pragma acc exit data copyout(Var) wait(*iPtr, i)
 
 // CHECK: #pragma acc data default(none) wait(queues: *iPtr, i)
@@ -68,7 +67,7 @@ void foo() {
 // 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)
+// CHECK: #pragma acc exit data copyout(Var) wait(devnum: i : queues: *iPtr, i)
 #pragma acc exit data copyout(Var) wait(devnum:i:queues:*iPtr, i)
 
 // CHECK: #pragma acc data default(none)
@@ -95,7 +94,7 @@ void foo() {
 // 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])
+// CHECK: #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])

diff  --git a/clang/test/SemaOpenACC/data-construct-ast.cpp b/clang/test/SemaOpenACC/data-construct-ast.cpp
index 90763daf690fee..f299fd04581a72 100644
--- a/clang/test/SemaOpenACC/data-construct-ast.cpp
+++ b/clang/test/SemaOpenACC/data-construct-ast.cpp
@@ -31,6 +31,8 @@ void NormalFunc() {
   // CHECK-NEXT: DeclRefExpr{{.*}}'Var' 'int'
 #pragma acc exit data copyout(Var)
   // CHECK-NEXT: OpenACCExitDataConstruct{{.*}} exit data
+  // CHECK-NEXT: copyout clause
+  // CHECK-NEXT: DeclRefExpr{{.*}}'Var' 'int'
 #pragma acc host_data use_device(Var)
   while (Var);
   // CHECK-NEXT: OpenACCHostDataConstruct{{.*}} host_data
@@ -61,6 +63,8 @@ void TemplFunc() {
   // CHECK-NEXT: DeclRefExpr{{.*}}'Var' 'T'
 #pragma acc exit data copyout(Var)
   // CHECK-NEXT: OpenACCExitDataConstruct{{.*}} exit data
+  // CHECK-NEXT: copyout clause
+  // CHECK-NEXT: DeclRefExpr{{.*}}'Var' 'T'
 #pragma acc host_data use_device(Var)
   while (Var);
   // CHECK-NEXT: OpenACCHostDataConstruct{{.*}} host_data
@@ -86,6 +90,8 @@ void TemplFunc() {
   // CHECK-NEXT: DeclRefExpr{{.*}}'Var' 'int'
 
   // CHECK-NEXT: OpenACCExitDataConstruct{{.*}} exit data
+  // CHECK-NEXT: copyout clause
+  // CHECK-NEXT: DeclRefExpr{{.*}}'Var' 'int'
 
   // CHECK-NEXT: OpenACCHostDataConstruct{{.*}} host_data
   // CHECK-NEXT: WhileStmt

diff  --git a/clang/test/SemaOpenACC/data-construct-async-clause.c b/clang/test/SemaOpenACC/data-construct-async-clause.c
index 4e75c2b56a5a5c..7173b2f0be7dd9 100644
--- a/clang/test/SemaOpenACC/data-construct-async-clause.c
+++ b/clang/test/SemaOpenACC/data-construct-async-clause.c
@@ -8,7 +8,6 @@ void Test() {
 #pragma acc data copyin(I) async(I)
   ;
 #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)
   // expected-warning at +2{{OpenACC clause 'use_device' not yet implemented}}
   // expected-error at +1{{OpenACC 'async' clause is not valid on 'host_data' directive}}
@@ -20,7 +19,6 @@ void Test() {
   ;
   // 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}}
   // expected-error at +1{{OpenACC clause 'async' requires expression of integer type ('struct NotConvertible' invalid)}}
 #pragma acc exit data copyout(NC) async(NC)
   // expected-warning at +2{{OpenACC clause 'use_device' not yet implemented}}

diff  --git a/clang/test/SemaOpenACC/data-construct-copyout-ast.cpp b/clang/test/SemaOpenACC/data-construct-copyout-ast.cpp
new file mode 100644
index 00000000000000..38e6e7b476fe59
--- /dev/null
+++ b/clang/test/SemaOpenACC/data-construct-copyout-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 copyout(GlobalArray) pcopyout(zero:PointerParam[Global]) present_or_copyout(Global)
+  ;
+  // CHECK-NEXT: OpenACCDataConstruct{{.*}} data
+  // CHECK-NEXT: copyout clause
+  // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'
+  // CHECK-NEXT: pcopyout clause : zero
+  // 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_copyout clause
+  // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
+  // CHECK-NEXT: NullStmt
+
+#pragma acc exit data copyout(GlobalArray) pcopyout(zero:PointerParam[Global]) present_or_copyout(Global)
+  // CHECK-NEXT: OpenACCExitDataConstruct{{.*}} exit data
+  // CHECK-NEXT: copyout clause
+  // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'
+  // CHECK-NEXT: pcopyout clause : zero
+  // 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_copyout 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 copyout(t) pcopyout(zero: NTTP, u) present_or_copyout(u[0:t])
+  ;
+  // CHECK-NEXT: OpenACCDataConstruct{{.*}} data
+  // CHECK-NEXT: copyout clause
+  // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
+  // CHECK-NEXT: pcopyout clause : zero
+  // CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &'
+  // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
+  // CHECK-NEXT: present_or_copyout 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 exit data copyout(t) pcopyout(zero: NTTP, u) present_or_copyout(u[0:t])
+  // CHECK-NEXT: OpenACCExitDataConstruct{{.*}} exit data
+  // CHECK-NEXT: copyout clause
+  // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
+  // CHECK-NEXT: pcopyout clause : zero
+  // CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &'
+  // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
+  // CHECK-NEXT: present_or_copyout 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: copyout clause
+  // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
+  // CHECK-NEXT: pcopyout clause : zero
+  // 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_copyout 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: OpenACCExitDataConstruct{{.*}} exit data
+  // CHECK-NEXT: copyout clause
+  // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
+  // CHECK-NEXT: pcopyout clause : zero
+  // 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_copyout 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-copyout-clause.c b/clang/test/SemaOpenACC/data-construct-copyout-clause.c
new file mode 100644
index 00000000000000..77c19d80ca7b36
--- /dev/null
+++ b/clang/test/SemaOpenACC/data-construct-copyout-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 copyout(LocalInt)
+  ;
+#pragma acc exit data copyout(LocalInt)
+
+  // expected-warning at +1{{OpenACC clause name 'pcopyout' is a deprecated clause name and is now an alias for 'copyout'}}
+#pragma acc data pcopyout(LocalInt)
+  ;
+
+  // expected-warning at +1{{OpenACC clause name 'present_or_copyout' is a deprecated clause name and is now an alias for 'copyout'}}
+#pragma acc data present_or_copyout(LocalInt)
+  ;
+
+  // Valid cases:
+#pragma acc data copyout(LocalInt, LocalPointer, LocalArray)
+  ;
+#pragma acc data copyout(LocalArray[2:1])
+  ;
+#pragma acc data copyout(zero:LocalArray[2:1])
+  ;
+
+#pragma acc data copyout(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 copyout(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 copyout(+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 copyout(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 copyout(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 copyout((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 copyout((float)ArrayParam[2])
+  ;
+  // expected-error at +2{{invalid tag 'invalid' on 'copyout' 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 copyout(invalid:(float)ArrayParam[2])
+  ;
+
+  // expected-error at +1{{OpenACC 'copyout' clause is not valid on 'enter data' directive}}
+#pragma acc enter data copyout(LocalInt)
+  // expected-error at +1{{OpenACC 'pcopyout' clause is not valid on 'host_data' directive}}
+#pragma acc host_data pcopyout(LocalInt)
+  ;
+}

diff  --git a/clang/test/SemaOpenACC/data-construct-if-ast.cpp b/clang/test/SemaOpenACC/data-construct-if-ast.cpp
index 24bc8ffc8fe0c4..3b810a724c51ee 100644
--- a/clang/test/SemaOpenACC/data-construct-if-ast.cpp
+++ b/clang/test/SemaOpenACC/data-construct-if-ast.cpp
@@ -62,6 +62,8 @@ void TemplFunc() {
 #pragma acc exit data copyout(Global) if(T::SomeFloat)
   ;
   // CHECK-NEXT: OpenACCExitDataConstruct{{.*}}exit data
+  // CHECK-NEXT: copyout clause
+  // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'
   // CHECK-NEXT: if clause
   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
@@ -104,6 +106,8 @@ void TemplFunc() {
   // CHECK-NEXT: NullStmt
 
   // CHECK-NEXT: OpenACCExitDataConstruct{{.*}}exit data
+  // CHECK-NEXT: copyout clause
+  // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'
   // CHECK-NEXT: if clause
   // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean>
   // CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue>

diff  --git a/clang/test/SemaOpenACC/data-construct-if-clause.c b/clang/test/SemaOpenACC/data-construct-if-clause.c
index 3f80bb8c4d002a..0a7989e80fc373 100644
--- a/clang/test/SemaOpenACC/data-construct-if-clause.c
+++ b/clang/test/SemaOpenACC/data-construct-if-clause.c
@@ -15,9 +15,7 @@ void Foo() {
   // expected-note at +1{{previous clause is here}}
 #pragma acc enter data copyin(Var) if(1) if (2)
 
-  // expected-warning at +1{{OpenACC clause 'copyout' not yet implemented}}
 #pragma acc exit data copyout(Var) if(1)
-  // expected-warning at +3{{OpenACC clause 'copyout' not yet implemented}}
   // expected-error at +2{{OpenACC 'if' clause cannot appear more than once on a 'exit data' directive}}
   // expected-note at +1{{previous clause is here}}
 #pragma acc exit data copyout(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 20d4affec1c870..7fb82313669df9 100644
--- a/clang/test/SemaOpenACC/data-construct-wait-ast.cpp
+++ b/clang/test/SemaOpenACC/data-construct-wait-ast.cpp
@@ -34,6 +34,8 @@ void NormalUses() {
   // CHECK-NEXT: <<<NULL>>>
 #pragma acc exit data copyout(I) wait(some_int(), some_long())
   // CHECK: OpenACCExitDataConstruct{{.*}}exit data
+  // CHECK-NEXT: copyout clause
+  // CHECK-NEXT: DeclRefExpr{{.*}} 'I' 'int'
   // CHECK-NEXT: wait clause
   // CHECK-NEXT: <<<NULL>>>
   // CHECK-NEXT: CallExpr{{.*}}'int'
@@ -72,6 +74,8 @@ void NormalUses() {
   // CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'
 #pragma acc exit data copyout(I) wait(devnum: some_int() : queues :some_int(), some_long()) wait(devnum: some_int() : queues :some_int(), some_long())
   // CHECK: OpenACCExitDataConstruct{{.*}}exit data
+  // CHECK-NEXT: copyout clause
+  // CHECK-NEXT: DeclRefExpr{{.*}} 'I' 'int'
   // CHECK-NEXT: wait clause has devnum has queues tag
   // CHECK-NEXT: CallExpr{{.*}}'int'
   // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
@@ -124,6 +128,8 @@ void TemplUses(U u) {
 
 #pragma acc exit data copyout(I) wait(U::value, u)
   // CHECK: OpenACCExitDataConstruct{{.*}}exit data
+  // CHECK-NEXT: copyout clause
+  // CHECK-NEXT: DeclRefExpr{{.*}} 'I' 'U'
   // CHECK-NEXT: wait clause
   // CHECK-NEXT: <<<NULL>>>
   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
@@ -154,6 +160,8 @@ void TemplUses(U u) {
 
 #pragma acc exit data copyout(I) wait(devnum:u: U::value, u)
   // CHECK: OpenACCExitDataConstruct{{.*}}exit data
+  // CHECK-NEXT: copyout clause
+  // CHECK-NEXT: DeclRefExpr{{.*}} 'I' 'U'
   // CHECK-NEXT: wait clause has devnum
   // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
@@ -185,6 +193,8 @@ void TemplUses(U u) {
   // CHECK-NEXT: <<<NULL>>>
 
   // CHECK: OpenACCExitDataConstruct{{.*}}exit data
+  // CHECK-NEXT: copyout clause
+  // CHECK-NEXT: DeclRefExpr{{.*}} 'I' 'HasInt'
   // CHECK-NEXT: wait clause
   // CHECK-NEXT: <<<NULL>>>
   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
@@ -226,6 +236,8 @@ void TemplUses(U u) {
   // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
 
   // CHECK: OpenACCExitDataConstruct{{.*}}exit data
+  // CHECK-NEXT: copyout clause
+  // CHECK-NEXT: DeclRefExpr{{.*}} 'I' 'HasInt'
   // CHECK-NEXT: wait clause has devnum
   // 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 59cd793de7435d..dffcba34e7b333 100644
--- a/clang/test/SemaOpenACC/data-construct-wait-clause.c
+++ b/clang/test/SemaOpenACC/data-construct-wait-clause.c
@@ -12,7 +12,6 @@ void uses() {
 
 #pragma acc enter data copyin(arr[0]) wait()
 
-  // expected-warning at +1{{OpenACC clause 'copyout' not yet implemented}}
 #pragma acc exit data copyout(arr[0]) wait(getS(), getI())
 
   // expected-warning at +2{{OpenACC clause 'use_device' not yet implemented}}
@@ -25,7 +24,6 @@ void uses() {
 
 #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)
 

diff  --git a/clang/test/SemaOpenACC/data-construct.cpp b/clang/test/SemaOpenACC/data-construct.cpp
index 2ae1d14b850748..01ccaeba81b488 100644
--- a/clang/test/SemaOpenACC/data-construct.cpp
+++ b/clang/test/SemaOpenACC/data-construct.cpp
@@ -25,7 +25,6 @@ void AtLeastOneOf() {
   ;
 #pragma acc data copyin(Var)
   ;
-  // expected-warning at +1{{OpenACC clause 'copyout' not yet implemented}}
 #pragma acc data copyout(Var)
   ;
 #pragma acc data create(Var)
@@ -76,7 +75,6 @@ void AtLeastOneOf() {
 #pragma acc enter data
 
   // Exit Data
-  // expected-warning at +1{{OpenACC clause 'copyout' not yet implemented}}
 #pragma acc exit data copyout(Var)
   // expected-warning at +1{{OpenACC clause 'delete' not yet implemented}}
 #pragma acc exit data delete(Var)


        


More information about the cfe-commits mailing list