[clang] dd5ce45 - [OpenACC] Implement 'use_device' clause parsing

via cfe-commits cfe-commits at lists.llvm.org
Thu Jan 11 09:34:13 PST 2024


Author: erichkeane
Date: 2024-01-11T09:34:08-08:00
New Revision: dd5ce4572fb90323799f1bdf585c01d08613e277

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

LOG: [OpenACC] Implement 'use_device' clause parsing

'use_device' is effectively identical to the 'copy' parsing in that it
has required parens and no 'special' name, so this is a pretty trivial
impementation.  There are a number of other similar situation clauses
I'll do in a followup patch.

Added: 
    

Modified: 
    clang/include/clang/Basic/OpenACCKinds.h
    clang/lib/Parse/ParseOpenACC.cpp
    clang/test/ParserOpenACC/parse-clauses.c

Removed: 
    


################################################################################
diff  --git a/clang/include/clang/Basic/OpenACCKinds.h b/clang/include/clang/Basic/OpenACCKinds.h
index 1e260cfde30b9e..cb775ba0d92873 100644
--- a/clang/include/clang/Basic/OpenACCKinds.h
+++ b/clang/include/clang/Basic/OpenACCKinds.h
@@ -101,6 +101,8 @@ enum class OpenACCClauseKind {
   /// 'copy' clause, allowed on Compute and Combined Constructs, plus 'data' and
   /// 'declare'.
   Copy,
+  /// 'use_device' clause, allowed on 'host_data' construct.
+  UseDevice,
   /// Represents an invalid clause, for the purposes of parsing.
   Invalid,
 };

diff  --git a/clang/lib/Parse/ParseOpenACC.cpp b/clang/lib/Parse/ParseOpenACC.cpp
index 0594a77aa77ac0..c94f48d3ec04f0 100644
--- a/clang/lib/Parse/ParseOpenACC.cpp
+++ b/clang/lib/Parse/ParseOpenACC.cpp
@@ -99,6 +99,7 @@ OpenACCClauseKind getOpenACCClauseKind(Token Tok) {
       .Case("nohost", OpenACCClauseKind::NoHost)
       .Case("self", OpenACCClauseKind::Self)
       .Case("seq", OpenACCClauseKind::Seq)
+      .Case("use_device", OpenACCClauseKind::UseDevice)
       .Case("vector", OpenACCClauseKind::Vector)
       .Case("worker", OpenACCClauseKind::Worker)
       .Default(OpenACCClauseKind::Invalid);
@@ -336,7 +337,8 @@ bool ClauseHasOptionalParens(OpenACCClauseKind Kind) {
 
 bool ClauseHasRequiredParens(OpenACCClauseKind Kind) {
   return Kind == OpenACCClauseKind::Default || Kind == OpenACCClauseKind::If ||
-         Kind == OpenACCClauseKind::Copy;
+         Kind == OpenACCClauseKind::Copy ||
+         Kind == OpenACCClauseKind::UseDevice;
 }
 
 ExprResult ParseOpenACCConditionalExpr(Parser &P) {
@@ -461,6 +463,7 @@ bool Parser::ParseOpenACCClauseParams(OpenACCClauseKind Kind) {
         return true;
       break;
     }
+    case OpenACCClauseKind::UseDevice:
     case OpenACCClauseKind::Copy:
       if (ParseOpenACCClauseVarList(Kind))
         return true;

diff  --git a/clang/test/ParserOpenACC/parse-clauses.c b/clang/test/ParserOpenACC/parse-clauses.c
index 8f2206ff247ec4..623136f76d0003 100644
--- a/clang/test/ParserOpenACC/parse-clauses.c
+++ b/clang/test/ParserOpenACC/parse-clauses.c
@@ -365,7 +365,7 @@ void VarListClauses() {
 #pragma acc serial copy(s.array[s.value]), seq
 
   // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
-#pragma acc serial copy(s.array[s.value : 5]), seq
+#pragma acc serial copy(s.array[s.value], s.array[s.value :5] ), seq
 
   // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
 #pragma acc serial copy(HasMem.MemArr[3].array[1]), seq
@@ -398,6 +398,13 @@ void VarListClauses() {
   // expected-error at +2{{expected expression}}
   // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
 #pragma acc serial copy(HasMem.MemArr[3:]), seq
+
+  // expected-error at +2{{expected ','}}
+  // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+#pragma acc serial use_device(s.array[s.value] s.array[s.value :5] ), seq
+
+  // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+#pragma acc serial use_device(s.array[s.value : 5]), seq
 }
 
   // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}


        


More information about the cfe-commits mailing list