[clang] cb89112 - [OpenACC] Implement beginning parts of the 'parallel' Sema impl (#81659)

via cfe-commits cfe-commits at lists.llvm.org
Fri Feb 16 08:53:13 PST 2024


Author: Erich Keane
Date: 2024-02-16T08:53:09-08:00
New Revision: cb891127974ddba9d2e31fe16220591ff9296bdb

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

LOG: [OpenACC] Implement beginning parts of the 'parallel' Sema impl (#81659)

This patch Implements AST node creation and appertainment enforcement
for 'parallel', as well as changes the 'not implemented' messages to be
more specific. It does not deal with clauses/clause legality, nor a few
of the other rules from the standard, but this gets us most of the way
for a framework for future construct implementation.

Added: 
    clang/test/SemaOpenACC/compute-construct-ast.cpp
    clang/test/SemaOpenACC/parallel-assoc-stmt-inst.cpp
    clang/test/SemaOpenACC/parallel-loc-and-stmt.c
    clang/test/SemaOpenACC/parallel-loc-and-stmt.cpp
    clang/test/SemaOpenACC/unimplemented-construct.c

Modified: 
    clang/include/clang/AST/StmtOpenACC.h
    clang/include/clang/Sema/Sema.h
    clang/lib/AST/ASTContext.cpp
    clang/lib/AST/StmtOpenACC.cpp
    clang/lib/Parse/ParseOpenACC.cpp
    clang/lib/Sema/SemaOpenACC.cpp
    clang/lib/Sema/TreeTransform.h
    clang/test/ParserOpenACC/parse-clauses.c
    clang/test/ParserOpenACC/parse-clauses.cpp
    clang/test/ParserOpenACC/parse-constructs.c
    clang/test/ParserOpenACC/parse-wait-clause.c

Removed: 
    


################################################################################
diff  --git a/clang/include/clang/AST/StmtOpenACC.h b/clang/include/clang/AST/StmtOpenACC.h
index 9424f4f0807858..19da66832c7374 100644
--- a/clang/include/clang/AST/StmtOpenACC.h
+++ b/clang/include/clang/AST/StmtOpenACC.h
@@ -68,8 +68,9 @@ class OpenACCAssociatedStmtConstruct : public OpenACCConstructStmt {
 
 protected:
   OpenACCAssociatedStmtConstruct(StmtClass SC, OpenACCDirectiveKind K,
-                                 SourceLocation Start, SourceLocation End)
-      : OpenACCConstructStmt(SC, K, Start, End) {}
+                                 SourceLocation Start, SourceLocation End,
+                                 Stmt *AssocStmt)
+      : OpenACCConstructStmt(SC, K, Start, End), AssociatedStmt(AssocStmt) {}
 
   void setAssociatedStmt(Stmt *S) { AssociatedStmt = S; }
   Stmt *getAssociatedStmt() { return AssociatedStmt; }
@@ -105,14 +106,14 @@ class OpenACCComputeConstruct : public OpenACCAssociatedStmtConstruct {
   friend class ASTStmtReader;
   friend class ASTContext;
   OpenACCComputeConstruct()
-      : OpenACCAssociatedStmtConstruct(OpenACCComputeConstructClass,
-                                       OpenACCDirectiveKind::Invalid,
-                                       SourceLocation{}, SourceLocation{}) {}
+      : OpenACCAssociatedStmtConstruct(
+            OpenACCComputeConstructClass, OpenACCDirectiveKind::Invalid,
+            SourceLocation{}, SourceLocation{}, /*AssociatedStmt=*/nullptr) {}
 
   OpenACCComputeConstruct(OpenACCDirectiveKind K, SourceLocation Start,
-                          SourceLocation End)
+                          SourceLocation End, Stmt *StructuredBlock)
       : OpenACCAssociatedStmtConstruct(OpenACCComputeConstructClass, K, Start,
-                                       End) {
+                                       End, StructuredBlock) {
     assert((K == OpenACCDirectiveKind::Parallel ||
             K == OpenACCDirectiveKind::Serial ||
             K == OpenACCDirectiveKind::Kernels) &&
@@ -128,10 +129,9 @@ class OpenACCComputeConstruct : public OpenACCAssociatedStmtConstruct {
   }
 
   static OpenACCComputeConstruct *CreateEmpty(const ASTContext &C, EmptyShell);
-  static OpenACCComputeConstruct *Create(const ASTContext &C,
-                                         OpenACCDirectiveKind K,
-                                         SourceLocation BeginLoc,
-                                         SourceLocation EndLoc);
+  static OpenACCComputeConstruct *
+  Create(const ASTContext &C, OpenACCDirectiveKind K, SourceLocation BeginLoc,
+         SourceLocation EndLoc, Stmt *StructuredBlock);
 
   Stmt *getStructuredBlock() { return getAssociatedStmt(); }
   const Stmt *getStructuredBlock() const {

diff  --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h
index 53f06bcaeca166..e9cd42ae777df5 100644
--- a/clang/include/clang/Sema/Sema.h
+++ b/clang/include/clang/Sema/Sema.h
@@ -33,6 +33,7 @@
 #include "clang/AST/NSAPI.h"
 #include "clang/AST/PrettyPrinter.h"
 #include "clang/AST/StmtCXX.h"
+#include "clang/AST/StmtOpenACC.h"
 #include "clang/AST/StmtOpenMP.h"
 #include "clang/AST/TypeLoc.h"
 #include "clang/AST/TypeOrdering.h"

diff  --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index 78a04b4c694267..c475c841233c59 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -41,6 +41,7 @@
 #include "clang/AST/RawCommentList.h"
 #include "clang/AST/RecordLayout.h"
 #include "clang/AST/Stmt.h"
+#include "clang/AST/StmtOpenACC.h"
 #include "clang/AST/TemplateBase.h"
 #include "clang/AST/TemplateName.h"
 #include "clang/AST/Type.h"

diff  --git a/clang/lib/AST/StmtOpenACC.cpp b/clang/lib/AST/StmtOpenACC.cpp
index 1a99c246381839..f74a777cd695ba 100644
--- a/clang/lib/AST/StmtOpenACC.cpp
+++ b/clang/lib/AST/StmtOpenACC.cpp
@@ -24,10 +24,11 @@ OpenACCComputeConstruct::CreateEmpty(const ASTContext &C, EmptyShell) {
 
 OpenACCComputeConstruct *
 OpenACCComputeConstruct::Create(const ASTContext &C, OpenACCDirectiveKind K,
-                                SourceLocation BeginLoc,
-                                SourceLocation EndLoc) {
+                                SourceLocation BeginLoc, SourceLocation EndLoc,
+                                Stmt *StructuredBlock) {
   void *Mem = C.Allocate(sizeof(OpenACCComputeConstruct),
                          alignof(OpenACCComputeConstruct));
-  auto *Inst = new (Mem) OpenACCComputeConstruct(K, BeginLoc, EndLoc);
+  auto *Inst =
+      new (Mem) OpenACCComputeConstruct(K, BeginLoc, EndLoc, StructuredBlock);
   return Inst;
 }

diff  --git a/clang/lib/Parse/ParseOpenACC.cpp b/clang/lib/Parse/ParseOpenACC.cpp
index 10bdd8e9f7448e..50e78e8687aea1 100644
--- a/clang/lib/Parse/ParseOpenACC.cpp
+++ b/clang/lib/Parse/ParseOpenACC.cpp
@@ -551,8 +551,13 @@ void SkipUntilEndOfDirective(Parser &P) {
 }
 
 bool doesDirectiveHaveAssociatedStmt(OpenACCDirectiveKind DirKind) {
-  // TODO OpenACC: Implement.
-  return false;
+  switch (DirKind) {
+  default:
+    return false;
+  case OpenACCDirectiveKind::Parallel:
+    return true;
+  }
+  llvm_unreachable("Unhandled directive->assoc stmt");
 }
 
 } // namespace
@@ -1215,7 +1220,7 @@ StmtResult Parser::ParseOpenACCDirectiveStmt() {
   ConsumeAnnotationToken();
 
   OpenACCDirectiveParseInfo DirInfo = ParseOpenACCDirective();
-  if (getActions().ActOnStartOpenACCDeclDirective(DirInfo.DirKind,
+  if (getActions().ActOnStartOpenACCStmtDirective(DirInfo.DirKind,
                                                   DirInfo.StartLoc))
     return StmtError();
 

diff  --git a/clang/lib/Sema/SemaOpenACC.cpp b/clang/lib/Sema/SemaOpenACC.cpp
index 4dc36ce08bd21d..d365a5151a4582 100644
--- a/clang/lib/Sema/SemaOpenACC.cpp
+++ b/clang/lib/Sema/SemaOpenACC.cpp
@@ -16,6 +16,25 @@
 #include "clang/Sema/Sema.h"
 
 using namespace clang;
+
+namespace {
+bool diagnoseConstructAppertainment(Sema &S, OpenACCDirectiveKind K,
+                                    SourceLocation StartLoc, bool IsStmt) {
+  switch (K) {
+  default:
+  case OpenACCDirectiveKind::Invalid:
+    // Nothing to do here, both invalid and unimplemented don't really need to
+    // do anything.
+    break;
+  case OpenACCDirectiveKind::Parallel:
+    if (!IsStmt)
+      return S.Diag(StartLoc, diag::err_acc_construct_appertainment) << K;
+    break;
+  }
+  return false;
+}
+} // namespace
+
 bool Sema::ActOnOpenACCClause(OpenACCClauseKind ClauseKind,
                               SourceLocation StartLoc) {
   if (ClauseKind == OpenACCClauseKind::Invalid)
@@ -35,6 +54,10 @@ void Sema::ActOnOpenACCConstruct(OpenACCDirectiveKind K,
     // ensure that we can still work and don't check any construct-specific
     // rules anywhere.
     break;
+  case OpenACCDirectiveKind::Parallel:
+    // Nothing to do here, there is no real legalization that needs to happen
+    // here as these constructs do not take any arguments.
+    break;
   default:
     Diag(StartLoc, diag::warn_acc_construct_unimplemented) << K;
     break;
@@ -43,24 +66,49 @@ void Sema::ActOnOpenACCConstruct(OpenACCDirectiveKind K,
 
 bool Sema::ActOnStartOpenACCStmtDirective(OpenACCDirectiveKind K,
                                           SourceLocation StartLoc) {
-  return true;
+  return diagnoseConstructAppertainment(*this, K, StartLoc, /*IsStmt=*/true);
 }
 
 StmtResult Sema::ActOnEndOpenACCStmtDirective(OpenACCDirectiveKind K,
                                               SourceLocation StartLoc,
                                               SourceLocation EndLoc,
                                               StmtResult AssocStmt) {
-  return StmtEmpty();
+  switch (K) {
+  default:
+    return StmtEmpty();
+  case OpenACCDirectiveKind::Invalid:
+    return StmtError();
+  case OpenACCDirectiveKind::Parallel:
+    return OpenACCComputeConstruct::Create(
+        getASTContext(), K, StartLoc, EndLoc,
+        AssocStmt.isUsable() ? AssocStmt.get() : nullptr);
+  }
+  llvm_unreachable("Unhandled case in directive handling?");
 }
 
 StmtResult Sema::ActOnOpenACCAssociatedStmt(OpenACCDirectiveKind K,
                                             StmtResult AssocStmt) {
-  return AssocStmt;
+  switch (K) {
+  default:
+    llvm_unreachable("Unimplemented associated statement application");
+  case OpenACCDirectiveKind::Parallel:
+    // There really isn't any checking here that could happen. As long as we
+    // have a statement to associate, this should be fine.
+    // OpenACC 3.3 Section 6:
+    // Structured Block: in C or C++, an executable statement, possibly
+    // compound, with a single entry at the top and a single exit at the
+    // bottom.
+    // FIXME: Should we reject DeclStmt's here? The standard isn't clear, and
+    // an interpretation of it is to allow this and treat the initializer as
+    // the 'structured block'.
+    return AssocStmt;
+  }
+  llvm_unreachable("Invalid associated statement application");
 }
 
 bool Sema::ActOnStartOpenACCDeclDirective(OpenACCDirectiveKind K,
                                           SourceLocation StartLoc) {
-  return true;
+  return diagnoseConstructAppertainment(*this, K, StartLoc, /*IsStmt=*/false);
 }
 
 DeclGroupRef Sema::ActOnEndOpenACCDeclDirective() { return DeclGroupRef{}; }

diff  --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h
index 6e5ae123a6ba2c..a32a585531873a 100644
--- a/clang/lib/Sema/TreeTransform.h
+++ b/clang/lib/Sema/TreeTransform.h
@@ -4000,7 +4000,16 @@ class TreeTransform {
                                             SourceLocation BeginLoc,
                                             SourceLocation EndLoc,
                                             StmtResult StrBlock) {
-    llvm_unreachable("Not yet implemented!");
+    getSema().ActOnOpenACCConstruct(K, BeginLoc);
+
+    // TODO OpenACC: Include clauses.
+    if (getSema().ActOnStartOpenACCStmtDirective(K, BeginLoc))
+      return StmtError();
+
+    StrBlock = getSema().ActOnOpenACCAssociatedStmt(K, StrBlock);
+
+    return getSema().ActOnEndOpenACCStmtDirective(K, BeginLoc, EndLoc,
+                                                  StrBlock);
   }
 
 private:

diff  --git a/clang/test/ParserOpenACC/parse-clauses.c b/clang/test/ParserOpenACC/parse-clauses.c
index 3468e160a39cbe..fb2f51890d7d7f 100644
--- a/clang/test/ParserOpenACC/parse-clauses.c
+++ b/clang/test/ParserOpenACC/parse-clauses.c
@@ -979,108 +979,90 @@ void ReductionClauseParsing() {
 int returns_int();
 
 void IntExprParsing() {
-  // expected-error at +3{{expected '('}}
-  // expected-warning at +2{{OpenACC clause 'vector_length' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +2{{expected '('}}
+  // expected-warning at +1{{OpenACC clause 'vector_length' not yet implemented, clause ignored}}
 #pragma acc parallel vector_length
   {}
 
-  // expected-error at +3{{expected expression}}
-  // expected-warning at +2{{OpenACC clause 'vector_length' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +2{{expected expression}}
+  // expected-warning at +1{{OpenACC clause 'vector_length' not yet implemented, clause ignored}}
 #pragma acc parallel vector_length()
   {}
 
-  // expected-error at +3{{use of undeclared identifier 'invalid'}}
-  // expected-warning at +2{{OpenACC clause 'vector_length' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +2{{use of undeclared identifier 'invalid'}}
+  // expected-warning at +1{{OpenACC clause 'vector_length' not yet implemented, clause ignored}}
 #pragma acc parallel vector_length(invalid)
   {}
 
-  // expected-error at +4{{expected ')'}}
-  // expected-note at +3{{to match this '('}}
-  // expected-warning at +2{{OpenACC clause 'vector_length' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +3{{expected ')'}}
+  // expected-note at +2{{to match this '('}}
+  // expected-warning at +1{{OpenACC clause 'vector_length' not yet implemented, clause ignored}}
 #pragma acc parallel vector_length(5, 4)
   {}
 
-  // expected-warning at +2{{OpenACC clause 'vector_length' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-warning at +1{{OpenACC clause 'vector_length' not yet implemented, clause ignored}}
 #pragma acc parallel vector_length(5)
   {}
 
-  // expected-warning at +2{{OpenACC clause 'vector_length' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-warning at +1{{OpenACC clause 'vector_length' not yet implemented, clause ignored}}
 #pragma acc parallel vector_length(returns_int())
   {}
 
-  // expected-error at +3{{expected '('}}
-  // expected-warning at +2{{OpenACC clause 'num_gangs' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +2{{expected '('}}
+  // expected-warning at +1{{OpenACC clause 'num_gangs' not yet implemented, clause ignored}}
 #pragma acc parallel num_gangs
   {}
 
-  // expected-error at +3{{expected expression}}
-  // expected-warning at +2{{OpenACC clause 'num_gangs' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +2{{expected expression}}
+  // expected-warning at +1{{OpenACC clause 'num_gangs' not yet implemented, clause ignored}}
 #pragma acc parallel num_gangs()
   {}
 
-  // expected-error at +3{{use of undeclared identifier 'invalid'}}
-  // expected-warning at +2{{OpenACC clause 'num_gangs' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +2{{use of undeclared identifier 'invalid'}}
+  // expected-warning at +1{{OpenACC clause 'num_gangs' not yet implemented, clause ignored}}
 #pragma acc parallel num_gangs(invalid)
   {}
 
-  // expected-error at +4{{expected ')'}}
-  // expected-note at +3{{to match this '('}}
-  // expected-warning at +2{{OpenACC clause 'num_gangs' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +3{{expected ')'}}
+  // expected-note at +2{{to match this '('}}
+  // expected-warning at +1{{OpenACC clause 'num_gangs' not yet implemented, clause ignored}}
 #pragma acc parallel num_gangs(5, 4)
   {}
 
-  // expected-warning at +2{{OpenACC clause 'num_gangs' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-warning at +1{{OpenACC clause 'num_gangs' not yet implemented, clause ignored}}
 #pragma acc parallel num_gangs(5)
   {}
 
-  // expected-warning at +2{{OpenACC clause 'num_gangs' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-warning at +1{{OpenACC clause 'num_gangs' not yet implemented, clause ignored}}
 #pragma acc parallel num_gangs(returns_int())
   {}
 
-  // expected-error at +3{{expected '('}}
-  // expected-warning at +2{{OpenACC clause 'num_workers' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +2{{expected '('}}
+  // expected-warning at +1{{OpenACC clause 'num_workers' not yet implemented, clause ignored}}
 #pragma acc parallel num_workers
   {}
 
-  // expected-error at +3{{expected expression}}
-  // expected-warning at +2{{OpenACC clause 'num_workers' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +2{{expected expression}}
+  // expected-warning at +1{{OpenACC clause 'num_workers' not yet implemented, clause ignored}}
 #pragma acc parallel num_workers()
   {}
 
-  // expected-error at +3{{use of undeclared identifier 'invalid'}}
-  // expected-warning at +2{{OpenACC clause 'num_workers' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +2{{use of undeclared identifier 'invalid'}}
+  // expected-warning at +1{{OpenACC clause 'num_workers' not yet implemented, clause ignored}}
 #pragma acc parallel num_workers(invalid)
   {}
 
-  // expected-error at +4{{expected ')'}}
-  // expected-note at +3{{to match this '('}}
-  // expected-warning at +2{{OpenACC clause 'num_workers' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +3{{expected ')'}}
+  // expected-note at +2{{to match this '('}}
+  // expected-warning at +1{{OpenACC clause 'num_workers' not yet implemented, clause ignored}}
 #pragma acc parallel num_workers(5, 4)
   {}
 
-  // expected-warning at +2{{OpenACC clause 'num_workers' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-warning at +1{{OpenACC clause 'num_workers' not yet implemented, clause ignored}}
 #pragma acc parallel num_workers(5)
   {}
 
-  // expected-warning at +2{{OpenACC clause 'num_workers' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-warning at +1{{OpenACC clause 'num_workers' not yet implemented, clause ignored}}
 #pragma acc parallel num_workers(returns_int())
   {}
 
@@ -1262,210 +1244,176 @@ void IntExprParsing() {
 }
 
 void device_type() {
-  // expected-error at +3{{expected '('}}
-  // expected-warning at +2{{OpenACC clause 'device_type' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +2{{expected '('}}
+  // expected-warning at +1{{OpenACC clause 'device_type' not yet implemented, clause ignored}}
 #pragma acc parallel device_type
   {}
-  // expected-error at +3{{expected '('}}
-  // expected-warning at +2{{OpenACC clause 'dtype' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +2{{expected '('}}
+  // expected-warning at +1{{OpenACC clause 'dtype' not yet implemented, clause ignored}}
 #pragma acc parallel dtype
   {}
 
-  // expected-error at +5{{expected identifier}}
-  // expected-error at +4{{expected ')'}}
-  // expected-note at +3{{to match this '('}}
-  // expected-warning at +2{{OpenACC clause 'device_type' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +4{{expected identifier}}
+  // expected-error at +3{{expected ')'}}
+  // expected-note at +2{{to match this '('}}
+  // expected-warning at +1{{OpenACC clause 'device_type' not yet implemented, clause ignored}}
 #pragma acc parallel device_type(
     {}
-  // expected-error at +5{{expected identifier}}
-  // expected-error at +4{{expected ')'}}
-  // expected-note at +3{{to match this '('}}
-  // expected-warning at +2{{OpenACC clause 'dtype' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +4{{expected identifier}}
+  // expected-error at +3{{expected ')'}}
+  // expected-note at +2{{to match this '('}}
+  // expected-warning at +1{{OpenACC clause 'dtype' not yet implemented, clause ignored}}
 #pragma acc parallel dtype(
   {}
 
-  // expected-error at +3{{expected identifier}}
-  // expected-warning at +2{{OpenACC clause 'device_type' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +2{{expected identifier}}
+  // expected-warning at +1{{OpenACC clause 'device_type' not yet implemented, clause ignored}}
 #pragma acc parallel device_type()
   {}
-  // expected-error at +3{{expected identifier}}
-  // expected-warning at +2{{OpenACC clause 'dtype' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +2{{expected identifier}}
+  // expected-warning at +1{{OpenACC clause 'dtype' not yet implemented, clause ignored}}
 #pragma acc parallel dtype()
   {}
 
-  // expected-error at +4{{expected ')'}}
-  // expected-note at +3{{to match this '('}}
-  // expected-warning at +2{{OpenACC clause 'device_type' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +3{{expected ')'}}
+  // expected-note at +2{{to match this '('}}
+  // expected-warning at +1{{OpenACC clause 'device_type' not yet implemented, clause ignored}}
 #pragma acc parallel device_type(*
   {}
-  // expected-error at +4{{expected ')'}}
-  // expected-note at +3{{to match this '('}}
-  // expected-warning at +2{{OpenACC clause 'dtype' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +3{{expected ')'}}
+  // expected-note at +2{{to match this '('}}
+  // expected-warning at +1{{OpenACC clause 'dtype' not yet implemented, clause ignored}}
 #pragma acc parallel dtype(*
   {}
 
-  // expected-error at +4{{expected ')'}}
-  // expected-note at +3{{to match this '('}}
-  // expected-warning at +2{{OpenACC clause 'device_type' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +3{{expected ')'}}
+  // expected-note at +2{{to match this '('}}
+  // expected-warning at +1{{OpenACC clause 'device_type' not yet implemented, clause ignored}}
 #pragma acc parallel device_type(ident
   {}
-  // expected-error at +4{{expected ')'}}
-  // expected-note at +3{{to match this '('}}
-  // expected-warning at +2{{OpenACC clause 'dtype' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +3{{expected ')'}}
+  // expected-note at +2{{to match this '('}}
+  // expected-warning at +1{{OpenACC clause 'dtype' not yet implemented, clause ignored}}
 #pragma acc parallel dtype(ident
   {}
 
-  // expected-error at +5{{expected ','}}
-  // expected-error at +4{{expected ')'}}
-  // expected-note at +3{{to match this '('}}
-  // expected-warning at +2{{OpenACC clause 'device_type' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +4{{expected ','}}
+  // expected-error at +3{{expected ')'}}
+  // expected-note at +2{{to match this '('}}
+  // expected-warning at +1{{OpenACC clause 'device_type' not yet implemented, clause ignored}}
 #pragma acc parallel device_type(ident ident2
   {}
-  // expected-error at +5{{expected ','}}
-  // expected-error at +4{{expected ')'}}
-  // expected-note at +3{{to match this '('}}
-  // expected-warning at +2{{OpenACC clause 'dtype' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +4{{expected ','}}
+  // expected-error at +3{{expected ')'}}
+  // expected-note at +2{{to match this '('}}
+  // expected-warning at +1{{OpenACC clause 'dtype' not yet implemented, clause ignored}}
 #pragma acc parallel dtype(ident ident2
   {}
 
-  // expected-error at +4{{expected ')'}}
-  // expected-note at +3{{to match this '('}}
-  // expected-warning at +2{{OpenACC clause 'device_type' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +3{{expected ')'}}
+  // expected-note at +2{{to match this '('}}
+  // expected-warning at +1{{OpenACC clause 'device_type' not yet implemented, clause ignored}}
 #pragma acc parallel device_type(ident, ident2
   {}
-  // expected-error at +4{{expected ')'}}
-  // expected-note at +3{{to match this '('}}
-  // expected-warning at +2{{OpenACC clause 'dtype' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +3{{expected ')'}}
+  // expected-note at +2{{to match this '('}}
+  // expected-warning at +1{{OpenACC clause 'dtype' not yet implemented, clause ignored}}
 #pragma acc parallel dtype(ident, ident2
   {}
 
-  // expected-error at +3{{expected identifier}}
-  // expected-warning at +2{{OpenACC clause 'device_type' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +2{{expected identifier}}
+  // expected-warning at +1{{OpenACC clause 'device_type' not yet implemented, clause ignored}}
 #pragma acc parallel device_type(ident, ident2,)
   {}
-  // expected-error at +3{{expected identifier}}
-  // expected-warning at +2{{OpenACC clause 'dtype' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +2{{expected identifier}}
+  // expected-warning at +1{{OpenACC clause 'dtype' not yet implemented, clause ignored}}
 #pragma acc parallel dtype(ident, ident2,)
   {}
 
-  // expected-error at +4{{expected ')'}}
-  // expected-note at +3{{to match this '('}}
-  // expected-warning at +2{{OpenACC clause 'device_type' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +3{{expected ')'}}
+  // expected-note at +2{{to match this '('}}
+  // expected-warning at +1{{OpenACC clause 'device_type' not yet implemented, clause ignored}}
 #pragma acc parallel device_type(*,)
   {}
-  // expected-error at +4{{expected ')'}}
-  // expected-note at +3{{to match this '('}}
-  // expected-warning at +2{{OpenACC clause 'dtype' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +3{{expected ')'}}
+  // expected-note at +2{{to match this '('}}
+  // expected-warning at +1{{OpenACC clause 'dtype' not yet implemented, clause ignored}}
 #pragma acc parallel dtype(*,)
   {}
 
-  // expected-error at +4{{expected ')'}}
-  // expected-note at +3{{to match this '('}}
-  // expected-warning at +2{{OpenACC clause 'device_type' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +3{{expected ')'}}
+  // expected-note at +2{{to match this '('}}
+  // expected-warning at +1{{OpenACC clause 'device_type' not yet implemented, clause ignored}}
 #pragma acc parallel device_type(*,ident)
   {}
-  // expected-error at +4{{expected ')'}}
-  // expected-note at +3{{to match this '('}}
-  // expected-warning at +2{{OpenACC clause 'dtype' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +3{{expected ')'}}
+  // expected-note at +2{{to match this '('}}
+  // expected-warning at +1{{OpenACC clause 'dtype' not yet implemented, clause ignored}}
 #pragma acc parallel dtype(*,ident)
   {}
 
-  // expected-error at +3{{expected identifier}}
-  // expected-warning at +2{{OpenACC clause 'device_type' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +2{{expected identifier}}
+  // expected-warning at +1{{OpenACC clause 'device_type' not yet implemented, clause ignored}}
 #pragma acc parallel device_type(ident, *)
   {}
-  // expected-error at +3{{expected identifier}}
-  // expected-warning at +2{{OpenACC clause 'dtype' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +2{{expected identifier}}
+  // expected-warning at +1{{OpenACC clause 'dtype' not yet implemented, clause ignored}}
 #pragma acc parallel dtype(ident, *)
   {}
 
-  // expected-error at +3{{expected identifier}}
-  // expected-warning at +2{{OpenACC clause 'device_type' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +2{{expected identifier}}
+  // expected-warning at +1{{OpenACC clause 'device_type' not yet implemented, clause ignored}}
 #pragma acc parallel device_type("foo", 54)
   {}
-  // expected-error at +3{{expected identifier}}
-  // expected-warning at +2{{OpenACC clause 'dtype' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +2{{expected identifier}}
+  // expected-warning at +1{{OpenACC clause 'dtype' not yet implemented, clause ignored}}
 #pragma acc parallel dtype(31, "bar")
   {}
 
-  // expected-warning at +2{{OpenACC clause 'device_type' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-warning at +1{{OpenACC clause 'device_type' not yet implemented, clause ignored}}
 #pragma acc parallel device_type(ident, auto, int, float)
   {}
-  // expected-warning at +2{{OpenACC clause 'dtype' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-warning at +1{{OpenACC clause 'dtype' not yet implemented, clause ignored}}
 #pragma acc parallel dtype(ident, auto, int, float)
   {}
 
-  // expected-warning at +3{{OpenACC clause 'device_type' not yet implemented, clause ignored}}
-  // expected-warning at +2{{OpenACC clause 'dtype' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-warning at +2{{OpenACC clause 'device_type' not yet implemented, clause ignored}}
+  // expected-warning at +1{{OpenACC clause 'dtype' not yet implemented, clause ignored}}
 #pragma acc parallel device_type(ident, auto, int, float) dtype(ident, auto, int, float)
   {}
 }
 
 #define acc_async_sync -1
 void AsyncArgument() {
-  // expected-warning at +2{{OpenACC clause 'async' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-warning at +1{{OpenACC clause 'async' not yet implemented, clause ignored}}
 #pragma acc parallel async
   {}
 
-  // expected-error at +3{{expected expression}}
-  // expected-warning at +2{{OpenACC clause 'async' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +2{{expected expression}}
+  // expected-warning at +1{{OpenACC clause 'async' not yet implemented, clause ignored}}
 #pragma acc parallel async()
   {}
 
-  // expected-error at +3{{use of undeclared identifier 'invalid'}}
-  // expected-warning at +2{{OpenACC clause 'async' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +2{{use of undeclared identifier 'invalid'}}
+  // expected-warning at +1{{OpenACC clause 'async' not yet implemented, clause ignored}}
 #pragma acc parallel async(invalid)
   {}
 
-  // expected-error at +4{{expected ')'}}
-  // expected-note at +3{{to match this '('}}
-  // expected-warning at +2{{OpenACC clause 'async' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +3{{expected ')'}}
+  // expected-note at +2{{to match this '('}}
+  // expected-warning at +1{{OpenACC clause 'async' not yet implemented, clause ignored}}
 #pragma acc parallel async(4, 3)
   {}
 
-  // expected-warning at +2{{OpenACC clause 'async' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-warning at +1{{OpenACC clause 'async' not yet implemented, clause ignored}}
 #pragma acc parallel async(returns_int())
   {}
 
-  // expected-warning at +2{{OpenACC clause 'async' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-warning at +1{{OpenACC clause 'async' not yet implemented, clause ignored}}
 #pragma acc parallel async(5)
   {}
 
-  // expected-warning at +2{{OpenACC clause 'async' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-warning at +1{{OpenACC clause 'async' not yet implemented, clause ignored}}
 #pragma acc parallel async(acc_async_sync)
   {}
 }

diff  --git a/clang/test/ParserOpenACC/parse-clauses.cpp b/clang/test/ParserOpenACC/parse-clauses.cpp
index e524f73d8fdbac..497b1c7bcd0da4 100644
--- a/clang/test/ParserOpenACC/parse-clauses.cpp
+++ b/clang/test/ParserOpenACC/parse-clauses.cpp
@@ -12,23 +12,19 @@ void templ() {
 #pragma acc loop collapse(T::value)
   for(;;){}
 
-  // expected-warning at +2{{OpenACC clause 'vector_length' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-warning at +1{{OpenACC clause 'vector_length' not yet implemented, clause ignored}}
 #pragma acc parallel vector_length(T::value)
   for(;;){}
 
-  // expected-warning at +2{{OpenACC clause 'vector_length' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-warning at +1{{OpenACC clause 'vector_length' not yet implemented, clause ignored}}
 #pragma acc parallel vector_length(I)
   for(;;){}
 
-  // expected-warning at +2{{OpenACC clause 'async' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-warning at +1{{OpenACC clause 'async' not yet implemented, clause ignored}}
 #pragma acc parallel async(T::value)
   for(;;){}
 
-  // expected-warning at +2{{OpenACC clause 'async' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-warning at +1{{OpenACC clause 'async' not yet implemented, clause ignored}}
 #pragma acc parallel async(I)
   for(;;){}
 }

diff  --git a/clang/test/ParserOpenACC/parse-constructs.c b/clang/test/ParserOpenACC/parse-constructs.c
index 213b298df08a82..adb5e3c7c75527 100644
--- a/clang/test/ParserOpenACC/parse-constructs.c
+++ b/clang/test/ParserOpenACC/parse-constructs.c
@@ -18,19 +18,25 @@ void func() {
 #pragma acc invalid
   for(;;){}
 
-  // expected-error at +2{{invalid OpenACC clause 'clause'}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +1{{invalid OpenACC clause 'clause'}}
 #pragma acc parallel clause list
+  for(;;){}
+  // expected-error at +2{{expected clause-list or newline in OpenACC directive}}
+  // expected-error at +1{{invalid OpenACC clause 'clause'}}
+#pragma acc parallel() clause list
   for(;;){}
   // expected-error at +3{{expected clause-list or newline in OpenACC directive}}
-  // expected-error at +2{{invalid OpenACC clause 'clause'}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +2{{expected ')'}}
+  // expected-note at +1{{to match this '('}}
+#pragma acc parallel( clause list
+  for(;;){}
+  // expected-error at +2{{expected clause-list or newline in OpenACC directive}}
+  // expected-error at +1{{invalid OpenACC clause 'clause'}}
 #pragma acc parallel() clause list
   for(;;){}
-  // expected-error at +4{{expected clause-list or newline in OpenACC directive}}
-  // expected-error at +3{{expected ')'}}
-  // expected-note at +2{{to match this '('}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +3{{expected clause-list or newline in OpenACC directive}}
+  // expected-error at +2{{expected ')'}}
+  // expected-note at +1{{to match this '('}}
 #pragma acc parallel( clause list
   for(;;){}
   // expected-error at +3{{expected clause-list or newline in OpenACC directive}}
@@ -84,8 +90,7 @@ void func() {
   // expected-warning at +1{{OpenACC construct 'loop' not yet implemented, pragma ignored}}
 #pragma acc loop clause list
   for(;;){}
-  // expected-error at +2{{invalid OpenACC clause 'invalid'}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +1{{invalid OpenACC clause 'invalid'}}
 #pragma acc parallel invalid clause list
   for(;;){}
   // expected-error at +2{{invalid OpenACC clause 'invalid'}}

diff  --git a/clang/test/ParserOpenACC/parse-wait-clause.c b/clang/test/ParserOpenACC/parse-wait-clause.c
index a3037905350469..cce050d5da9841 100644
--- a/clang/test/ParserOpenACC/parse-wait-clause.c
+++ b/clang/test/ParserOpenACC/parse-wait-clause.c
@@ -3,227 +3,191 @@
 void func() {
   int i, j;
 
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait
   {}
 
-  // expected-error at +3{{invalid OpenACC clause 'clause'}}
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +2{{invalid OpenACC clause 'clause'}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait clause-list
   {}
 
-  // expected-error at +4{{expected ')'}}
-  // expected-note at +3{{to match this '('}}
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +3{{expected ')'}}
+  // expected-note at +2{{to match this '('}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait (
       {}
 
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait ()
       {}
 
-  // expected-error at +3{{invalid OpenACC clause 'clause'}}
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +2{{invalid OpenACC clause 'clause'}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait () clause-list
       {}
 
-  // expected-error at +5{{expected expression}}
-  // expected-error at +4{{expected ')'}}
-  // expected-note at +3{{to match this '('}}
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +4{{expected expression}}
+  // expected-error at +3{{expected ')'}}
+  // expected-note at +2{{to match this '('}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait (devnum:
     {}
 
-  // expected-error at +3{{expected expression}}
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +2{{expected expression}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait (devnum:)
     {}
 
-  // expected-error at +4{{expected expression}}
-  // expected-error at +3{{invalid OpenACC clause 'clause'}}
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +3{{expected expression}}
+  // expected-error at +2{{invalid OpenACC clause 'clause'}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait (devnum:) clause-list
     {}
 
-  // expected-error at +5{{expected ':'}}
-  // expected-error at +4{{expected ')'}}
-  // expected-note at +3{{to match this '('}}
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +4{{expected ':'}}
+  // expected-error at +3{{expected ')'}}
+  // expected-note at +2{{to match this '('}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait (devnum: i + j
     {}
 
-  // expected-error at +3{{expected ':'}}
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +2{{expected ':'}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait (devnum: i + j)
     {}
 
-  // expected-error at +4{{expected ':'}}
-  // expected-error at +3{{invalid OpenACC clause 'clause'}}
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +3{{expected ':'}}
+  // expected-error at +2{{invalid OpenACC clause 'clause'}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait (devnum: i + j) clause-list
     {}
 
-  // expected-error at +4{{expected ')'}}
-  // expected-note at +3{{to match this '('}}
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +3{{expected ')'}}
+  // expected-note at +2{{to match this '('}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait (queues:
     {}
 
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait (queues:)
     {}
 
-  // expected-error at +3{{invalid OpenACC clause 'clause'}}
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +2{{invalid OpenACC clause 'clause'}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait (queues:) clause-list
     {}
 
-  // expected-error at +4{{expected ')'}}
-  // expected-note at +3{{to match this '('}}
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +3{{expected ')'}}
+  // expected-note at +2{{to match this '('}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait (devnum: i + j:queues:
     {}
 
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait (devnum: i + j:queues:)
     {}
 
-  // expected-error at +3{{invalid OpenACC clause 'clause'}}
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +2{{invalid OpenACC clause 'clause'}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait (devnum: i + j:queues:) clause-list
     {}
 
-  // expected-error at +5{{use of undeclared identifier 'devnum'}}
-  // expected-error at +4{{expected ')'}}
-  // expected-note at +3{{to match this '('}}
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +4{{use of undeclared identifier 'devnum'}}
+  // expected-error at +3{{expected ')'}}
+  // expected-note at +2{{to match this '('}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait (queues:devnum: i + j
     {}
 
-  // expected-error at +3{{use of undeclared identifier 'devnum'}}
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +2{{use of undeclared identifier 'devnum'}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait (queues:devnum: i + j)
     {}
 
-  // expected-error at +4{{use of undeclared identifier 'devnum'}}
-  // expected-error at +3{{invalid OpenACC clause 'clause'}}
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +3{{use of undeclared identifier 'devnum'}}
+  // expected-error at +2{{invalid OpenACC clause 'clause'}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait (queues:devnum: i + j) clause-list
     {}
 
-  // expected-error at +4{{expected ')'}}
-  // expected-note at +3{{to match this '('}}
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +3{{expected ')'}}
+  // expected-note at +2{{to match this '('}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait(i, j, 1+1, 3.3
     {}
 
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait(i, j, 1+1, 3.3)
     {}
-  // expected-error at +3{{invalid OpenACC clause 'clause'}}
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +2{{invalid OpenACC clause 'clause'}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait(i, j, 1+1, 3.3) clause-list
     {}
 
-  // expected-error at +5{{expected expression}}
-  // expected-error at +4{{expected ')'}}
-  // expected-note at +3{{to match this '('}}
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +4{{expected expression}}
+  // expected-error at +3{{expected ')'}}
+  // expected-note at +2{{to match this '('}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait(,
     {}
 
-  // expected-error at +3{{expected expression}}
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +2{{expected expression}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait(,)
     {}
 
-  // expected-error at +4{{expected expression}}
-  // expected-error at +3{{invalid OpenACC clause 'clause'}}
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +3{{expected expression}}
+  // expected-error at +2{{invalid OpenACC clause 'clause'}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait(,) clause-list
     {}
 
-  // expected-error at +4{{expected ')'}}
-  // expected-note at +3{{to match this '('}}
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +3{{expected ')'}}
+  // expected-note at +2{{to match this '('}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait(queues:i, j, 1+1, 3.3
     {}
 
-  // expected-error at +5{{expected expression}}
-  // expected-error at +4{{expected ')'}}
-  // expected-note at +3{{to match this '('}}
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +4{{expected expression}}
+  // expected-error at +3{{expected ')'}}
+  // expected-note at +2{{to match this '('}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait(queues:i, j, 1+1, 3.3,
     {}
 
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait(queues:i, j, 1+1, 3.3)
     {}
 
-  // expected-error at +3{{invalid OpenACC clause 'clause'}}
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +2{{invalid OpenACC clause 'clause'}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait(queues:i, j, 1+1, 3.3) clause-list
     {}
 
-  // expected-error at +4{{expected ')'}}
-  // expected-note at +3{{to match this '('}}
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +3{{expected ')'}}
+  // expected-note at +2{{to match this '('}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait(devnum:3:i, j, 1+1, 3.3
     {}
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait(devnum:3:i, j, 1+1, 3.3)
     {}
-  // expected-error at +3{{invalid OpenACC clause 'clause'}}
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +2{{invalid OpenACC clause 'clause'}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait(devnum:3:i, j, 1+1, 3.3) clause-list
     {}
 
-  // expected-error at +4{{expected ')'}}
-  // expected-note at +3{{to match this '('}}
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +3{{expected ')'}}
+  // expected-note at +2{{to match this '('}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait(devnum:3:queues:i, j, 1+1, 3.3
     {}
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait(devnum:3:queues:i, j, 1+1, 3.3)
     {}
-  // expected-error at +3{{invalid OpenACC clause 'clause'}}
-  // expected-warning at +2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
-  // expected-warning at +1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}}
+  // expected-error at +2{{invalid OpenACC clause 'clause'}}
+  // expected-warning at +1{{OpenACC clause 'wait' not yet implemented, clause ignored}}
   #pragma acc parallel wait(devnum:3:queues:i, j, 1+1, 3.3) clause-list
     {}
 }

diff  --git a/clang/test/SemaOpenACC/compute-construct-ast.cpp b/clang/test/SemaOpenACC/compute-construct-ast.cpp
new file mode 100644
index 00000000000000..351fd1c3e0ee56
--- /dev/null
+++ b/clang/test/SemaOpenACC/compute-construct-ast.cpp
@@ -0,0 +1,56 @@
+// RUN: %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s
+
+void NormalFunc() {
+  // FIXME: Add a test once we have clauses for this.
+  // CHECK-LABEL: NormalFunc
+  // CHECK-NEXT: CompoundStmt
+  // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel
+  // CHECK-NEXT: CompoundStmt
+#pragma acc parallel
+  {
+#pragma acc parallel
+  // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel
+  // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel
+  // CHECK-NEXT: CompoundStmt
+#pragma acc parallel
+    {}
+  }
+}
+
+template<typename T>
+void TemplFunc() {
+#pragma acc parallel
+  {
+    typename T::type I;
+  }
+
+  // CHECK-LABEL: FunctionTemplateDecl {{.*}}TemplFunc
+  // CHECK-NEXT: TemplateTypeParmDecl
+
+  // Template Pattern:
+  // CHECK-NEXT: FunctionDecl
+  // CHECK-NEXT: CompoundStmt
+  // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel
+  // CHECK-NEXT: CompoundStmt
+  // CHECK-NEXT: DeclStmt
+  // CHECK-NEXT: 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: OpenACCComputeConstruct {{.*}}parallel
+  // CHECK-NEXT: CompoundStmt
+  // CHECK-NEXT: DeclStmt
+  // CHECK-NEXT: VarDecl{{.*}} I 'typename S::type':'int'
+}
+
+struct S {
+  using type = int;
+};
+
+void use() {
+  TemplFunc<S>();
+}

diff  --git a/clang/test/SemaOpenACC/parallel-assoc-stmt-inst.cpp b/clang/test/SemaOpenACC/parallel-assoc-stmt-inst.cpp
new file mode 100644
index 00000000000000..0464e164a754e6
--- /dev/null
+++ b/clang/test/SemaOpenACC/parallel-assoc-stmt-inst.cpp
@@ -0,0 +1,18 @@
+// RUN: %clang_cc1 %s -verify -fopenacc
+
+template<typename T>
+void Func() {
+#pragma acc parallel
+    typename T::type I; //#ILOC
+}
+
+struct S {
+  using type = int;
+};
+
+void use() {
+  Func<S>();
+  // expected-error@#ILOC{{type 'int' cannot be used prior to '::' because it has no members}}
+  // expected-note at +1{{in instantiation of function template specialization 'Func<int>' requested here}}
+  Func<int>();
+}

diff  --git a/clang/test/SemaOpenACC/parallel-loc-and-stmt.c b/clang/test/SemaOpenACC/parallel-loc-and-stmt.c
new file mode 100644
index 00000000000000..5189a6aa44f042
--- /dev/null
+++ b/clang/test/SemaOpenACC/parallel-loc-and-stmt.c
@@ -0,0 +1,46 @@
+// RUN: %clang_cc1 %s -verify -fopenacc
+
+// expected-error at +1{{OpenACC construct 'parallel' cannot be used here; it can only be used in a statement context}}
+#pragma acc parallel
+
+// expected-error at +1{{OpenACC construct 'parallel' cannot be used here; it can only be used in a statement context}}
+#pragma acc parallel
+int foo;
+
+struct S {
+// expected-error at +1{{OpenACC construct 'parallel' cannot be used here; it can only be used in a statement context}}
+#pragma acc parallel
+int foo;
+};
+
+void func() {
+  // FIXME: Should we disallow this on declarations, or consider this to be on
+  // the initialization?
+#pragma acc parallel
+  int foo;
+
+#pragma acc parallel
+  {
+#pragma acc parallel
+    {
+    }
+  }
+
+  {
+// expected-error at +2{{expected statement}}
+#pragma acc parallel
+  }
+
+#pragma acc parallel
+  while(0){}
+
+#pragma acc parallel
+  for(;;){}
+
+#pragma acc parallel
+#pragma acc parallel
+  for(;;){}
+
+// expected-error at +2{{expected statement}}
+#pragma acc parallel
+};

diff  --git a/clang/test/SemaOpenACC/parallel-loc-and-stmt.cpp b/clang/test/SemaOpenACC/parallel-loc-and-stmt.cpp
new file mode 100644
index 00000000000000..02ea2678f0361b
--- /dev/null
+++ b/clang/test/SemaOpenACC/parallel-loc-and-stmt.cpp
@@ -0,0 +1,61 @@
+// RUN: %clang_cc1 %s -verify -fopenacc
+
+// expected-error at +1{{OpenACC construct 'parallel' cannot be used here; it can only be used in a statement context}}
+#pragma acc parallel
+
+// expected-error at +1{{OpenACC construct 'parallel' cannot be used here; it can only be used in a statement context}}
+#pragma acc parallel
+int foo;
+
+struct S {
+// expected-error at +1{{OpenACC construct 'parallel' cannot be used here; it can only be used in a statement context}}
+#pragma acc parallel
+int foo;
+
+void mem_func() {
+  // FIXME: Should we disallow this on declarations, or consider this to be on
+  // the initialization?
+#pragma acc parallel
+  int foo;
+
+#pragma acc parallel
+  {
+  }
+
+#pragma acc parallel
+  while(0){}
+
+#pragma acc parallel
+  for(;;){}
+
+// expected-error at +2{{expected statement}}
+#pragma acc parallel
+}
+
+};
+
+template<typename T>
+void func() {
+  // FIXME: Should we disallow this on declarations, and consider this to be on
+  // the initialization?
+#pragma acc parallel
+  int foo;
+
+#pragma acc parallel
+  {
+  }
+
+#pragma acc parallel
+  while(0){}
+
+#pragma acc parallel
+  for(;;){}
+
+#pragma acc parallel
+#pragma acc parallel
+  for(;;){}
+
+// expected-error at +2{{expected statement}}
+#pragma acc parallel
+};
+

diff  --git a/clang/test/SemaOpenACC/unimplemented-construct.c b/clang/test/SemaOpenACC/unimplemented-construct.c
new file mode 100644
index 00000000000000..3f4bc375cff800
--- /dev/null
+++ b/clang/test/SemaOpenACC/unimplemented-construct.c
@@ -0,0 +1,39 @@
+// RUN: %clang_cc1 %s -verify -fopenacc
+
+// expected-warning at +1{{OpenACC construct 'routine' not yet implemented, pragma ignored}}
+#pragma acc routine
+
+struct S {
+// expected-warning at +1{{OpenACC construct 'wait' not yet implemented, pragma ignored}}
+#pragma acc wait
+int foo;
+};
+
+void func() {
+// expected-warning at +1{{OpenACC construct 'declare' not yet implemented, pragma ignored}}
+#pragma acc declare
+  int foo;
+
+// expected-warning at +1{{OpenACC construct 'declare' not yet implemented, pragma ignored}}
+#pragma acc declare
+  {
+// expected-warning at +1{{OpenACC construct 'declare' not yet implemented, pragma ignored}}
+#pragma acc declare
+    {
+// expected-warning at +1{{OpenACC construct 'declare' not yet implemented, pragma ignored}}
+#pragma acc declare
+    }
+  }
+
+// expected-warning at +1{{OpenACC construct 'declare' not yet implemented, pragma ignored}}
+#pragma acc declare
+  while(0){}
+
+// expected-warning at +1{{OpenACC construct 'declare' not yet implemented, pragma ignored}}
+#pragma acc declare
+  for(;;){}
+
+// expected-warning at +1{{OpenACC construct 'declare' not yet implemented, pragma ignored}}
+#pragma acc declare
+};
+


        


More information about the cfe-commits mailing list