Author: erichkeane Date: 2024-12-12T12:54:02-08:00 New Revision: 5048808859eece3aaa680aaecb4a89dfabe9627b
URL: https://github.com/llvm/llvm-project/commit/5048808859eece3aaa680aaecb4a89dfabe9627b DIFF: https://github.com/llvm/llvm-project/commit/5048808859eece3aaa680aaecb4a89dfabe9627b.diff LOG: [OpenACC] Implement 'default' Sema for 'data' clause No additional rules here beyond enabling it, this patch just enables 'default' and adds tests. Added: clang/test/SemaOpenACC/data-construct-default-ast.cpp clang/test/SemaOpenACC/data-construct-default-clause.c Modified: clang/lib/Sema/SemaOpenACC.cpp clang/test/AST/ast-print-openacc-data-construct.cpp clang/test/SemaOpenACC/combined-construct-default-ast.cpp clang/test/SemaOpenACC/combined-construct-default-clause.c clang/test/SemaOpenACC/compute-construct-default-clause.c clang/test/SemaOpenACC/data-construct-ast.cpp clang/test/SemaOpenACC/data-construct-if-ast.cpp clang/test/SemaOpenACC/data-construct-if-clause.c clang/test/SemaOpenACC/data-construct.cpp Removed: ################################################################################ diff --git a/clang/lib/Sema/SemaOpenACC.cpp b/clang/lib/Sema/SemaOpenACC.cpp index 655d3b4ad6347d..99daa3eba6287a 100644 --- a/clang/lib/Sema/SemaOpenACC.cpp +++ b/clang/lib/Sema/SemaOpenACC.cpp @@ -587,14 +587,6 @@ class SemaOpenACCClauseVisitor { OpenACCClause *SemaOpenACCClauseVisitor::VisitDefaultClause( 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. - // Only 'data' is left. - if (!isOpenACCComputeDirectiveKind(Clause.getDirectiveKind()) && - !isOpenACCCombinedDirectiveKind(Clause.getDirectiveKind())) - return isNotImplemented(); - // Don't add an invalid clause to the AST. if (Clause.getDefaultClauseKind() == OpenACCDefaultClauseKind::Invalid) return nullptr; diff --git a/clang/test/AST/ast-print-openacc-data-construct.cpp b/clang/test/AST/ast-print-openacc-data-construct.cpp index 8e1d3efbf3c4d5..3e828b594bc9c7 100644 --- a/clang/test/AST/ast-print-openacc-data-construct.cpp +++ b/clang/test/AST/ast-print-openacc-data-construct.cpp @@ -6,8 +6,7 @@ void foo() { // them, so the 'check' lines should start to include those once we implement // them. For now, they don't emit those because they are 'not implemented'. -// CHECK: #pragma acc data -// CHECK-NOT: default(none) +// CHECK: #pragma acc data default(none) #pragma acc data default(none) ; @@ -32,7 +31,7 @@ void foo() { int *iPtr; int array[5]; -// CHECK: #pragma acc data if(i == array[1]) +// 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]) @@ -45,7 +44,7 @@ void foo() { #pragma acc host_data use_device(Var) if(i == array[1]) ; -// CHECK: #pragma acc data async(i) +// CHECK: #pragma acc data default(none) async(i) #pragma acc data default(none) async(i) ; // CHECK: #pragma acc enter data async(i) @@ -53,7 +52,7 @@ void foo() { // CHECK: #pragma acc exit data async #pragma acc exit data copyout(i) async -// CHECK: #pragma acc data wait +// CHECK: #pragma acc data default(none) wait #pragma acc data default(none) wait() ; @@ -63,7 +62,7 @@ void foo() { // CHECK: #pragma acc exit data wait(*iPtr, i) #pragma acc exit data copyout(Var) wait(*iPtr, i) -// CHECK: #pragma acc data wait(queues: *iPtr, i) +// CHECK: #pragma acc data default(none) wait(queues: *iPtr, i) #pragma acc data default(none) wait(queues:*iPtr, i) ; @@ -72,4 +71,12 @@ void foo() { // CHECK: #pragma acc exit data wait(devnum: i : queues: *iPtr, i) #pragma acc exit data copyout(Var) wait(devnum:i:queues:*iPtr, i) + +// CHECK: #pragma acc data default(none) +#pragma acc data default(none) + ; + +// CHECK: #pragma acc data default(present) +#pragma acc data default(present) + ; } diff --git a/clang/test/SemaOpenACC/combined-construct-default-ast.cpp b/clang/test/SemaOpenACC/combined-construct-default-ast.cpp index 2ff24b32afe7b9..8f09e749073183 100644 --- a/clang/test/SemaOpenACC/combined-construct-default-ast.cpp +++ b/clang/test/SemaOpenACC/combined-construct-default-ast.cpp @@ -1,4 +1,3 @@ - // RUN: %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s // Test this with PCH. diff --git a/clang/test/SemaOpenACC/combined-construct-default-clause.c b/clang/test/SemaOpenACC/combined-construct-default-clause.c index 7e384ccfc17a07..43c2883f131845 100644 --- a/clang/test/SemaOpenACC/combined-construct-default-clause.c +++ b/clang/test/SemaOpenACC/combined-construct-default-clause.c @@ -28,7 +28,6 @@ void SingleOnly() { #pragma acc kernels loop default(none) for(int i = 0; i < 5; ++i); - // expected-warning@+1{{OpenACC clause 'default' not yet implemented}} #pragma acc data default(none) while(0); diff --git a/clang/test/SemaOpenACC/compute-construct-default-clause.c b/clang/test/SemaOpenACC/compute-construct-default-clause.c index 4aef2cbd7aec4c..dfa5cd3f1c0d3e 100644 --- a/clang/test/SemaOpenACC/compute-construct-default-clause.c +++ b/clang/test/SemaOpenACC/compute-construct-default-clause.c @@ -28,7 +28,6 @@ void SingleOnly() { #pragma acc kernels default(none) for(int i = 0; i < 5; ++i); - // expected-warning@+1{{OpenACC clause 'default' not yet implemented}} #pragma acc data default(none) while(0); diff --git a/clang/test/SemaOpenACC/data-construct-ast.cpp b/clang/test/SemaOpenACC/data-construct-ast.cpp index 9a7fe2cb793a73..60ed295fcd42eb 100644 --- a/clang/test/SemaOpenACC/data-construct-ast.cpp +++ b/clang/test/SemaOpenACC/data-construct-ast.cpp @@ -22,6 +22,7 @@ void NormalFunc() { #pragma acc data default(none) while (Var); // CHECK-NEXT: OpenACCDataConstruct{{.*}}data + // CHECK-NEXT: default(none) // CHECK-NEXT: WhileStmt // CHECK: NullStmt #pragma acc enter data copyin(Var) @@ -49,6 +50,7 @@ void TemplFunc() { #pragma acc data default(none) while (Var); // CHECK-NEXT: OpenACCDataConstruct{{.*}}data + // CHECK-NEXT: default(none) // CHECK-NEXT: WhileStmt // CHECK: NullStmt #pragma acc enter data copyin(Var) @@ -71,6 +73,7 @@ void TemplFunc() { // CHECK-NEXT: VarDecl // CHECK-NEXT: OpenACCDataConstruct{{.*}}data + // CHECK-NEXT: default(none) // CHECK-NEXT: WhileStmt // CHECK: NullStmt diff --git a/clang/test/SemaOpenACC/data-construct-default-ast.cpp b/clang/test/SemaOpenACC/data-construct-default-ast.cpp new file mode 100644 index 00000000000000..ef9b1348c6709c --- /dev/null +++ b/clang/test/SemaOpenACC/data-construct-default-ast.cpp @@ -0,0 +1,68 @@ +// RUN: %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s + +// Test this with PCH. +// RUN: %clang_cc1 %s -fopenacc -emit-pch -o %t %s +// RUN: %clang_cc1 %s -fopenacc -include-pch %t -ast-dump-all | FileCheck %s + +#ifndef PCH_HELPER +#define PCH_HELPER +void NormalFunc() { + // CHECK-LABEL: NormalFunc + // CHECK-NEXT: CompoundStmt + // CHECK-NEXT: OpenACCDataConstruct {{.*}}data + // CHECK-NEXT: default(none) +#pragma acc data default(none) + // CHECK: OpenACCDataConstruct {{.*}}data + // CHECK-NEXT: default(present) +#pragma acc data default(present) + ; +} +template<typename T> +void TemplFunc() { +#pragma acc data default(none) + for (unsigned i = 0; i < 5; ++i) { + typename T::type I; + } + +#pragma acc data default(present) + for (unsigned i = 0; i < 5; ++i) { + typename T::type I; + } + + // CHECK-LABEL: FunctionTemplateDecl {{.*}}TemplFunc + // CHECK-NEXT: TemplateTypeParmDecl + + // Template Pattern: + // CHECK-NEXT: FunctionDecl + // CHECK-NEXT: CompoundStmt + // CHECK-NEXT: OpenACCDataConstruct {{.*}}data + // CHECK-NEXT: default(none) + // CHECK: VarDecl{{.*}} I 'typename T::type' + + // CHECK-NEXT: OpenACCDataConstruct {{.*}}data + // CHECK-NEXT: default(present) + // CHECK: VarDecl{{.*}} I 'typename T::type' + + // Check instantiation. + // CHECK-LABEL: FunctionDecl{{.*}} used TemplFunc 'void ()' implicit_instantiation + // CHECK-NEXT: TemplateArgument type 'S' + // CHECK-NEXT: RecordType + // CHECK-NEXT: CXXRecord + // CHECK-NEXT: CompoundStmt + // CHECK-NEXT: OpenACCDataConstruct {{.*}}data + // CHECK-NEXT: default(none) + // CHECK: VarDecl{{.*}} I 'typename S::type':'int' + // CHECK-NEXT: OpenACCDataConstruct {{.*}}data + // CHECK-NEXT: default(present) + // CHECK: VarDecl{{.*}} I 'typename S::type':'int' + +} +struct S { + using type = int; +}; + +void use() { + TemplFunc<S>(); +} + +#endif diff --git a/clang/test/SemaOpenACC/data-construct-default-clause.c b/clang/test/SemaOpenACC/data-construct-default-clause.c new file mode 100644 index 00000000000000..e09004d7404c0c --- /dev/null +++ b/clang/test/SemaOpenACC/data-construct-default-clause.c @@ -0,0 +1,24 @@ +// RUN: %clang_cc1 %s -fopenacc -verify + +void use() { + // expected-error@+1{{invalid value for 'default' clause; expected 'present' or 'none'}} +#pragma acc data default(garbage) + ; +#pragma acc data default(present) + ; +#pragma acc data default(none) + ; + // expected-error@+2{{OpenACC 'default' clause cannot appear more than once on a 'data' directive}} + // expected-note@+1{{previous clause is here}} +#pragma acc data default(none) default(present) + ; + // expected-error@+1{{OpenACC 'default' clause is not valid on 'enter data' directive}} +#pragma acc enter data default(present) + ; + // expected-error@+1{{OpenACC 'default' clause is not valid on 'exit data' directive}} +#pragma acc exit data default(none) + ; + // expected-error@+1{{OpenACC 'default' clause is not valid on 'host_data' directive}} +#pragma acc host_data default(present) + ; +} diff --git a/clang/test/SemaOpenACC/data-construct-if-ast.cpp b/clang/test/SemaOpenACC/data-construct-if-ast.cpp index 5a7e5942211d38..a522b30357df89 100644 --- a/clang/test/SemaOpenACC/data-construct-if-ast.cpp +++ b/clang/test/SemaOpenACC/data-construct-if-ast.cpp @@ -21,6 +21,7 @@ void NormalFunc(int j, float f) { // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'j' 'int' // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float' <LValueToRValue> // CHECK-NEXT: DeclRefExpr{{.*}} 'float' lvalue ParmVar{{.*}} 'f' 'float' + // CHECK-NEXT: default(none) // CHECK-NEXT: NullStmt } @@ -39,6 +40,7 @@ void TemplFunc() { #pragma acc data default(none) if(T::SomeFloat < typename T::IntTy{}) ; // CHECK-NEXT: OpenACCDataConstruct{{.*}}data + // CHECK-NEXT: default(none) // CHECK-NEXT: if clause // CHECK-NEXT: BinaryOperator{{.*}} '<dependent type>' '<' // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue @@ -79,6 +81,7 @@ void TemplFunc() { // CHECK-NEXT: CompoundStmt // CHECK-NEXT: OpenACCDataConstruct{{.*}}data + // CHECK-NEXT: default(none) // CHECK-NEXT: if clause // CHECK-NEXT: BinaryOperator{{.*}} 'bool' '<' // 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 b57eb28d29dba2..906b252d219b44 100644 --- a/clang/test/SemaOpenACC/data-construct-if-clause.c +++ b/clang/test/SemaOpenACC/data-construct-if-clause.c @@ -2,10 +2,8 @@ void Foo() { int Var; - // expected-warning@+1{{OpenACC clause 'default' not yet implemented}} #pragma acc data default(present) if(1) ; - // expected-warning@+3{{OpenACC clause 'default' not yet implemented}} // expected-error@+2{{OpenACC 'if' clause cannot appear more than once on a 'data' directive}} // expected-note@+1{{previous clause is here}} #pragma acc data default(present) if(1) if (2) diff --git a/clang/test/SemaOpenACC/data-construct.cpp b/clang/test/SemaOpenACC/data-construct.cpp index 1e145c197834b0..2df68cc9bba4bb 100644 --- a/clang/test/SemaOpenACC/data-construct.cpp +++ b/clang/test/SemaOpenACC/data-construct.cpp @@ -45,7 +45,6 @@ void AtLeastOneOf() { // expected-warning@+1{{OpenACC clause 'attach' not yet implemented}} #pragma acc data attach(Var) ; - // expected-warning@+1{{OpenACC clause 'default' not yet implemented}} #pragma acc data default(none) ; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits