[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