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@+1{{OpenACC clause 'copyin' not yet implemented}}
 #pragma acc data copyin(I) async(I)
   ;
-  // expected-warning@+1{{OpenACC clause 'copyin' not yet implemented}}
 #pragma acc enter data copyin(I) async(I)
   // expected-warning@+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@+2{{OpenACC clause 'copyin' not yet implemented}}
   // expected-error@+1{{OpenACC clause 'async' requires expression of integer 
type ('struct NotConvertible' invalid)}}
 #pragma acc data copyin(NC) async(NC)
   ;
-  // expected-warning@+2{{OpenACC clause 'copyin' not yet implemented}}
   // expected-error@+1{{OpenACC clause 'async' requires expression of integer 
type ('struct NotConvertible' invalid)}}
 #pragma acc enter data copyin(NC) async(NC)
   // expected-warning@+2{{OpenACC clause 'copyout' not yet implemented}}
@@ -32,12 +28,10 @@ void Test() {
 #pragma acc host_data use_device(NC) async(NC)
   ;
 
-  // expected-warning@+3{{OpenACC clause 'copyin' not yet implemented}}
   // expected-error@+2{{OpenACC 'async' clause cannot appear more than once on 
a 'data' directive}}
   // expected-note@+1{{previous clause is here}}
 #pragma acc data copyin(I) async(I) async(I)
   ;
-  // expected-warning@+3{{OpenACC clause 'copyin' not yet implemented}}
   // expected-error@+2{{expected ')'}}
   // expected-note@+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@+1{{OpenACC clause name 'pcopyin' is a deprecated clause 
name and is now an alias for 'copyin'}}
+#pragma acc data pcopyin(LocalInt)
+  ;
+
+  // expected-warning@+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@+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@+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@+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@+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@+2{{OpenACC sub-array specified range [2:5] would be out 
of the range of the subscripted array size of 5}}
+  // expected-error@+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@+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@+2{{invalid tag 'invalid' on 'copyin' clause}}
+  // expected-error@+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@+1{{OpenACC 'copyin' clause is not valid on 'exit data' 
directive}}
+#pragma acc exit data copyin(LocalInt)
+  // expected-error@+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@+1{{OpenACC clause 'copyin' not yet implemented}}
 #pragma acc enter data copyin(Var) if(1)
 
-  // expected-warning@+3{{OpenACC clause 'copyin' not yet implemented}}
   // expected-error@+2{{OpenACC 'if' clause cannot appear more than once on a 
'enter data' directive}}
   // expected-note@+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@+1{{OpenACC clause 'copyin' not yet implemented}}
 #pragma acc data copyin(arr[0]) wait
   ;
 
-  // expected-warning@+1{{OpenACC clause 'copyin' not yet implemented}}
 #pragma acc enter data copyin(arr[0]) wait()
 
   // expected-warning@+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@+1{{OpenACC clause 'copyin' not yet implemented}}
 #pragma acc data copyin(arr[0]) wait(devnum:getS(): getI())
   ;
 
-  // expected-warning@+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@+2{{OpenACC clause 'copyout' not yet implemented}}
   // expected-error@+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@+2{{OpenACC clause 'copyin' not yet implemented}}
   // expected-error@+1{{OpenACC clause 'wait' requires expression of integer 
type ('struct NotConvertible' invalid)}}
 #pragma acc data copyin(arr[0]) wait(devnum:5 : NC)
   ;
 
-  // expected-warning@+4{{OpenACC clause 'copyin' not yet implemented}}
   // expected-error@+3{{OpenACC clause 'wait' requires expression of integer 
type ('int[5]' invalid)}}
   // expected-error@+2{{OpenACC clause 'wait' requires expression of integer 
type ('int[5]' invalid)}}
   // expected-error@+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@+1{{OpenACC clause 'copyin' not yet implemented}}
 #pragma acc data copyin(Var)
   ;
   // expected-warning@+1{{OpenACC clause 'copyout' not yet implemented}}
@@ -63,7 +62,6 @@ void AtLeastOneOf() {
   ;
 
   // Enter Data
-  // expected-warning@+1{{OpenACC clause 'copyin' not yet implemented}}
 #pragma acc enter data copyin(Var)
 #pragma acc enter data create(Var)
   // expected-warning@+1{{OpenACC clause 'attach' not yet implemented}}


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to