[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