Author: erichkeane
Date: 2023-11-17T13:48:50-08:00
New Revision: 6168337640addcf137c780d83770bd5e6e06a8c2

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

LOG: [OpenACC] Handle lack of construct/directive

Discovered while working on another patch, this patch fixes the case
where are construct/directive name isn't provided.

Added: 
    

Modified: 
    clang/include/clang/Basic/DiagnosticParseKinds.td
    clang/lib/Parse/ParseOpenACC.cpp
    clang/test/ParserOpenACC/parse-constructs.c

Removed: 
    


################################################################################
diff  --git a/clang/include/clang/Basic/DiagnosticParseKinds.td 
b/clang/include/clang/Basic/DiagnosticParseKinds.td
index 1beddb5808fa2d6..b66ecf0724b1c77 100644
--- a/clang/include/clang/Basic/DiagnosticParseKinds.td
+++ b/clang/include/clang/Basic/DiagnosticParseKinds.td
@@ -1357,6 +1357,7 @@ def warn_pragma_acc_unimplemented_clause_parsing
       InGroup<SourceUsesOpenACC>;
 def err_acc_invalid_directive
     : Error<"invalid OpenACC directive '%0'">;
+def err_acc_missing_directive : Error<"expected OpenACC directive">;
 
 // OpenMP support.
 def warn_pragma_omp_ignored : Warning<

diff  --git a/clang/lib/Parse/ParseOpenACC.cpp 
b/clang/lib/Parse/ParseOpenACC.cpp
index ba29d75fe35a500..e0c8d4395564683 100644
--- a/clang/lib/Parse/ParseOpenACC.cpp
+++ b/clang/lib/Parse/ParseOpenACC.cpp
@@ -42,6 +42,14 @@ OpenACCDirectiveKind GetOpenACCDirectiveKind(StringRef Name) 
{
 // Parse and consume the tokens for OpenACC Directive/Construct kinds.
 OpenACCDirectiveKind ParseOpenACCDirectiveKind(Parser &P) {
   Token FirstTok = P.getCurToken();
+
+  // Just #pragma acc can get us immediately to the end, make sure we don't
+  // introspect on the spelling before then.
+  if (FirstTok.isAnnotation()) {
+    P.Diag(FirstTok, diag::err_acc_missing_directive);
+    return OpenACCDirectiveKind::Invalid;
+  }
+
   P.ConsumeToken();
   std::string FirstTokSpelling = P.getPreprocessor().getSpelling(FirstTok);
 

diff  --git a/clang/test/ParserOpenACC/parse-constructs.c 
b/clang/test/ParserOpenACC/parse-constructs.c
index e0607e7cfe316ab..8642833691ede7f 100644
--- a/clang/test/ParserOpenACC/parse-constructs.c
+++ b/clang/test/ParserOpenACC/parse-constructs.c
@@ -1,6 +1,12 @@
 // RUN: %clang_cc1 %s -verify -fopenacc
 
 void func() {
+
+  // expected-error@+2{{expected OpenACC directive}}
+  // expected-warning@+1{{OpenACC directives not yet implemented, pragma 
ignored}}
+#pragma acc
+  for(;;){}
+
   // expected-error@+2{{invalid OpenACC directive 'invalid'}}
   // expected-warning@+1{{OpenACC directives not yet implemented, pragma 
ignored}}
 #pragma acc invalid


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

Reply via email to