[clang] 55154d6 - [OpenACC] Enable 'no_create' sema for data construct
via cfe-commits
cfe-commits at lists.llvm.org
Fri Dec 13 06:33:10 PST 2024
Author: erichkeane
Date: 2024-12-13T06:33:04-08:00
New Revision: 55154d6896e31dd707ac90dd15ed09bec446b4cf
URL: https://github.com/llvm/llvm-project/commit/55154d6896e31dd707ac90dd15ed09bec446b4cf
DIFF: https://github.com/llvm/llvm-project/commit/55154d6896e31dd707ac90dd15ed09bec446b4cf.diff
LOG: [OpenACC] Enable 'no_create' sema for data construct
Adds tests and enables the 'no_create' clause semantic analysis for the
'data' constuct, so it will no longer report 'not yet implemented'.
Added:
clang/test/SemaOpenACC/data-construct-no_create-ast.cpp
clang/test/SemaOpenACC/data-construct-no_create-clause.c
Modified:
clang/lib/Sema/SemaOpenACC.cpp
clang/test/SemaOpenACC/data-construct.cpp
Removed:
################################################################################
diff --git a/clang/lib/Sema/SemaOpenACC.cpp b/clang/lib/Sema/SemaOpenACC.cpp
index 84d2e2a7f5065a..9a3e88eeb46244 100644
--- a/clang/lib/Sema/SemaOpenACC.cpp
+++ b/clang/lib/Sema/SemaOpenACC.cpp
@@ -915,12 +915,6 @@ OpenACCClause *SemaOpenACCClauseVisitor::VisitFirstPrivateClause(
OpenACCClause *SemaOpenACCClauseVisitor::VisitNoCreateClause(
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.
- if (!isOpenACCComputeDirectiveKind(Clause.getDirectiveKind()) &&
- !isOpenACCCombinedDirectiveKind(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
// it isn't apparent in the standard where this is justified.
diff --git a/clang/test/SemaOpenACC/data-construct-no_create-ast.cpp b/clang/test/SemaOpenACC/data-construct-no_create-ast.cpp
new file mode 100644
index 00000000000000..6ff521eb4be07e
--- /dev/null
+++ b/clang/test/SemaOpenACC/data-construct-no_create-ast.cpp
@@ -0,0 +1,82 @@
+// 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
+
+int Global;
+short GlobalArray[5];
+void NormalUses(float *PointerParam) {
+ // CHECK: FunctionDecl{{.*}}NormalUses
+ // CHECK: ParmVarDecl
+ // CHECK-NEXT: CompoundStmt
+
+#pragma acc data no_create(GlobalArray, PointerParam[Global])
+ ;
+ // CHECK-NEXT: OpenACCDataConstruct{{.*}} data
+ // CHECK-NEXT: no_create clause
+ // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'
+ // 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: NullStmt
+}
+
+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 no_create(t) present(NTTP, u)
+ ;
+ // CHECK-NEXT: OpenACCDataConstruct{{.*}} data
+ // CHECK-NEXT: no_create clause
+ // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
+ // TODO_CHECK-NEXT: present clause
+ // TODO_CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &'
+ // TODO_CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
+ // CHECK-NEXT: NullStmt
+
+ // 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{{.*}} u 'int *'
+ // CHECK-NEXT: CompoundStmt
+
+// #pragma acc data no_create(t) present(NTTP, u)
+ // CHECK-NEXT: OpenACCDataConstruct{{.*}} data
+ // CHECK-NEXT: no_create clause
+ // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
+ // TODO_CHECK-NEXT: present clause
+ // TODO_CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}}'const unsigned int' lvalue
+ // TODO_CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} referenced 'auto &' depth 0 index 0 NTTP
+ // TODO_CHECK-NEXT: DeclRefExpr{{.*}}'const unsigned int' lvalue Var{{.*}} 'CEVar' 'const unsigned int'
+ // TODO_CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'
+ // CHECK-NEXT: NullStmt
+}
+
+void Inst() {
+ static constexpr unsigned CEVar = 1;
+ int i;
+ TemplUses<CEVar>(i, &i);
+}
+#endif
diff --git a/clang/test/SemaOpenACC/data-construct-no_create-clause.c b/clang/test/SemaOpenACC/data-construct-no_create-clause.c
new file mode 100644
index 00000000000000..74bc972ced64db
--- /dev/null
+++ b/clang/test/SemaOpenACC/data-construct-no_create-clause.c
@@ -0,0 +1,58 @@
+// 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 no_create(LocalInt)
+ ;
+
+ // Valid cases:
+#pragma acc data no_create(LocalInt, LocalPointer, LocalArray)
+ ;
+#pragma acc data no_create(LocalArray[2:1])
+ ;
+
+#pragma acc data no_create(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 no_create(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 no_create(+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 no_create(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 no_create(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 no_create((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 no_create((float)ArrayParam[2])
+ ;
+
+ // expected-error at +1{{OpenACC 'no_create' clause is not valid on 'exit data' directive}}
+#pragma acc exit data no_create(LocalInt)
+ // expected-error at +1{{OpenACC 'no_create' clause is not valid on 'enter data' directive}}
+#pragma acc enter data no_create(LocalInt)
+ // expected-error at +1{{OpenACC 'no_create' clause is not valid on 'host_data' directive}}
+#pragma acc host_data no_create(LocalInt)
+ ;
+}
diff --git a/clang/test/SemaOpenACC/data-construct.cpp b/clang/test/SemaOpenACC/data-construct.cpp
index 68186579b98161..7f3a54b009ab9f 100644
--- a/clang/test/SemaOpenACC/data-construct.cpp
+++ b/clang/test/SemaOpenACC/data-construct.cpp
@@ -32,7 +32,6 @@ void AtLeastOneOf() {
// expected-warning at +1{{OpenACC clause 'create' not yet implemented}}
#pragma acc data create(Var)
;
- // expected-warning at +1{{OpenACC clause 'no_create' not yet implemented}}
#pragma acc data no_create(Var)
;
// expected-warning at +1{{OpenACC clause 'present' not yet implemented}}
More information about the cfe-commits
mailing list