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@+3{{expected '('}} - // expected-warning@+2{{OpenACC clause 'vector_length' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+2{{expected '('}} + // expected-warning@+1{{OpenACC clause 'vector_length' not yet implemented, clause ignored}} #pragma acc parallel vector_length {} - // expected-error@+3{{expected expression}} - // expected-warning@+2{{OpenACC clause 'vector_length' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+2{{expected expression}} + // expected-warning@+1{{OpenACC clause 'vector_length' not yet implemented, clause ignored}} #pragma acc parallel vector_length() {} - // expected-error@+3{{use of undeclared identifier 'invalid'}} - // expected-warning@+2{{OpenACC clause 'vector_length' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+2{{use of undeclared identifier 'invalid'}} + // expected-warning@+1{{OpenACC clause 'vector_length' not yet implemented, clause ignored}} #pragma acc parallel vector_length(invalid) {} - // expected-error@+4{{expected ')'}} - // expected-note@+3{{to match this '('}} - // expected-warning@+2{{OpenACC clause 'vector_length' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+3{{expected ')'}} + // expected-note@+2{{to match this '('}} + // expected-warning@+1{{OpenACC clause 'vector_length' not yet implemented, clause ignored}} #pragma acc parallel vector_length(5, 4) {} - // expected-warning@+2{{OpenACC clause 'vector_length' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-warning@+1{{OpenACC clause 'vector_length' not yet implemented, clause ignored}} #pragma acc parallel vector_length(5) {} - // expected-warning@+2{{OpenACC clause 'vector_length' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-warning@+1{{OpenACC clause 'vector_length' not yet implemented, clause ignored}} #pragma acc parallel vector_length(returns_int()) {} - // expected-error@+3{{expected '('}} - // expected-warning@+2{{OpenACC clause 'num_gangs' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+2{{expected '('}} + // expected-warning@+1{{OpenACC clause 'num_gangs' not yet implemented, clause ignored}} #pragma acc parallel num_gangs {} - // expected-error@+3{{expected expression}} - // expected-warning@+2{{OpenACC clause 'num_gangs' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+2{{expected expression}} + // expected-warning@+1{{OpenACC clause 'num_gangs' not yet implemented, clause ignored}} #pragma acc parallel num_gangs() {} - // expected-error@+3{{use of undeclared identifier 'invalid'}} - // expected-warning@+2{{OpenACC clause 'num_gangs' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+2{{use of undeclared identifier 'invalid'}} + // expected-warning@+1{{OpenACC clause 'num_gangs' not yet implemented, clause ignored}} #pragma acc parallel num_gangs(invalid) {} - // expected-error@+4{{expected ')'}} - // expected-note@+3{{to match this '('}} - // expected-warning@+2{{OpenACC clause 'num_gangs' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+3{{expected ')'}} + // expected-note@+2{{to match this '('}} + // expected-warning@+1{{OpenACC clause 'num_gangs' not yet implemented, clause ignored}} #pragma acc parallel num_gangs(5, 4) {} - // expected-warning@+2{{OpenACC clause 'num_gangs' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-warning@+1{{OpenACC clause 'num_gangs' not yet implemented, clause ignored}} #pragma acc parallel num_gangs(5) {} - // expected-warning@+2{{OpenACC clause 'num_gangs' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-warning@+1{{OpenACC clause 'num_gangs' not yet implemented, clause ignored}} #pragma acc parallel num_gangs(returns_int()) {} - // expected-error@+3{{expected '('}} - // expected-warning@+2{{OpenACC clause 'num_workers' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+2{{expected '('}} + // expected-warning@+1{{OpenACC clause 'num_workers' not yet implemented, clause ignored}} #pragma acc parallel num_workers {} - // expected-error@+3{{expected expression}} - // expected-warning@+2{{OpenACC clause 'num_workers' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+2{{expected expression}} + // expected-warning@+1{{OpenACC clause 'num_workers' not yet implemented, clause ignored}} #pragma acc parallel num_workers() {} - // expected-error@+3{{use of undeclared identifier 'invalid'}} - // expected-warning@+2{{OpenACC clause 'num_workers' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+2{{use of undeclared identifier 'invalid'}} + // expected-warning@+1{{OpenACC clause 'num_workers' not yet implemented, clause ignored}} #pragma acc parallel num_workers(invalid) {} - // expected-error@+4{{expected ')'}} - // expected-note@+3{{to match this '('}} - // expected-warning@+2{{OpenACC clause 'num_workers' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+3{{expected ')'}} + // expected-note@+2{{to match this '('}} + // expected-warning@+1{{OpenACC clause 'num_workers' not yet implemented, clause ignored}} #pragma acc parallel num_workers(5, 4) {} - // expected-warning@+2{{OpenACC clause 'num_workers' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-warning@+1{{OpenACC clause 'num_workers' not yet implemented, clause ignored}} #pragma acc parallel num_workers(5) {} - // expected-warning@+2{{OpenACC clause 'num_workers' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-warning@+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@+3{{expected '('}} - // expected-warning@+2{{OpenACC clause 'device_type' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+2{{expected '('}} + // expected-warning@+1{{OpenACC clause 'device_type' not yet implemented, clause ignored}} #pragma acc parallel device_type {} - // expected-error@+3{{expected '('}} - // expected-warning@+2{{OpenACC clause 'dtype' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+2{{expected '('}} + // expected-warning@+1{{OpenACC clause 'dtype' not yet implemented, clause ignored}} #pragma acc parallel dtype {} - // expected-error@+5{{expected identifier}} - // expected-error@+4{{expected ')'}} - // expected-note@+3{{to match this '('}} - // expected-warning@+2{{OpenACC clause 'device_type' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+4{{expected identifier}} + // expected-error@+3{{expected ')'}} + // expected-note@+2{{to match this '('}} + // expected-warning@+1{{OpenACC clause 'device_type' not yet implemented, clause ignored}} #pragma acc parallel device_type( {} - // expected-error@+5{{expected identifier}} - // expected-error@+4{{expected ')'}} - // expected-note@+3{{to match this '('}} - // expected-warning@+2{{OpenACC clause 'dtype' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+4{{expected identifier}} + // expected-error@+3{{expected ')'}} + // expected-note@+2{{to match this '('}} + // expected-warning@+1{{OpenACC clause 'dtype' not yet implemented, clause ignored}} #pragma acc parallel dtype( {} - // expected-error@+3{{expected identifier}} - // expected-warning@+2{{OpenACC clause 'device_type' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+2{{expected identifier}} + // expected-warning@+1{{OpenACC clause 'device_type' not yet implemented, clause ignored}} #pragma acc parallel device_type() {} - // expected-error@+3{{expected identifier}} - // expected-warning@+2{{OpenACC clause 'dtype' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+2{{expected identifier}} + // expected-warning@+1{{OpenACC clause 'dtype' not yet implemented, clause ignored}} #pragma acc parallel dtype() {} - // expected-error@+4{{expected ')'}} - // expected-note@+3{{to match this '('}} - // expected-warning@+2{{OpenACC clause 'device_type' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+3{{expected ')'}} + // expected-note@+2{{to match this '('}} + // expected-warning@+1{{OpenACC clause 'device_type' not yet implemented, clause ignored}} #pragma acc parallel device_type(* {} - // expected-error@+4{{expected ')'}} - // expected-note@+3{{to match this '('}} - // expected-warning@+2{{OpenACC clause 'dtype' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+3{{expected ')'}} + // expected-note@+2{{to match this '('}} + // expected-warning@+1{{OpenACC clause 'dtype' not yet implemented, clause ignored}} #pragma acc parallel dtype(* {} - // expected-error@+4{{expected ')'}} - // expected-note@+3{{to match this '('}} - // expected-warning@+2{{OpenACC clause 'device_type' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+3{{expected ')'}} + // expected-note@+2{{to match this '('}} + // expected-warning@+1{{OpenACC clause 'device_type' not yet implemented, clause ignored}} #pragma acc parallel device_type(ident {} - // expected-error@+4{{expected ')'}} - // expected-note@+3{{to match this '('}} - // expected-warning@+2{{OpenACC clause 'dtype' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+3{{expected ')'}} + // expected-note@+2{{to match this '('}} + // expected-warning@+1{{OpenACC clause 'dtype' not yet implemented, clause ignored}} #pragma acc parallel dtype(ident {} - // expected-error@+5{{expected ','}} - // expected-error@+4{{expected ')'}} - // expected-note@+3{{to match this '('}} - // expected-warning@+2{{OpenACC clause 'device_type' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+4{{expected ','}} + // expected-error@+3{{expected ')'}} + // expected-note@+2{{to match this '('}} + // expected-warning@+1{{OpenACC clause 'device_type' not yet implemented, clause ignored}} #pragma acc parallel device_type(ident ident2 {} - // expected-error@+5{{expected ','}} - // expected-error@+4{{expected ')'}} - // expected-note@+3{{to match this '('}} - // expected-warning@+2{{OpenACC clause 'dtype' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+4{{expected ','}} + // expected-error@+3{{expected ')'}} + // expected-note@+2{{to match this '('}} + // expected-warning@+1{{OpenACC clause 'dtype' not yet implemented, clause ignored}} #pragma acc parallel dtype(ident ident2 {} - // expected-error@+4{{expected ')'}} - // expected-note@+3{{to match this '('}} - // expected-warning@+2{{OpenACC clause 'device_type' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+3{{expected ')'}} + // expected-note@+2{{to match this '('}} + // expected-warning@+1{{OpenACC clause 'device_type' not yet implemented, clause ignored}} #pragma acc parallel device_type(ident, ident2 {} - // expected-error@+4{{expected ')'}} - // expected-note@+3{{to match this '('}} - // expected-warning@+2{{OpenACC clause 'dtype' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+3{{expected ')'}} + // expected-note@+2{{to match this '('}} + // expected-warning@+1{{OpenACC clause 'dtype' not yet implemented, clause ignored}} #pragma acc parallel dtype(ident, ident2 {} - // expected-error@+3{{expected identifier}} - // expected-warning@+2{{OpenACC clause 'device_type' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+2{{expected identifier}} + // expected-warning@+1{{OpenACC clause 'device_type' not yet implemented, clause ignored}} #pragma acc parallel device_type(ident, ident2,) {} - // expected-error@+3{{expected identifier}} - // expected-warning@+2{{OpenACC clause 'dtype' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+2{{expected identifier}} + // expected-warning@+1{{OpenACC clause 'dtype' not yet implemented, clause ignored}} #pragma acc parallel dtype(ident, ident2,) {} - // expected-error@+4{{expected ')'}} - // expected-note@+3{{to match this '('}} - // expected-warning@+2{{OpenACC clause 'device_type' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+3{{expected ')'}} + // expected-note@+2{{to match this '('}} + // expected-warning@+1{{OpenACC clause 'device_type' not yet implemented, clause ignored}} #pragma acc parallel device_type(*,) {} - // expected-error@+4{{expected ')'}} - // expected-note@+3{{to match this '('}} - // expected-warning@+2{{OpenACC clause 'dtype' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+3{{expected ')'}} + // expected-note@+2{{to match this '('}} + // expected-warning@+1{{OpenACC clause 'dtype' not yet implemented, clause ignored}} #pragma acc parallel dtype(*,) {} - // expected-error@+4{{expected ')'}} - // expected-note@+3{{to match this '('}} - // expected-warning@+2{{OpenACC clause 'device_type' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+3{{expected ')'}} + // expected-note@+2{{to match this '('}} + // expected-warning@+1{{OpenACC clause 'device_type' not yet implemented, clause ignored}} #pragma acc parallel device_type(*,ident) {} - // expected-error@+4{{expected ')'}} - // expected-note@+3{{to match this '('}} - // expected-warning@+2{{OpenACC clause 'dtype' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+3{{expected ')'}} + // expected-note@+2{{to match this '('}} + // expected-warning@+1{{OpenACC clause 'dtype' not yet implemented, clause ignored}} #pragma acc parallel dtype(*,ident) {} - // expected-error@+3{{expected identifier}} - // expected-warning@+2{{OpenACC clause 'device_type' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+2{{expected identifier}} + // expected-warning@+1{{OpenACC clause 'device_type' not yet implemented, clause ignored}} #pragma acc parallel device_type(ident, *) {} - // expected-error@+3{{expected identifier}} - // expected-warning@+2{{OpenACC clause 'dtype' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+2{{expected identifier}} + // expected-warning@+1{{OpenACC clause 'dtype' not yet implemented, clause ignored}} #pragma acc parallel dtype(ident, *) {} - // expected-error@+3{{expected identifier}} - // expected-warning@+2{{OpenACC clause 'device_type' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+2{{expected identifier}} + // expected-warning@+1{{OpenACC clause 'device_type' not yet implemented, clause ignored}} #pragma acc parallel device_type("foo", 54) {} - // expected-error@+3{{expected identifier}} - // expected-warning@+2{{OpenACC clause 'dtype' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+2{{expected identifier}} + // expected-warning@+1{{OpenACC clause 'dtype' not yet implemented, clause ignored}} #pragma acc parallel dtype(31, "bar") {} - // expected-warning@+2{{OpenACC clause 'device_type' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-warning@+1{{OpenACC clause 'device_type' not yet implemented, clause ignored}} #pragma acc parallel device_type(ident, auto, int, float) {} - // expected-warning@+2{{OpenACC clause 'dtype' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-warning@+1{{OpenACC clause 'dtype' not yet implemented, clause ignored}} #pragma acc parallel dtype(ident, auto, int, float) {} - // expected-warning@+3{{OpenACC clause 'device_type' not yet implemented, clause ignored}} - // expected-warning@+2{{OpenACC clause 'dtype' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-warning@+2{{OpenACC clause 'device_type' not yet implemented, clause ignored}} + // expected-warning@+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@+2{{OpenACC clause 'async' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-warning@+1{{OpenACC clause 'async' not yet implemented, clause ignored}} #pragma acc parallel async {} - // expected-error@+3{{expected expression}} - // expected-warning@+2{{OpenACC clause 'async' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+2{{expected expression}} + // expected-warning@+1{{OpenACC clause 'async' not yet implemented, clause ignored}} #pragma acc parallel async() {} - // expected-error@+3{{use of undeclared identifier 'invalid'}} - // expected-warning@+2{{OpenACC clause 'async' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+2{{use of undeclared identifier 'invalid'}} + // expected-warning@+1{{OpenACC clause 'async' not yet implemented, clause ignored}} #pragma acc parallel async(invalid) {} - // expected-error@+4{{expected ')'}} - // expected-note@+3{{to match this '('}} - // expected-warning@+2{{OpenACC clause 'async' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+3{{expected ')'}} + // expected-note@+2{{to match this '('}} + // expected-warning@+1{{OpenACC clause 'async' not yet implemented, clause ignored}} #pragma acc parallel async(4, 3) {} - // expected-warning@+2{{OpenACC clause 'async' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-warning@+1{{OpenACC clause 'async' not yet implemented, clause ignored}} #pragma acc parallel async(returns_int()) {} - // expected-warning@+2{{OpenACC clause 'async' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-warning@+1{{OpenACC clause 'async' not yet implemented, clause ignored}} #pragma acc parallel async(5) {} - // expected-warning@+2{{OpenACC clause 'async' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-warning@+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@+2{{OpenACC clause 'vector_length' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-warning@+1{{OpenACC clause 'vector_length' not yet implemented, clause ignored}} #pragma acc parallel vector_length(T::value) for(;;){} - // expected-warning@+2{{OpenACC clause 'vector_length' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-warning@+1{{OpenACC clause 'vector_length' not yet implemented, clause ignored}} #pragma acc parallel vector_length(I) for(;;){} - // expected-warning@+2{{OpenACC clause 'async' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-warning@+1{{OpenACC clause 'async' not yet implemented, clause ignored}} #pragma acc parallel async(T::value) for(;;){} - // expected-warning@+2{{OpenACC clause 'async' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-warning@+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@+2{{invalid OpenACC clause 'clause'}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+1{{invalid OpenACC clause 'clause'}} #pragma acc parallel clause list + for(;;){} + // expected-error@+2{{expected clause-list or newline in OpenACC directive}} + // expected-error@+1{{invalid OpenACC clause 'clause'}} +#pragma acc parallel() clause list for(;;){} // expected-error@+3{{expected clause-list or newline in OpenACC directive}} - // expected-error@+2{{invalid OpenACC clause 'clause'}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+2{{expected ')'}} + // expected-note@+1{{to match this '('}} +#pragma acc parallel( clause list + for(;;){} + // expected-error@+2{{expected clause-list or newline in OpenACC directive}} + // expected-error@+1{{invalid OpenACC clause 'clause'}} #pragma acc parallel() clause list for(;;){} - // expected-error@+4{{expected clause-list or newline in OpenACC directive}} - // expected-error@+3{{expected ')'}} - // expected-note@+2{{to match this '('}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+3{{expected clause-list or newline in OpenACC directive}} + // expected-error@+2{{expected ')'}} + // expected-note@+1{{to match this '('}} #pragma acc parallel( clause list for(;;){} // expected-error@+3{{expected clause-list or newline in OpenACC directive}} @@ -84,8 +90,7 @@ void func() { // expected-warning@+1{{OpenACC construct 'loop' not yet implemented, pragma ignored}} #pragma acc loop clause list for(;;){} - // expected-error@+2{{invalid OpenACC clause 'invalid'}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+1{{invalid OpenACC clause 'invalid'}} #pragma acc parallel invalid clause list for(;;){} // expected-error@+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@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-warning@+1{{OpenACC clause 'wait' not yet implemented, clause ignored}} #pragma acc parallel wait {} - // expected-error@+3{{invalid OpenACC clause 'clause'}} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+2{{invalid OpenACC clause 'clause'}} + // expected-warning@+1{{OpenACC clause 'wait' not yet implemented, clause ignored}} #pragma acc parallel wait clause-list {} - // expected-error@+4{{expected ')'}} - // expected-note@+3{{to match this '('}} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+3{{expected ')'}} + // expected-note@+2{{to match this '('}} + // expected-warning@+1{{OpenACC clause 'wait' not yet implemented, clause ignored}} #pragma acc parallel wait ( {} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-warning@+1{{OpenACC clause 'wait' not yet implemented, clause ignored}} #pragma acc parallel wait () {} - // expected-error@+3{{invalid OpenACC clause 'clause'}} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+2{{invalid OpenACC clause 'clause'}} + // expected-warning@+1{{OpenACC clause 'wait' not yet implemented, clause ignored}} #pragma acc parallel wait () clause-list {} - // expected-error@+5{{expected expression}} - // expected-error@+4{{expected ')'}} - // expected-note@+3{{to match this '('}} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+4{{expected expression}} + // expected-error@+3{{expected ')'}} + // expected-note@+2{{to match this '('}} + // expected-warning@+1{{OpenACC clause 'wait' not yet implemented, clause ignored}} #pragma acc parallel wait (devnum: {} - // expected-error@+3{{expected expression}} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+2{{expected expression}} + // expected-warning@+1{{OpenACC clause 'wait' not yet implemented, clause ignored}} #pragma acc parallel wait (devnum:) {} - // expected-error@+4{{expected expression}} - // expected-error@+3{{invalid OpenACC clause 'clause'}} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+3{{expected expression}} + // expected-error@+2{{invalid OpenACC clause 'clause'}} + // expected-warning@+1{{OpenACC clause 'wait' not yet implemented, clause ignored}} #pragma acc parallel wait (devnum:) clause-list {} - // expected-error@+5{{expected ':'}} - // expected-error@+4{{expected ')'}} - // expected-note@+3{{to match this '('}} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+4{{expected ':'}} + // expected-error@+3{{expected ')'}} + // expected-note@+2{{to match this '('}} + // expected-warning@+1{{OpenACC clause 'wait' not yet implemented, clause ignored}} #pragma acc parallel wait (devnum: i + j {} - // expected-error@+3{{expected ':'}} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+2{{expected ':'}} + // expected-warning@+1{{OpenACC clause 'wait' not yet implemented, clause ignored}} #pragma acc parallel wait (devnum: i + j) {} - // expected-error@+4{{expected ':'}} - // expected-error@+3{{invalid OpenACC clause 'clause'}} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+3{{expected ':'}} + // expected-error@+2{{invalid OpenACC clause 'clause'}} + // expected-warning@+1{{OpenACC clause 'wait' not yet implemented, clause ignored}} #pragma acc parallel wait (devnum: i + j) clause-list {} - // expected-error@+4{{expected ')'}} - // expected-note@+3{{to match this '('}} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+3{{expected ')'}} + // expected-note@+2{{to match this '('}} + // expected-warning@+1{{OpenACC clause 'wait' not yet implemented, clause ignored}} #pragma acc parallel wait (queues: {} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-warning@+1{{OpenACC clause 'wait' not yet implemented, clause ignored}} #pragma acc parallel wait (queues:) {} - // expected-error@+3{{invalid OpenACC clause 'clause'}} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+2{{invalid OpenACC clause 'clause'}} + // expected-warning@+1{{OpenACC clause 'wait' not yet implemented, clause ignored}} #pragma acc parallel wait (queues:) clause-list {} - // expected-error@+4{{expected ')'}} - // expected-note@+3{{to match this '('}} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+3{{expected ')'}} + // expected-note@+2{{to match this '('}} + // expected-warning@+1{{OpenACC clause 'wait' not yet implemented, clause ignored}} #pragma acc parallel wait (devnum: i + j:queues: {} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-warning@+1{{OpenACC clause 'wait' not yet implemented, clause ignored}} #pragma acc parallel wait (devnum: i + j:queues:) {} - // expected-error@+3{{invalid OpenACC clause 'clause'}} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+2{{invalid OpenACC clause 'clause'}} + // expected-warning@+1{{OpenACC clause 'wait' not yet implemented, clause ignored}} #pragma acc parallel wait (devnum: i + j:queues:) clause-list {} - // expected-error@+5{{use of undeclared identifier 'devnum'}} - // expected-error@+4{{expected ')'}} - // expected-note@+3{{to match this '('}} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+4{{use of undeclared identifier 'devnum'}} + // expected-error@+3{{expected ')'}} + // expected-note@+2{{to match this '('}} + // expected-warning@+1{{OpenACC clause 'wait' not yet implemented, clause ignored}} #pragma acc parallel wait (queues:devnum: i + j {} - // expected-error@+3{{use of undeclared identifier 'devnum'}} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+2{{use of undeclared identifier 'devnum'}} + // expected-warning@+1{{OpenACC clause 'wait' not yet implemented, clause ignored}} #pragma acc parallel wait (queues:devnum: i + j) {} - // expected-error@+4{{use of undeclared identifier 'devnum'}} - // expected-error@+3{{invalid OpenACC clause 'clause'}} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+3{{use of undeclared identifier 'devnum'}} + // expected-error@+2{{invalid OpenACC clause 'clause'}} + // expected-warning@+1{{OpenACC clause 'wait' not yet implemented, clause ignored}} #pragma acc parallel wait (queues:devnum: i + j) clause-list {} - // expected-error@+4{{expected ')'}} - // expected-note@+3{{to match this '('}} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+3{{expected ')'}} + // expected-note@+2{{to match this '('}} + // expected-warning@+1{{OpenACC clause 'wait' not yet implemented, clause ignored}} #pragma acc parallel wait(i, j, 1+1, 3.3 {} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-warning@+1{{OpenACC clause 'wait' not yet implemented, clause ignored}} #pragma acc parallel wait(i, j, 1+1, 3.3) {} - // expected-error@+3{{invalid OpenACC clause 'clause'}} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+2{{invalid OpenACC clause 'clause'}} + // expected-warning@+1{{OpenACC clause 'wait' not yet implemented, clause ignored}} #pragma acc parallel wait(i, j, 1+1, 3.3) clause-list {} - // expected-error@+5{{expected expression}} - // expected-error@+4{{expected ')'}} - // expected-note@+3{{to match this '('}} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+4{{expected expression}} + // expected-error@+3{{expected ')'}} + // expected-note@+2{{to match this '('}} + // expected-warning@+1{{OpenACC clause 'wait' not yet implemented, clause ignored}} #pragma acc parallel wait(, {} - // expected-error@+3{{expected expression}} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+2{{expected expression}} + // expected-warning@+1{{OpenACC clause 'wait' not yet implemented, clause ignored}} #pragma acc parallel wait(,) {} - // expected-error@+4{{expected expression}} - // expected-error@+3{{invalid OpenACC clause 'clause'}} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+3{{expected expression}} + // expected-error@+2{{invalid OpenACC clause 'clause'}} + // expected-warning@+1{{OpenACC clause 'wait' not yet implemented, clause ignored}} #pragma acc parallel wait(,) clause-list {} - // expected-error@+4{{expected ')'}} - // expected-note@+3{{to match this '('}} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+3{{expected ')'}} + // expected-note@+2{{to match this '('}} + // expected-warning@+1{{OpenACC clause 'wait' not yet implemented, clause ignored}} #pragma acc parallel wait(queues:i, j, 1+1, 3.3 {} - // expected-error@+5{{expected expression}} - // expected-error@+4{{expected ')'}} - // expected-note@+3{{to match this '('}} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+4{{expected expression}} + // expected-error@+3{{expected ')'}} + // expected-note@+2{{to match this '('}} + // expected-warning@+1{{OpenACC clause 'wait' not yet implemented, clause ignored}} #pragma acc parallel wait(queues:i, j, 1+1, 3.3, {} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-warning@+1{{OpenACC clause 'wait' not yet implemented, clause ignored}} #pragma acc parallel wait(queues:i, j, 1+1, 3.3) {} - // expected-error@+3{{invalid OpenACC clause 'clause'}} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+2{{invalid OpenACC clause 'clause'}} + // expected-warning@+1{{OpenACC clause 'wait' not yet implemented, clause ignored}} #pragma acc parallel wait(queues:i, j, 1+1, 3.3) clause-list {} - // expected-error@+4{{expected ')'}} - // expected-note@+3{{to match this '('}} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+3{{expected ')'}} + // expected-note@+2{{to match this '('}} + // expected-warning@+1{{OpenACC clause 'wait' not yet implemented, clause ignored}} #pragma acc parallel wait(devnum:3:i, j, 1+1, 3.3 {} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-warning@+1{{OpenACC clause 'wait' not yet implemented, clause ignored}} #pragma acc parallel wait(devnum:3:i, j, 1+1, 3.3) {} - // expected-error@+3{{invalid OpenACC clause 'clause'}} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+2{{invalid OpenACC clause 'clause'}} + // expected-warning@+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@+4{{expected ')'}} - // expected-note@+3{{to match this '('}} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+3{{expected ')'}} + // expected-note@+2{{to match this '('}} + // expected-warning@+1{{OpenACC clause 'wait' not yet implemented, clause ignored}} #pragma acc parallel wait(devnum:3:queues:i, j, 1+1, 3.3 {} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-warning@+1{{OpenACC clause 'wait' not yet implemented, clause ignored}} #pragma acc parallel wait(devnum:3:queues:i, j, 1+1, 3.3) {} - // expected-error@+3{{invalid OpenACC clause 'clause'}} - // expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC construct 'parallel' not yet implemented, pragma ignored}} + // expected-error@+2{{invalid OpenACC clause 'clause'}} + // expected-warning@+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@+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@+1{{OpenACC construct 'parallel' cannot be used here; it can only be used in a statement context}} +#pragma acc parallel + +// expected-error@+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@+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@+2{{expected statement}} +#pragma acc parallel + } + +#pragma acc parallel + while(0){} + +#pragma acc parallel + for(;;){} + +#pragma acc parallel +#pragma acc parallel + for(;;){} + +// expected-error@+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@+1{{OpenACC construct 'parallel' cannot be used here; it can only be used in a statement context}} +#pragma acc parallel + +// expected-error@+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@+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@+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@+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@+1{{OpenACC construct 'routine' not yet implemented, pragma ignored}} +#pragma acc routine + +struct S { +// expected-warning@+1{{OpenACC construct 'wait' not yet implemented, pragma ignored}} +#pragma acc wait +int foo; +}; + +void func() { +// expected-warning@+1{{OpenACC construct 'declare' not yet implemented, pragma ignored}} +#pragma acc declare + int foo; + +// expected-warning@+1{{OpenACC construct 'declare' not yet implemented, pragma ignored}} +#pragma acc declare + { +// expected-warning@+1{{OpenACC construct 'declare' not yet implemented, pragma ignored}} +#pragma acc declare + { +// expected-warning@+1{{OpenACC construct 'declare' not yet implemented, pragma ignored}} +#pragma acc declare + } + } + +// expected-warning@+1{{OpenACC construct 'declare' not yet implemented, pragma ignored}} +#pragma acc declare + while(0){} + +// expected-warning@+1{{OpenACC construct 'declare' not yet implemented, pragma ignored}} +#pragma acc declare + for(;;){} + +// expected-warning@+1{{OpenACC construct 'declare' not yet implemented, pragma ignored}} +#pragma acc declare +}; + _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits