From 8e92d549be73392078350b5fb73e7ddbf0605573 Mon Sep 17 00:00:00 2001 From: Alexey Bataev Date: Tue, 18 Aug 2015 06:47:21 +0000 Subject: [PATCH] [OPENMP 4.1] Allow variables with reference types in private clauses. OpenMP 4.1 allows to use variables with reference types in all private clauses (private, firstprivate, lastprivate, linear etc.). Patch allows to use such variables and fixes codegen for linear variables with reference types. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@245268 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/DataRecursiveASTVisitor.h | 3 + include/clang/AST/OpenMPClause.h | 41 +++++++--- include/clang/AST/RecursiveASTVisitor.h | 3 + include/clang/Basic/DiagnosticSemaKinds.td | 2 - lib/AST/Stmt.cpp | 22 ++++-- lib/AST/StmtProfile.cpp | 3 + lib/CodeGen/CGStmtOpenMP.cpp | 15 ++-- lib/Sema/SemaOpenMP.cpp | 75 ++++++------------- lib/Serialization/ASTReaderStmt.cpp | 4 + lib/Serialization/ASTWriterStmt.cpp | 3 + test/OpenMP/for_codegen.cpp | 4 + test/OpenMP/for_firstprivate_codegen.cpp | 2 +- test/OpenMP/for_firstprivate_messages.cpp | 8 +- test/OpenMP/for_lastprivate_codegen.cpp | 2 +- test/OpenMP/for_lastprivate_messages.cpp | 8 +- test/OpenMP/for_linear_codegen.cpp | 2 +- test/OpenMP/for_linear_messages.cpp | 8 +- test/OpenMP/for_private_messages.cpp | 8 +- .../OpenMP/for_simd_firstprivate_messages.cpp | 8 +- test/OpenMP/for_simd_lastprivate_messages.cpp | 8 +- test/OpenMP/for_simd_linear_messages.cpp | 8 +- test/OpenMP/for_simd_private_messages.cpp | 8 +- .../OpenMP/parallel_firstprivate_messages.cpp | 4 +- .../parallel_for_firstprivate_messages.cpp | 8 +- .../parallel_for_lastprivate_messages.cpp | 8 +- test/OpenMP/parallel_for_linear_messages.cpp | 8 +- test/OpenMP/parallel_for_private_messages.cpp | 8 +- ...arallel_for_simd_firstprivate_messages.cpp | 8 +- ...parallel_for_simd_lastprivate_messages.cpp | 8 +- .../parallel_for_simd_linear_messages.cpp | 8 +- .../parallel_for_simd_private_messages.cpp | 8 +- test/OpenMP/parallel_private_messages.cpp | 4 +- ...arallel_sections_firstprivate_messages.cpp | 8 +- ...parallel_sections_lastprivate_messages.cpp | 8 +- .../parallel_sections_private_messages.cpp | 8 +- .../OpenMP/sections_firstprivate_messages.cpp | 8 +- test/OpenMP/sections_lastprivate_messages.cpp | 8 +- test/OpenMP/sections_private_messages.cpp | 8 +- test/OpenMP/simd_lastprivate_messages.cpp | 8 +- test/OpenMP/simd_linear_messages.cpp | 8 +- test/OpenMP/simd_private_messages.cpp | 8 +- test/OpenMP/single_firstprivate_messages.cpp | 8 +- test/OpenMP/single_private_messages.cpp | 8 +- test/OpenMP/task_firstprivate_messages.cpp | 4 +- test/OpenMP/task_messages.cpp | 28 ++----- test/OpenMP/task_private_messages.cpp | 4 +- test/OpenMP/teams_firstprivate_messages.cpp | 4 +- test/OpenMP/teams_private_messages.cpp | 4 +- tools/libclang/CIndex.cpp | 3 + 49 files changed, 230 insertions(+), 222 deletions(-) diff --git a/include/clang/AST/DataRecursiveASTVisitor.h b/include/clang/AST/DataRecursiveASTVisitor.h index 997d0400c7..5a6952f321 100644 --- a/include/clang/AST/DataRecursiveASTVisitor.h +++ b/include/clang/AST/DataRecursiveASTVisitor.h @@ -2587,6 +2587,9 @@ bool RecursiveASTVisitor::VisitOMPLinearClause(OMPLinearClause *C) { TRY_TO(TraverseStmt(C->getStep())); TRY_TO(TraverseStmt(C->getCalcStep())); TRY_TO(VisitOMPClauseList(C)); + for (auto *E : C->privates()) { + TRY_TO(TraverseStmt(E)); + } for (auto *E : C->inits()) { TRY_TO(TraverseStmt(E)); } diff --git a/include/clang/AST/OpenMPClause.h b/include/clang/AST/OpenMPClause.h index dc08db48fb..866d6dfd12 100644 --- a/include/clang/AST/OpenMPClause.h +++ b/include/clang/AST/OpenMPClause.h @@ -1685,16 +1685,23 @@ class OMPLinearClause : public OMPVarListClause { /// expressions - linear step and a helper to calculate it before the /// loop body (used when the linear step is not constant): /// - /// { Vars[] /* in OMPVarListClause */; Inits[]; Updates[]; Finals[]; - /// Step; CalcStep; } + /// { Vars[] /* in OMPVarListClause */; Privates[]; Inits[]; Updates[]; + /// Finals[]; Step; CalcStep; } /// - MutableArrayRef getInits() { + MutableArrayRef getPrivates() { return MutableArrayRef(varlist_end(), varlist_size()); } - ArrayRef getInits() const { + ArrayRef getPrivates() const { return llvm::makeArrayRef(varlist_end(), varlist_size()); } + MutableArrayRef getInits() { + return MutableArrayRef(getPrivates().end(), varlist_size()); + } + ArrayRef getInits() const { + return llvm::makeArrayRef(getPrivates().end(), varlist_size()); + } + /// \brief Sets the list of update expressions for linear variables. MutableArrayRef getUpdates() { return MutableArrayRef(getInits().end(), varlist_size()); @@ -1711,6 +1718,10 @@ class OMPLinearClause : public OMPVarListClause { return llvm::makeArrayRef(getUpdates().end(), varlist_size()); } + /// \brief Sets the list of the copies of original linear variables. + /// \param PL List of expressions. + void setPrivates(ArrayRef PL); + /// \brief Sets the list of the initial values for linear variables. /// \param IL List of expressions. void setInits(ArrayRef IL); @@ -1725,14 +1736,14 @@ public: /// \param ColonLoc Location of ':'. /// \param EndLoc Ending location of the clause. /// \param VL List of references to the variables. + /// \param PL List of private copies of original variables. /// \param IL List of initial values for the variables. /// \param Step Linear step. /// \param CalcStep Calculation of the linear step. - static OMPLinearClause *Create(const ASTContext &C, SourceLocation StartLoc, - SourceLocation LParenLoc, - SourceLocation ColonLoc, SourceLocation EndLoc, - ArrayRef VL, ArrayRef IL, - Expr *Step, Expr *CalcStep); + static OMPLinearClause * + Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, + SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef VL, + ArrayRef PL, ArrayRef IL, Expr *Step, Expr *CalcStep); /// \brief Creates an empty clause with the place for \a NumVars variables. /// @@ -1763,6 +1774,18 @@ public: /// \param FL List of expressions. void setFinals(ArrayRef FL); + typedef MutableArrayRef::iterator privates_iterator; + typedef ArrayRef::iterator privates_const_iterator; + typedef llvm::iterator_range privates_range; + typedef llvm::iterator_range privates_const_range; + + privates_range privates() { + return privates_range(getPrivates().begin(), getPrivates().end()); + } + privates_const_range privates() const { + return privates_const_range(getPrivates().begin(), getPrivates().end()); + } + typedef MutableArrayRef::iterator inits_iterator; typedef ArrayRef::iterator inits_const_iterator; typedef llvm::iterator_range inits_range; diff --git a/include/clang/AST/RecursiveASTVisitor.h b/include/clang/AST/RecursiveASTVisitor.h index b8ae8331fd..61e61a9b7b 100644 --- a/include/clang/AST/RecursiveASTVisitor.h +++ b/include/clang/AST/RecursiveASTVisitor.h @@ -2619,6 +2619,9 @@ bool RecursiveASTVisitor::VisitOMPLinearClause(OMPLinearClause *C) { TRY_TO(TraverseStmt(C->getStep())); TRY_TO(TraverseStmt(C->getCalcStep())); TRY_TO(VisitOMPClauseList(C)); + for (auto *E : C->privates()) { + TRY_TO(TraverseStmt(E)); + } for (auto *E : C->inits()) { TRY_TO(TraverseStmt(E)); } diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 2d6545cfb6..e079de0209 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -7477,8 +7477,6 @@ def err_omp_expected_var_name_or_array_item : Error< "expected variable name, array element or array section">; def note_omp_task_predetermined_firstprivate_here : Note< "predetermined as a firstprivate in a task construct here">; -def err_omp_clause_ref_type_arg : Error< - "arguments of OpenMP clause '%0' cannot be of reference type %1">; def err_omp_task_predetermined_firstprivate_ref_type_arg : Error< "predetermined as a firstprivate in a task construct variable cannot be of reference type %0">; def err_omp_threadprivate_incomplete_type : Error< diff --git a/lib/AST/Stmt.cpp b/lib/AST/Stmt.cpp index 94e9c4dc60..175526a931 100644 --- a/lib/AST/Stmt.cpp +++ b/lib/AST/Stmt.cpp @@ -1317,10 +1317,16 @@ OMPSharedClause *OMPSharedClause::CreateEmpty(const ASTContext &C, return new (Mem) OMPSharedClause(N); } +void OMPLinearClause::setPrivates(ArrayRef PL) { + assert(PL.size() == varlist_size() && + "Number of privates is not the same as the preallocated buffer"); + std::copy(PL.begin(), PL.end(), varlist_end()); +} + void OMPLinearClause::setInits(ArrayRef IL) { assert(IL.size() == varlist_size() && "Number of inits is not the same as the preallocated buffer"); - std::copy(IL.begin(), IL.end(), varlist_end()); + std::copy(IL.begin(), IL.end(), getPrivates().end()); } void OMPLinearClause::setUpdates(ArrayRef UL) { @@ -1335,19 +1341,19 @@ void OMPLinearClause::setFinals(ArrayRef FL) { std::copy(FL.begin(), FL.end(), getUpdates().end()); } -OMPLinearClause * -OMPLinearClause::Create(const ASTContext &C, SourceLocation StartLoc, - SourceLocation LParenLoc, SourceLocation ColonLoc, - SourceLocation EndLoc, ArrayRef VL, - ArrayRef IL, Expr *Step, Expr *CalcStep) { +OMPLinearClause *OMPLinearClause::Create( + const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, + SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef VL, + ArrayRef PL, ArrayRef IL, Expr *Step, Expr *CalcStep) { // Allocate space for 4 lists (Vars, Inits, Updates, Finals) and 2 expressions // (Step and CalcStep). void *Mem = C.Allocate(llvm::RoundUpToAlignment(sizeof(OMPLinearClause), llvm::alignOf()) + - (4 * VL.size() + 2) * sizeof(Expr *)); + (5 * VL.size() + 2) * sizeof(Expr *)); OMPLinearClause *Clause = new (Mem) OMPLinearClause(StartLoc, LParenLoc, ColonLoc, EndLoc, VL.size()); Clause->setVarRefs(VL); + Clause->setPrivates(PL); Clause->setInits(IL); // Fill update and final expressions with zeroes, they are provided later, // after the directive construction. @@ -1366,7 +1372,7 @@ OMPLinearClause *OMPLinearClause::CreateEmpty(const ASTContext &C, // (Step and CalcStep). void *Mem = C.Allocate(llvm::RoundUpToAlignment(sizeof(OMPLinearClause), llvm::alignOf()) + - (4 * NumVars + 2) * sizeof(Expr *)); + (5 * NumVars + 2) * sizeof(Expr *)); return new (Mem) OMPLinearClause(NumVars); } diff --git a/lib/AST/StmtProfile.cpp b/lib/AST/StmtProfile.cpp index fa1be8644b..0318330abb 100644 --- a/lib/AST/StmtProfile.cpp +++ b/lib/AST/StmtProfile.cpp @@ -384,6 +384,9 @@ void OMPClauseProfiler::VisitOMPReductionClause( } void OMPClauseProfiler::VisitOMPLinearClause(const OMPLinearClause *C) { VisitOMPClauseList(C); + for (auto *E : C->privates()) { + Profiler->VisitStmt(E); + } for (auto *E : C->inits()) { Profiler->VisitStmt(E); } diff --git a/lib/CodeGen/CGStmtOpenMP.cpp b/lib/CodeGen/CGStmtOpenMP.cpp index 1f1000beb4..ecf95c6d8c 100644 --- a/lib/CodeGen/CGStmtOpenMP.cpp +++ b/lib/CodeGen/CGStmtOpenMP.cpp @@ -721,17 +721,20 @@ emitPrivateLinearVars(CodeGenFunction &CGF, const OMPExecutableDirective &D, CodeGenFunction::OMPPrivateScope &PrivateScope) { for (auto &&I = D.getClausesOfKind(OMPC_linear); I; ++I) { auto *C = cast(*I); + auto CurPrivate = C->privates().begin(); for (auto *E : C->varlists()) { - auto VD = cast(cast(E)->getDecl()); - bool IsRegistered = PrivateScope.addPrivate(VD, [&]()->llvm::Value * { - // Emit var without initialization. - auto VarEmission = CGF.EmitAutoVarAlloca(*VD); - CGF.EmitAutoVarCleanups(VarEmission); - return VarEmission.getAllocatedAddress(); + auto *VD = cast(cast(E)->getDecl()); + auto *PrivateVD = + cast(cast(*CurPrivate)->getDecl()); + bool IsRegistered = PrivateScope.addPrivate(VD, [&]() -> llvm::Value * { + // Emit private VarDecl with copy init. + CGF.EmitVarDecl(*PrivateVD); + return CGF.GetAddrOfLocalVar(PrivateVD); }); assert(IsRegistered && "linear var already registered as private"); // Silence the warning about unused variable. (void)IsRegistered; + ++CurPrivate; } } } diff --git a/lib/Sema/SemaOpenMP.cpp b/lib/Sema/SemaOpenMP.cpp index da80837198..ddfb2d246e 100644 --- a/lib/Sema/SemaOpenMP.cpp +++ b/lib/Sema/SemaOpenMP.cpp @@ -715,7 +715,7 @@ void Sema::EndOpenMPDSABlock(Stmt *CurDirective) { continue; } auto *VD = cast(cast(DE)->getDecl()); - QualType Type = VD->getType(); + QualType Type = VD->getType().getNonReferenceType(); auto DVar = DSAStack->getTopDSA(VD, false); if (DVar.CKind == OMPC_lastprivate) { // Generate helper private variable and initialize it with the @@ -5363,16 +5363,7 @@ OMPClause *Sema::ActOnOpenMPPrivateClause(ArrayRef VarList, diag::err_omp_private_incomplete_type)) { continue; } - if (Type->isReferenceType()) { - Diag(ELoc, diag::err_omp_clause_ref_type_arg) - << getOpenMPClauseName(OMPC_private) << Type; - bool IsDecl = - VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; - Diag(VD->getLocation(), - IsDecl ? diag::note_previous_decl : diag::note_defined_here) - << VD; - continue; - } + Type = Type.getNonReferenceType(); // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced // in a Construct] @@ -5507,23 +5498,7 @@ OMPClause *Sema::ActOnOpenMPFirstprivateClause(ArrayRef VarList, diag::err_omp_firstprivate_incomplete_type)) { continue; } - if (Type->isReferenceType()) { - if (IsImplicitClause) { - Diag(ImplicitClauseLoc, - diag::err_omp_task_predetermined_firstprivate_ref_type_arg) - << Type; - Diag(RefExpr->getExprLoc(), diag::note_used_here); - } else { - Diag(ELoc, diag::err_omp_clause_ref_type_arg) - << getOpenMPClauseName(OMPC_firstprivate) << Type; - } - bool IsDecl = - VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; - Diag(VD->getLocation(), - IsDecl ? diag::note_previous_decl : diag::note_defined_here) - << VD; - continue; - } + Type = Type.getNonReferenceType(); // OpenMP [2.9.3.4, Restrictions, C/C++, p.1] // A variable of class type (or array thereof) that appears in a private @@ -5741,16 +5716,7 @@ OMPClause *Sema::ActOnOpenMPLastprivateClause(ArrayRef VarList, diag::err_omp_lastprivate_incomplete_type)) { continue; } - if (Type->isReferenceType()) { - Diag(ELoc, diag::err_omp_clause_ref_type_arg) - << getOpenMPClauseName(OMPC_lastprivate) << Type; - bool IsDecl = - VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; - Diag(VD->getLocation(), - IsDecl ? diag::note_previous_decl : diag::note_defined_here) - << VD; - continue; - } + Type = Type.getNonReferenceType(); // OpenMP [2.14.1.1, Data-sharing Attribute Rules for Variables Referenced // in a Construct] @@ -6353,12 +6319,14 @@ OMPClause *Sema::ActOnOpenMPLinearClause(ArrayRef VarList, Expr *Step, SourceLocation ColonLoc, SourceLocation EndLoc) { SmallVector Vars; + SmallVector Privates; SmallVector Inits; for (auto &RefExpr : VarList) { assert(RefExpr && "NULL expr in OpenMP linear clause."); if (isa(RefExpr)) { // It will be analyzed later. Vars.push_back(RefExpr); + Privates.push_back(nullptr); Inits.push_back(nullptr); continue; } @@ -6401,6 +6369,7 @@ OMPClause *Sema::ActOnOpenMPLinearClause(ArrayRef VarList, Expr *Step, if (QType->isDependentType() || QType->isInstantiationDependentType()) { // It will be analyzed later. Vars.push_back(DE); + Privates.push_back(nullptr); Inits.push_back(nullptr); continue; } @@ -6410,16 +6379,7 @@ OMPClause *Sema::ActOnOpenMPLinearClause(ArrayRef VarList, Expr *Step, diag::err_omp_linear_incomplete_type)) { continue; } - if (QType->isReferenceType()) { - Diag(ELoc, diag::err_omp_clause_ref_type_arg) - << getOpenMPClauseName(OMPC_linear) << QType; - bool IsDecl = - VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; - Diag(VD->getLocation(), - IsDecl ? diag::note_previous_decl : diag::note_defined_here) - << VD; - continue; - } + QType = QType.getNonReferenceType(); // A list item must not be const-qualified. if (QType.isConstant(Context)) { @@ -6447,6 +6407,10 @@ OMPClause *Sema::ActOnOpenMPLinearClause(ArrayRef VarList, Expr *Step, continue; } + // Build private copy of original var. + auto *Private = buildVarDecl(*this, ELoc, QType, VD->getName()); + auto *PrivateRef = buildDeclRefExpr( + *this, Private, DE->getType().getUnqualifiedType(), DE->getExprLoc()); // Build var to save initial value. VarDecl *Init = buildVarDecl(*this, ELoc, QType, ".linear.start"); AddInitializerToDecl(Init, DefaultLvalueConversion(DE).get(), @@ -6455,6 +6419,7 @@ OMPClause *Sema::ActOnOpenMPLinearClause(ArrayRef VarList, Expr *Step, *this, Init, DE->getType().getUnqualifiedType(), DE->getExprLoc()); DSAStack->addDSA(VD, DE, OMPC_linear); Vars.push_back(DE); + Privates.push_back(PrivateRef); Inits.push_back(InitRef); } @@ -6495,7 +6460,7 @@ OMPClause *Sema::ActOnOpenMPLinearClause(ArrayRef VarList, Expr *Step, } return OMPLinearClause::Create(Context, StartLoc, LParenLoc, ColonLoc, EndLoc, - Vars, Inits, StepExpr, CalcStepExpr); + Vars, Privates, Inits, StepExpr, CalcStepExpr); } static bool FinishOpenMPLinearClause(OMPLinearClause &Clause, DeclRefExpr *IV, @@ -6514,25 +6479,26 @@ static bool FinishOpenMPLinearClause(OMPLinearClause &Clause, DeclRefExpr *IV, Step = cast(CalcStep)->getLHS(); bool HasErrors = false; auto CurInit = Clause.inits().begin(); + auto CurPrivate = Clause.privates().begin(); for (auto &RefExpr : Clause.varlists()) { Expr *InitExpr = *CurInit; // Build privatized reference to the current linear var. auto DE = cast(RefExpr); - auto PrivateRef = + auto CapturedRef = buildDeclRefExpr(SemaRef, cast(DE->getDecl()), DE->getType().getUnqualifiedType(), DE->getExprLoc(), /*RefersToCapture=*/true); // Build update: Var = InitExpr + IV * Step ExprResult Update = - BuildCounterUpdate(SemaRef, S, RefExpr->getExprLoc(), PrivateRef, + BuildCounterUpdate(SemaRef, S, RefExpr->getExprLoc(), *CurPrivate, InitExpr, IV, Step, /* Subtract */ false); Update = SemaRef.ActOnFinishFullExpr(Update.get()); // Build final: Var = InitExpr + NumIterations * Step ExprResult Final = - BuildCounterUpdate(SemaRef, S, RefExpr->getExprLoc(), PrivateRef, + BuildCounterUpdate(SemaRef, S, RefExpr->getExprLoc(), CapturedRef, InitExpr, NumIterations, Step, /* Subtract */ false); Final = SemaRef.ActOnFinishFullExpr(Final.get()); if (!Update.isUsable() || !Final.isUsable()) { @@ -6543,7 +6509,7 @@ static bool FinishOpenMPLinearClause(OMPLinearClause &Clause, DeclRefExpr *IV, Updates.push_back(Update.get()); Finals.push_back(Final.get()); } - ++CurInit; + ++CurInit, ++CurPrivate; } Clause.setUpdates(Updates); Clause.setFinals(Finals); @@ -6802,7 +6768,8 @@ OMPClause *Sema::ActOnOpenMPCopyprivateClause(ArrayRef VarList, // A variable of class type (or array thereof) that appears in a // copyin clause requires an accessible, unambiguous copy assignment // operator for the class type. - Type = Context.getBaseElementType(Type).getUnqualifiedType(); + Type = Context.getBaseElementType(Type.getNonReferenceType()) + .getUnqualifiedType(); auto *SrcVD = buildVarDecl(*this, DE->getLocStart(), Type, ".copyprivate.src"); auto *PseudoSrcExpr = diff --git a/lib/Serialization/ASTReaderStmt.cpp b/lib/Serialization/ASTReaderStmt.cpp index 19b0bcfeac..a04f4e56e0 100644 --- a/lib/Serialization/ASTReaderStmt.cpp +++ b/lib/Serialization/ASTReaderStmt.cpp @@ -1977,6 +1977,10 @@ void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *C) { Vars.push_back(Reader->Reader.ReadSubExpr()); C->setVarRefs(Vars); Vars.clear(); + for (unsigned i = 0; i != NumVars; ++i) + Vars.push_back(Reader->Reader.ReadSubExpr()); + C->setPrivates(Vars); + Vars.clear(); for (unsigned i = 0; i != NumVars; ++i) Vars.push_back(Reader->Reader.ReadSubExpr()); C->setInits(Vars); diff --git a/lib/Serialization/ASTWriterStmt.cpp b/lib/Serialization/ASTWriterStmt.cpp index dabd1a436c..d9dc9e0e90 100644 --- a/lib/Serialization/ASTWriterStmt.cpp +++ b/lib/Serialization/ASTWriterStmt.cpp @@ -1854,6 +1854,9 @@ void OMPClauseWriter::VisitOMPLinearClause(OMPLinearClause *C) { for (auto *VE : C->varlists()) { Writer->Writer.AddStmt(VE); } + for (auto *VE : C->privates()) { + Writer->Writer.AddStmt(VE); + } for (auto *VE : C->inits()) { Writer->Writer.AddStmt(VE); } diff --git a/test/OpenMP/for_codegen.cpp b/test/OpenMP/for_codegen.cpp index fc35a98c9e..824dfd585d 100644 --- a/test/OpenMP/for_codegen.cpp +++ b/test/OpenMP/for_codegen.cpp @@ -404,6 +404,10 @@ void for_with_global_lcv() { k = i; k = j; } + char &cnt = i; +#pragma omp for + for (cnt = 0; cnt < 2; ++cnt) + k = cnt; } // CHECK-LABEL: for_with_references diff --git a/test/OpenMP/for_firstprivate_codegen.cpp b/test/OpenMP/for_firstprivate_codegen.cpp index 0d5f83ed4e..91061dcc2b 100644 --- a/test/OpenMP/for_firstprivate_codegen.cpp +++ b/test/OpenMP/for_firstprivate_codegen.cpp @@ -38,7 +38,7 @@ T tmain() { T t_var = T(); T vec[] = {1, 2}; S s_arr[] = {1, 2}; - S var(3); + S &var = test; #pragma omp parallel #pragma omp for firstprivate(t_var, vec, s_arr, var) for (int i = 0; i < 2; ++i) { diff --git a/test/OpenMP/for_firstprivate_messages.cpp b/test/OpenMP/for_firstprivate_messages.cpp index 8caed3b722..a37bf46a94 100644 --- a/test/OpenMP/for_firstprivate_messages.cpp +++ b/test/OpenMP/for_firstprivate_messages.cpp @@ -65,7 +65,7 @@ int foomain(int argc, char **argv) { I e(4); C g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel #pragma omp for firstprivate // expected-error {{expected '(' after 'firstprivate'}} for (int k = 0; k < argc; ++k) @@ -126,7 +126,7 @@ int foomain(int argc, char **argv) { } #pragma omp parallel shared(i) #pragma omp parallel private(i) -#pragma omp for firstprivate(j) // expected-error {{arguments of OpenMP clause 'firstprivate' cannot be of reference type}} +#pragma omp for firstprivate(j) for (int k = 0; k < argc; ++k) ++k; #pragma omp parallel @@ -171,7 +171,7 @@ int main(int argc, char **argv) { S3 m; S6 n(2); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel #pragma omp for firstprivate // expected-error {{expected '(' after 'firstprivate'}} for (i = 0; i < argc; ++i) @@ -270,7 +270,7 @@ int main(int argc, char **argv) { for (i = 0; i < argc; ++i) foo(); #pragma omp parallel -#pragma omp for firstprivate(j) // expected-error {{arguments of OpenMP clause 'firstprivate' cannot be of reference type}} +#pragma omp for firstprivate(j) for (i = 0; i < argc; ++i) foo(); #pragma omp parallel diff --git a/test/OpenMP/for_lastprivate_codegen.cpp b/test/OpenMP/for_lastprivate_codegen.cpp index 880637ea8b..c025f90fe6 100644 --- a/test/OpenMP/for_lastprivate_codegen.cpp +++ b/test/OpenMP/for_lastprivate_codegen.cpp @@ -36,7 +36,7 @@ T tmain() { T t_var = T(); T vec[] = {1, 2}; S s_arr[] = {1, 2}; - S var(3); + S &var = test; #pragma omp parallel #pragma omp for lastprivate(t_var, vec, s_arr, var) for (int i = 0; i < 2; ++i) { diff --git a/test/OpenMP/for_lastprivate_messages.cpp b/test/OpenMP/for_lastprivate_messages.cpp index 63ee82c920..46e512c727 100644 --- a/test/OpenMP/for_lastprivate_messages.cpp +++ b/test/OpenMP/for_lastprivate_messages.cpp @@ -67,7 +67,7 @@ int foomain(int argc, char **argv) { I e(4); I g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel #pragma omp for lastprivate // expected-error {{expected '(' after 'lastprivate'}} for (int k = 0; k < argc; ++k) @@ -128,7 +128,7 @@ int foomain(int argc, char **argv) { } #pragma omp parallel shared(i) #pragma omp parallel private(i) -#pragma omp for lastprivate(j) // expected-error {{arguments of OpenMP clause 'lastprivate' cannot be of reference type}} +#pragma omp for lastprivate(j) for (int k = 0; k < argc; ++k) ++k; #pragma omp parallel @@ -161,7 +161,7 @@ int main(int argc, char **argv) { S3 m; S6 n(2); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel #pragma omp for lastprivate // expected-error {{expected '(' after 'lastprivate'}} for (i = 0; i < argc; ++i) @@ -268,7 +268,7 @@ int main(int argc, char **argv) { for (i = 0; i < argc; ++i) foo(); #pragma omp parallel -#pragma omp for lastprivate(j) // expected-error {{arguments of OpenMP clause 'lastprivate' cannot be of reference type}} +#pragma omp for lastprivate(j) for (i = 0; i < argc; ++i) foo(); #pragma omp parallel diff --git a/test/OpenMP/for_linear_codegen.cpp b/test/OpenMP/for_linear_codegen.cpp index 0bd573d5dc..8073273fee 100644 --- a/test/OpenMP/for_linear_codegen.cpp +++ b/test/OpenMP/for_linear_codegen.cpp @@ -33,7 +33,7 @@ template T tmain() { S test; T *pvar = &test.f; - T lvar = T(); + T &lvar = test.f; #pragma omp parallel #pragma omp for linear(pvar, lvar) for (int i = 0; i < 2; ++i) { diff --git a/test/OpenMP/for_linear_messages.cpp b/test/OpenMP/for_linear_messages.cpp index 7d8a3330e4..b06852e2ab 100644 --- a/test/OpenMP/for_linear_messages.cpp +++ b/test/OpenMP/for_linear_messages.cpp @@ -102,7 +102,7 @@ template int foomain(I argc, C **argv) { I e(4); I g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp for linear // expected-error {{expected '(' after 'linear'}} for (int k = 0; k < argc; ++k) ++k; #pragma omp for linear ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} @@ -138,7 +138,7 @@ template int foomain(I argc, C **argv) { #pragma omp for linear(v:i) for (int k = 0; k < argc; ++k) { i = k; v += i; } } - #pragma omp for linear(j) // expected-error {{arguments of OpenMP clause 'linear' cannot be of reference type}} + #pragma omp for linear(j) for (int k = 0; k < argc; ++k) ++k; int v = 0; #pragma omp for linear(v:j) @@ -166,7 +166,7 @@ int main(int argc, char **argv) { S4 e(4); // expected-note {{'e' defined here}} S5 g(5); // expected-note {{'g' defined here}} int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp for linear // expected-error {{expected '(' after 'linear'}} for (int k = 0; k < argc; ++k) ++k; #pragma omp for linear ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} @@ -203,7 +203,7 @@ int main(int argc, char **argv) { #pragma omp for linear(i : 4) for (int k = 0; k < argc; ++k) { ++k; i += 4; } } - #pragma omp for linear(j) // expected-error {{arguments of OpenMP clause 'linear' cannot be of reference type 'int &'}} + #pragma omp for linear(j) for (int k = 0; k < argc; ++k) ++k; #pragma omp for linear(i) for (int k = 0; k < argc; ++k) ++k; diff --git a/test/OpenMP/for_private_messages.cpp b/test/OpenMP/for_private_messages.cpp index 225a1beb99..97a875aa5d 100644 --- a/test/OpenMP/for_private_messages.cpp +++ b/test/OpenMP/for_private_messages.cpp @@ -47,7 +47,7 @@ int foomain(I argc, C **argv) { I e(4); I g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp for private // expected-error {{expected '(' after 'private'}} for (int k = 0; k < argc; ++k) ++k; @@ -99,7 +99,7 @@ int foomain(I argc, C **argv) { } #pragma omp parallel shared(i) #pragma omp parallel private(i) -#pragma omp for private(j) // expected-error {{arguments of OpenMP clause 'private' cannot be of reference type}} +#pragma omp for private(j) for (int k = 0; k < argc; ++k) ++k; #pragma omp for private(i) @@ -127,7 +127,7 @@ int main(int argc, char **argv) { S4 e(4); S5 g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp for private // expected-error {{expected '(' after 'private'}} for (int k = 0; k < argc; ++k) ++k; @@ -179,7 +179,7 @@ int main(int argc, char **argv) { } #pragma omp parallel shared(i) #pragma omp parallel private(i) -#pragma omp for private(j) // expected-error {{arguments of OpenMP clause 'private' cannot be of reference type}} +#pragma omp for private(j) for (int k = 0; k < argc; ++k) ++k; #pragma omp for private(i) diff --git a/test/OpenMP/for_simd_firstprivate_messages.cpp b/test/OpenMP/for_simd_firstprivate_messages.cpp index 6b49b11eaf..8f93e52cfb 100644 --- a/test/OpenMP/for_simd_firstprivate_messages.cpp +++ b/test/OpenMP/for_simd_firstprivate_messages.cpp @@ -65,7 +65,7 @@ int foomain(int argc, char **argv) { I e(4); C g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel #pragma omp for simd firstprivate // expected-error {{expected '(' after 'firstprivate'}} for (int k = 0; k < argc; ++k) @@ -130,7 +130,7 @@ int foomain(int argc, char **argv) { } #pragma omp parallel shared(i) #pragma omp parallel private(i) -#pragma omp for simd firstprivate(j) // expected-error {{arguments of OpenMP clause 'firstprivate' cannot be of reference type}} +#pragma omp for simd firstprivate(j) for (int k = 0; k < argc; ++k) ++k; #pragma omp parallel @@ -168,7 +168,7 @@ int main(int argc, char **argv) { S3 m; S6 n(2); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel #pragma omp for simd firstprivate // expected-error {{expected '(' after 'firstprivate'}} for (i = 0; i < argc; ++i) @@ -271,7 +271,7 @@ int main(int argc, char **argv) { for (i = 0; i < argc; ++i) foo(); #pragma omp parallel -#pragma omp for simd firstprivate(j) // expected-error {{arguments of OpenMP clause 'firstprivate' cannot be of reference type}} +#pragma omp for simd firstprivate(j) for (i = 0; i < argc; ++i) foo(); #pragma omp parallel diff --git a/test/OpenMP/for_simd_lastprivate_messages.cpp b/test/OpenMP/for_simd_lastprivate_messages.cpp index 2aa4dd1204..28ddc5e387 100644 --- a/test/OpenMP/for_simd_lastprivate_messages.cpp +++ b/test/OpenMP/for_simd_lastprivate_messages.cpp @@ -67,7 +67,7 @@ int foomain(int argc, char **argv) { I e(4); I g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel #pragma omp for simd lastprivate // expected-error {{expected '(' after 'lastprivate'}} for (int k = 0; k < argc; ++k) @@ -132,7 +132,7 @@ int foomain(int argc, char **argv) { } #pragma omp parallel shared(i) #pragma omp parallel private(i) -#pragma omp for simd lastprivate(j) // expected-error {{arguments of OpenMP clause 'lastprivate' cannot be of reference type}} +#pragma omp for simd lastprivate(j) for (int k = 0; k < argc; ++k) ++k; #pragma omp parallel @@ -158,7 +158,7 @@ int main(int argc, char **argv) { S3 m; S6 n(2); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel #pragma omp for simd lastprivate // expected-error {{expected '(' after 'lastprivate'}} for (i = 0; i < argc; ++i) @@ -261,7 +261,7 @@ int main(int argc, char **argv) { for (i = 0; i < argc; ++i) foo(); #pragma omp parallel -#pragma omp for simd lastprivate(j) // expected-error {{arguments of OpenMP clause 'lastprivate' cannot be of reference type}} +#pragma omp for simd lastprivate(j) for (i = 0; i < argc; ++i) foo(); #pragma omp parallel diff --git a/test/OpenMP/for_simd_linear_messages.cpp b/test/OpenMP/for_simd_linear_messages.cpp index 189c8b0be8..44370a1566 100644 --- a/test/OpenMP/for_simd_linear_messages.cpp +++ b/test/OpenMP/for_simd_linear_messages.cpp @@ -102,7 +102,7 @@ template int foomain(I argc, C **argv) { I e(4); I g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp for simd linear // expected-error {{expected '(' after 'linear'}} for (int k = 0; k < argc; ++k) ++k; #pragma omp for simd linear ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} @@ -138,7 +138,7 @@ template int foomain(I argc, C **argv) { #pragma omp for simd linear(v:i) for (int k = 0; k < argc; ++k) { i = k; v += i; } } - #pragma omp for simd linear(j) // expected-error {{arguments of OpenMP clause 'linear' cannot be of reference type}} + #pragma omp for simd linear(j) for (int k = 0; k < argc; ++k) ++k; int v = 0; #pragma omp for simd linear(v:j) @@ -166,7 +166,7 @@ int main(int argc, char **argv) { S4 e(4); // expected-note {{'e' defined here}} S5 g(5); // expected-note {{'g' defined here}} int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp for simd linear // expected-error {{expected '(' after 'linear'}} for (int k = 0; k < argc; ++k) ++k; #pragma omp for simd linear ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} @@ -203,7 +203,7 @@ int main(int argc, char **argv) { #pragma omp for simd linear(i : 4) for (int k = 0; k < argc; ++k) { ++k; i += 4; } } - #pragma omp for simd linear(j) // expected-error {{arguments of OpenMP clause 'linear' cannot be of reference type 'int &'}} + #pragma omp for simd linear(j) for (int k = 0; k < argc; ++k) ++k; #pragma omp for simd linear(i) for (int k = 0; k < argc; ++k) ++k; diff --git a/test/OpenMP/for_simd_private_messages.cpp b/test/OpenMP/for_simd_private_messages.cpp index 96885c859e..7751ac6131 100644 --- a/test/OpenMP/for_simd_private_messages.cpp +++ b/test/OpenMP/for_simd_private_messages.cpp @@ -47,7 +47,7 @@ int foomain(I argc, C **argv) { I e(4); I g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp for simd private // expected-error {{expected '(' after 'private'}} for (int k = 0; k < argc; ++k) ++k; @@ -99,7 +99,7 @@ int foomain(I argc, C **argv) { } #pragma omp parallel shared(i) #pragma omp parallel private(i) -#pragma omp for simd private(j) // expected-error {{arguments of OpenMP clause 'private' cannot be of reference type}} +#pragma omp for simd private(j) for (int k = 0; k < argc; ++k) ++k; #pragma omp for simd private(i) @@ -120,7 +120,7 @@ int main(int argc, char **argv) { S4 e(4); S5 g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp for simd private // expected-error {{expected '(' after 'private'}} for (int k = 0; k < argc; ++k) ++k; @@ -169,7 +169,7 @@ int main(int argc, char **argv) { } #pragma omp parallel shared(i) #pragma omp parallel private(i) -#pragma omp for simd private(j) // expected-error {{arguments of OpenMP clause 'private' cannot be of reference type}} +#pragma omp for simd private(j) for (int k = 0; k < argc; ++k) ++k; #pragma omp for simd private(i) diff --git a/test/OpenMP/parallel_firstprivate_messages.cpp b/test/OpenMP/parallel_firstprivate_messages.cpp index c6f8dbe138..c8b8e22a5b 100644 --- a/test/OpenMP/parallel_firstprivate_messages.cpp +++ b/test/OpenMP/parallel_firstprivate_messages.cpp @@ -61,7 +61,7 @@ int main(int argc, char **argv) { S4 e(4); S5 g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel firstprivate // expected-error {{expected '(' after 'firstprivate'}} #pragma omp parallel firstprivate ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} #pragma omp parallel firstprivate () // expected-error {{expected expression}} @@ -83,7 +83,7 @@ int main(int argc, char **argv) { foo(); #pragma omp parallel shared(i) #pragma omp parallel firstprivate(i) - #pragma omp parallel firstprivate(j) // expected-error {{arguments of OpenMP clause 'firstprivate' cannot be of reference type}} + #pragma omp parallel firstprivate(j) foo(); return 0; diff --git a/test/OpenMP/parallel_for_firstprivate_messages.cpp b/test/OpenMP/parallel_for_firstprivate_messages.cpp index 1a9b0593b8..eb8f658bd0 100644 --- a/test/OpenMP/parallel_for_firstprivate_messages.cpp +++ b/test/OpenMP/parallel_for_firstprivate_messages.cpp @@ -65,7 +65,7 @@ int foomain(int argc, char **argv) { I e(4); C g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel for firstprivate // expected-error {{expected '(' after 'firstprivate'}} for (int k = 0; k < argc; ++k) ++k; @@ -114,7 +114,7 @@ int foomain(int argc, char **argv) { } #pragma omp parallel shared(i) #pragma omp parallel private(i) -#pragma omp parallel for firstprivate(j) // expected-error {{arguments of OpenMP clause 'firstprivate' cannot be of reference type}} +#pragma omp parallel for firstprivate(j) for (int k = 0; k < argc; ++k) ++k; #pragma omp parallel for firstprivate(i) @@ -150,7 +150,7 @@ int main(int argc, char **argv) { S3 m; S6 n(2); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel for firstprivate // expected-error {{expected '(' after 'firstprivate'}} for (i = 0; i < argc; ++i) foo(); @@ -225,7 +225,7 @@ int main(int argc, char **argv) { #pragma omp parallel for firstprivate(xa) // OK: may be firstprivate for (i = 0; i < argc; ++i) foo(); -#pragma omp parallel for firstprivate(j) // expected-error {{arguments of OpenMP clause 'firstprivate' cannot be of reference type}} +#pragma omp parallel for firstprivate(j) for (i = 0; i < argc; ++i) foo(); #pragma omp parallel for lastprivate(g) firstprivate(g) // expected-error {{calling a private constructor of class 'S5'}} diff --git a/test/OpenMP/parallel_for_lastprivate_messages.cpp b/test/OpenMP/parallel_for_lastprivate_messages.cpp index cdc94964c9..d534d7b072 100644 --- a/test/OpenMP/parallel_for_lastprivate_messages.cpp +++ b/test/OpenMP/parallel_for_lastprivate_messages.cpp @@ -67,7 +67,7 @@ int foomain(int argc, char **argv) { I e(4); I g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel for lastprivate // expected-error {{expected '(' after 'lastprivate'}} for (int k = 0; k < argc; ++k) ++k; @@ -116,7 +116,7 @@ int foomain(int argc, char **argv) { } #pragma omp parallel shared(i) #pragma omp parallel private(i) -#pragma omp parallel for lastprivate(j) // expected-error {{arguments of OpenMP clause 'lastprivate' cannot be of reference type}} +#pragma omp parallel for lastprivate(j) for (int k = 0; k < argc; ++k) ++k; #pragma omp parallel for lastprivate(i) @@ -141,7 +141,7 @@ int main(int argc, char **argv) { S3 m; S6 n(2); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel for lastprivate // expected-error {{expected '(' after 'lastprivate'}} for (i = 0; i < argc; ++i) foo(); @@ -220,7 +220,7 @@ int main(int argc, char **argv) { #pragma omp parallel for lastprivate(xa) for (i = 0; i < argc; ++i) foo(); -#pragma omp parallel for lastprivate(j) // expected-error {{arguments of OpenMP clause 'lastprivate' cannot be of reference type}} +#pragma omp parallel for lastprivate(j) for (i = 0; i < argc; ++i) foo(); #pragma omp parallel for firstprivate(m) lastprivate(m) // expected-error {{'operator=' is a private member of 'S3'}} diff --git a/test/OpenMP/parallel_for_linear_messages.cpp b/test/OpenMP/parallel_for_linear_messages.cpp index 528fa27dca..7272aada92 100644 --- a/test/OpenMP/parallel_for_linear_messages.cpp +++ b/test/OpenMP/parallel_for_linear_messages.cpp @@ -118,7 +118,7 @@ int foomain(I argc, C **argv) { I e(4); I g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel for linear // expected-error {{expected '(' after 'linear'}} for (int k = 0; k < argc; ++k) ++k; @@ -170,7 +170,7 @@ int foomain(I argc, C **argv) { v += i; } } -#pragma omp parallel for linear(j) // expected-error {{arguments of OpenMP clause 'linear' cannot be of reference type}} +#pragma omp parallel for linear(j) for (int k = 0; k < argc; ++k) ++k; int v = 0; @@ -203,7 +203,7 @@ int main(int argc, char **argv) { S4 e(4); // expected-note {{'e' defined here}} S5 g(5); // expected-note {{'g' defined here}} int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel for linear // expected-error {{expected '(' after 'linear'}} for (int k = 0; k < argc; ++k) ++k; @@ -256,7 +256,7 @@ int main(int argc, char **argv) { i += 4; } } -#pragma omp parallel for linear(j) // expected-error {{arguments of OpenMP clause 'linear' cannot be of reference type 'int &'}} +#pragma omp parallel for linear(j) for (int k = 0; k < argc; ++k) ++k; #pragma omp parallel for linear(i) diff --git a/test/OpenMP/parallel_for_private_messages.cpp b/test/OpenMP/parallel_for_private_messages.cpp index 17344f62d7..b0c10ef0f6 100644 --- a/test/OpenMP/parallel_for_private_messages.cpp +++ b/test/OpenMP/parallel_for_private_messages.cpp @@ -47,7 +47,7 @@ int foomain(I argc, C **argv) { I e(4); I g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel for private // expected-error {{expected '(' after 'private'}} for (int k = 0; k < argc; ++k) ++k; @@ -99,7 +99,7 @@ int foomain(I argc, C **argv) { } #pragma omp parallel shared(i) #pragma omp parallel private(i) -#pragma omp parallel for private(j) // expected-error {{arguments of OpenMP clause 'private' cannot be of reference type}} +#pragma omp parallel for private(j) for (int k = 0; k < argc; ++k) ++k; #pragma omp parallel for private(i) @@ -120,7 +120,7 @@ int main(int argc, char **argv) { S4 e(4); S5 g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel for private // expected-error {{expected '(' after 'private'}} for (int k = 0; k < argc; ++k) ++k; @@ -169,7 +169,7 @@ int main(int argc, char **argv) { } #pragma omp parallel shared(i) #pragma omp parallel private(i) -#pragma omp parallel for private(j) // expected-error {{arguments of OpenMP clause 'private' cannot be of reference type}} +#pragma omp parallel for private(j) for (int k = 0; k < argc; ++k) ++k; #pragma omp parallel for private(i) diff --git a/test/OpenMP/parallel_for_simd_firstprivate_messages.cpp b/test/OpenMP/parallel_for_simd_firstprivate_messages.cpp index 2ff32246dc..232e97a048 100644 --- a/test/OpenMP/parallel_for_simd_firstprivate_messages.cpp +++ b/test/OpenMP/parallel_for_simd_firstprivate_messages.cpp @@ -65,7 +65,7 @@ int foomain(int argc, char **argv) { I e(4); C g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel for simd firstprivate // expected-error {{expected '(' after 'firstprivate'}} for (int k = 0; k < argc; ++k) ++k; @@ -116,7 +116,7 @@ int foomain(int argc, char **argv) { } #pragma omp parallel shared(i) #pragma omp parallel private(i) -#pragma omp parallel for simd firstprivate(j) // expected-error {{arguments of OpenMP clause 'firstprivate' cannot be of reference type}} +#pragma omp parallel for simd firstprivate(j) for (int k = 0; k < argc; ++k) ++k; #pragma omp parallel for simd firstprivate(i) @@ -152,7 +152,7 @@ int main(int argc, char **argv) { S3 m; S6 n(2); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel for simd firstprivate // expected-error {{expected '(' after 'firstprivate'}} for (i = 0; i < argc; ++i) foo(); @@ -226,7 +226,7 @@ int main(int argc, char **argv) { #pragma omp parallel for simd firstprivate(xa) // OK: may be firstprivate for (i = 0; i < argc; ++i) foo(); -#pragma omp parallel for simd firstprivate(j) // expected-error {{arguments of OpenMP clause 'firstprivate' cannot be of reference type}} +#pragma omp parallel for simd firstprivate(j) for (i = 0; i < argc; ++i) foo(); #pragma omp parallel for simd lastprivate(g) firstprivate(g) // expected-error {{calling a private constructor of class 'S5'}} diff --git a/test/OpenMP/parallel_for_simd_lastprivate_messages.cpp b/test/OpenMP/parallel_for_simd_lastprivate_messages.cpp index e85e28b3f1..0112be218f 100644 --- a/test/OpenMP/parallel_for_simd_lastprivate_messages.cpp +++ b/test/OpenMP/parallel_for_simd_lastprivate_messages.cpp @@ -66,7 +66,7 @@ int foomain(int argc, char **argv) { I e(4); I g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel for simd lastprivate // expected-error {{expected '(' after 'lastprivate'}} for (int k = 0; k < argc; ++k) ++k; @@ -118,7 +118,7 @@ int foomain(int argc, char **argv) { } #pragma omp parallel shared(i) #pragma omp parallel private(i) -#pragma omp parallel for simd lastprivate(j) // expected-error {{arguments of OpenMP clause 'lastprivate' cannot be of reference type}} +#pragma omp parallel for simd lastprivate(j) for (int k = 0; k < argc; ++k) ++k; #pragma omp parallel for simd lastprivate(i) @@ -143,7 +143,7 @@ int main(int argc, char **argv) { S3 m; S6 n(2); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel for simd lastprivate // expected-error {{expected '(' after 'lastprivate'}} for (i = 0; i < argc; ++i) foo(); @@ -222,7 +222,7 @@ int main(int argc, char **argv) { #pragma omp parallel for simd lastprivate(xa) for (i = 0; i < argc; ++i) foo(); -#pragma omp parallel for simd lastprivate(j) // expected-error {{arguments of OpenMP clause 'lastprivate' cannot be of reference type}} +#pragma omp parallel for simd lastprivate(j) for (i = 0; i < argc; ++i) foo(); #pragma omp parallel for simd firstprivate(m) lastprivate(m) // expected-error {{'operator=' is a private member of 'S3'}} diff --git a/test/OpenMP/parallel_for_simd_linear_messages.cpp b/test/OpenMP/parallel_for_simd_linear_messages.cpp index 55b0c3d7f9..858f53f467 100644 --- a/test/OpenMP/parallel_for_simd_linear_messages.cpp +++ b/test/OpenMP/parallel_for_simd_linear_messages.cpp @@ -102,7 +102,7 @@ template int foomain(I argc, C **argv) { I e(4); I g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel for simd linear // expected-error {{expected '(' after 'linear'}} for (int k = 0; k < argc; ++k) ++k; #pragma omp parallel for simd linear ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} @@ -138,7 +138,7 @@ template int foomain(I argc, C **argv) { #pragma omp parallel for simd linear(v:i) for (int k = 0; k < argc; ++k) { i = k; v += i; } } - #pragma omp parallel for simd linear(j) // expected-error {{arguments of OpenMP clause 'linear' cannot be of reference type}} + #pragma omp parallel for simd linear(j) for (int k = 0; k < argc; ++k) ++k; int v = 0; #pragma omp parallel for simd linear(v:j) @@ -166,7 +166,7 @@ int main(int argc, char **argv) { S4 e(4); // expected-note {{'e' defined here}} S5 g(5); // expected-note {{'g' defined here}} int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel for simd linear // expected-error {{expected '(' after 'linear'}} for (int k = 0; k < argc; ++k) ++k; #pragma omp parallel for simd linear ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} @@ -203,7 +203,7 @@ int main(int argc, char **argv) { #pragma omp parallel for simd linear(i : 4) for (int k = 0; k < argc; ++k) { ++k; i += 4; } } - #pragma omp parallel for simd linear(j) // expected-error {{arguments of OpenMP clause 'linear' cannot be of reference type 'int &'}} + #pragma omp parallel for simd linear(j) for (int k = 0; k < argc; ++k) ++k; #pragma omp parallel for simd linear(i) for (int k = 0; k < argc; ++k) ++k; diff --git a/test/OpenMP/parallel_for_simd_private_messages.cpp b/test/OpenMP/parallel_for_simd_private_messages.cpp index 130736a33a..13ddbdd057 100644 --- a/test/OpenMP/parallel_for_simd_private_messages.cpp +++ b/test/OpenMP/parallel_for_simd_private_messages.cpp @@ -47,7 +47,7 @@ int foomain(I argc, C **argv) { I e(4); I g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel for simd private // expected-error {{expected '(' after 'private'}} for (int k = 0; k < argc; ++k) ++k; @@ -99,7 +99,7 @@ int foomain(I argc, C **argv) { } #pragma omp parallel shared(i) #pragma omp parallel private(i) -#pragma omp parallel for simd private(j) // expected-error {{arguments of OpenMP clause 'private' cannot be of reference type}} +#pragma omp parallel for simd private(j) for (int k = 0; k < argc; ++k) ++k; #pragma omp parallel for simd private(i) @@ -120,7 +120,7 @@ int main(int argc, char **argv) { S4 e(4); S5 g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel for simd private // expected-error {{expected '(' after 'private'}} for (int k = 0; k < argc; ++k) ++k; @@ -169,7 +169,7 @@ int main(int argc, char **argv) { } #pragma omp parallel shared(i) #pragma omp parallel private(i) -#pragma omp parallel for simd private(j) // expected-error {{arguments of OpenMP clause 'private' cannot be of reference type}} +#pragma omp parallel for simd private(j) for (int k = 0; k < argc; ++k) ++k; #pragma omp parallel for simd private(i) diff --git a/test/OpenMP/parallel_private_messages.cpp b/test/OpenMP/parallel_private_messages.cpp index a637b5018f..d93ee04423 100644 --- a/test/OpenMP/parallel_private_messages.cpp +++ b/test/OpenMP/parallel_private_messages.cpp @@ -55,7 +55,7 @@ int main(int argc, char **argv) { S4 e(4); S5 g[] = {5, 6}; int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel private // expected-error {{expected '(' after 'private'}} #pragma omp parallel private ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} #pragma omp parallel private () // expected-error {{expected expression}} @@ -77,7 +77,7 @@ int main(int argc, char **argv) { #pragma omp parallel firstprivate(i) private(i) // expected-error {{firstprivate variable cannot be private}} expected-note {{defined as firstprivate}} foo(); #pragma omp parallel private(i) - #pragma omp parallel private(j) // expected-error {{arguments of OpenMP clause 'private' cannot be of reference type 'int &'}} + #pragma omp parallel private(j) foo(); #pragma omp parallel firstprivate(i) for (int k = 0; k < 10; ++k) { diff --git a/test/OpenMP/parallel_sections_firstprivate_messages.cpp b/test/OpenMP/parallel_sections_firstprivate_messages.cpp index 84d18596c9..3982d73ad7 100644 --- a/test/OpenMP/parallel_sections_firstprivate_messages.cpp +++ b/test/OpenMP/parallel_sections_firstprivate_messages.cpp @@ -65,7 +65,7 @@ int foomain(int argc, char **argv) { I e(4); C g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel sections firstprivate // expected-error {{expected '(' after 'firstprivate'}} { foo(); @@ -130,7 +130,7 @@ int foomain(int argc, char **argv) { } #pragma omp parallel shared(i) #pragma omp parallel private(i) -#pragma omp parallel sections firstprivate(j) // expected-error {{arguments of OpenMP clause 'firstprivate' cannot be of reference type}} +#pragma omp parallel sections firstprivate(j) { foo(); } @@ -171,7 +171,7 @@ int main(int argc, char **argv) { S3 m; S6 n(2); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel sections firstprivate // expected-error {{expected '(' after 'firstprivate'}} { foo(); @@ -266,7 +266,7 @@ int main(int argc, char **argv) { { foo(); } -#pragma omp parallel sections firstprivate(j) // expected-error {{arguments of OpenMP clause 'firstprivate' cannot be of reference type}} +#pragma omp parallel sections firstprivate(j) { foo(); } diff --git a/test/OpenMP/parallel_sections_lastprivate_messages.cpp b/test/OpenMP/parallel_sections_lastprivate_messages.cpp index 10cc36e5ea..c1cbef519f 100644 --- a/test/OpenMP/parallel_sections_lastprivate_messages.cpp +++ b/test/OpenMP/parallel_sections_lastprivate_messages.cpp @@ -66,7 +66,7 @@ int foomain(int argc, char **argv) { I e(4); I g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel sections lastprivate // expected-error {{expected '(' after 'lastprivate'}} { foo(); @@ -131,7 +131,7 @@ int foomain(int argc, char **argv) { } #pragma omp parallel shared(i) #pragma omp parallel private(i) -#pragma omp parallel sections lastprivate(j) // expected-error {{arguments of OpenMP clause 'lastprivate' cannot be of reference type}} +#pragma omp parallel sections lastprivate(j) { foo(); } @@ -158,7 +158,7 @@ int main(int argc, char **argv) { S3 m; S6 n(2); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel sections lastprivate // expected-error {{expected '(' after 'lastprivate'}} { foo(); @@ -262,7 +262,7 @@ int main(int argc, char **argv) { { foo(); } -#pragma omp parallel sections lastprivate(j) // expected-error {{arguments of OpenMP clause 'lastprivate' cannot be of reference type}} +#pragma omp parallel sections lastprivate(j) { foo(); } diff --git a/test/OpenMP/parallel_sections_private_messages.cpp b/test/OpenMP/parallel_sections_private_messages.cpp index d9c4404bd9..06472df14a 100644 --- a/test/OpenMP/parallel_sections_private_messages.cpp +++ b/test/OpenMP/parallel_sections_private_messages.cpp @@ -47,7 +47,7 @@ int foomain(I argc, C **argv) { I e(4); I g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel sections private // expected-error {{expected '(' after 'private'}} { foo(); @@ -112,7 +112,7 @@ int foomain(I argc, C **argv) { } #pragma omp parallel shared(i) #pragma omp parallel private(i) -#pragma omp parallel sections private(j) // expected-error {{arguments of OpenMP clause 'private' cannot be of reference type}} +#pragma omp parallel sections private(j) { foo(); } @@ -135,7 +135,7 @@ int main(int argc, char **argv) { S4 e(4); S5 g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel sections private // expected-error {{expected '(' after 'private'}} { foo(); @@ -198,7 +198,7 @@ int main(int argc, char **argv) { } #pragma omp parallel shared(i) #pragma omp parallel private(i) -#pragma omp parallel sections private(j) // expected-error {{arguments of OpenMP clause 'private' cannot be of reference type}} +#pragma omp parallel sections private(j) { foo(); } diff --git a/test/OpenMP/sections_firstprivate_messages.cpp b/test/OpenMP/sections_firstprivate_messages.cpp index ff7614967e..c744bfecc0 100644 --- a/test/OpenMP/sections_firstprivate_messages.cpp +++ b/test/OpenMP/sections_firstprivate_messages.cpp @@ -65,7 +65,7 @@ int foomain(int argc, char **argv) { I e(4); C g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel #pragma omp sections firstprivate // expected-error {{expected '(' after 'firstprivate'}} { @@ -143,7 +143,7 @@ int foomain(int argc, char **argv) { } #pragma omp parallel shared(i) #pragma omp parallel private(i) -#pragma omp sections firstprivate(j) // expected-error {{arguments of OpenMP clause 'firstprivate' cannot be of reference type}} +#pragma omp sections firstprivate(j) { foo(); } @@ -186,7 +186,7 @@ int main(int argc, char **argv) { S3 m; S6 n(2); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel #pragma omp sections firstprivate // expected-error {{expected '(' after 'firstprivate'}} { @@ -304,7 +304,7 @@ int main(int argc, char **argv) { foo(); } #pragma omp parallel -#pragma omp sections firstprivate(j) // expected-error {{arguments of OpenMP clause 'firstprivate' cannot be of reference type}} +#pragma omp sections firstprivate(j) { foo(); } diff --git a/test/OpenMP/sections_lastprivate_messages.cpp b/test/OpenMP/sections_lastprivate_messages.cpp index 870dd158ae..0f9cc2f73f 100644 --- a/test/OpenMP/sections_lastprivate_messages.cpp +++ b/test/OpenMP/sections_lastprivate_messages.cpp @@ -66,7 +66,7 @@ int foomain(int argc, char **argv) { I e(4); I g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel #pragma omp sections lastprivate // expected-error {{expected '(' after 'lastprivate'}} { @@ -144,7 +144,7 @@ int foomain(int argc, char **argv) { } #pragma omp parallel shared(i) #pragma omp parallel private(i) -#pragma omp sections lastprivate(j) // expected-error {{arguments of OpenMP clause 'lastprivate' cannot be of reference type}} +#pragma omp sections lastprivate(j) { foo(); } @@ -172,7 +172,7 @@ int main(int argc, char **argv) { S3 m; S6 n(2); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel #pragma omp sections lastprivate // expected-error {{expected '(' after 'lastprivate'}} { @@ -300,7 +300,7 @@ int main(int argc, char **argv) { foo(); } #pragma omp parallel -#pragma omp sections lastprivate(j) // expected-error {{arguments of OpenMP clause 'lastprivate' cannot be of reference type}} +#pragma omp sections lastprivate(j) { foo(); } diff --git a/test/OpenMP/sections_private_messages.cpp b/test/OpenMP/sections_private_messages.cpp index 7854b3d8bd..5628bbd048 100644 --- a/test/OpenMP/sections_private_messages.cpp +++ b/test/OpenMP/sections_private_messages.cpp @@ -47,7 +47,7 @@ int foomain(I argc, C **argv) { I e(4); I g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp sections private // expected-error {{expected '(' after 'private'}} { foo(); @@ -112,7 +112,7 @@ int foomain(I argc, C **argv) { } #pragma omp parallel shared(i) #pragma omp parallel private(i) -#pragma omp sections private(j) // expected-error {{arguments of OpenMP clause 'private' cannot be of reference type}} +#pragma omp sections private(j) { foo(); } @@ -135,7 +135,7 @@ int main(int argc, char **argv) { S4 e(4); S5 g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp sections private // expected-error {{expected '(' after 'private'}} { foo(); @@ -198,7 +198,7 @@ int main(int argc, char **argv) { } #pragma omp parallel shared(i) #pragma omp parallel private(i) -#pragma omp sections private(j) // expected-error {{arguments of OpenMP clause 'private' cannot be of reference type}} +#pragma omp sections private(j) { foo(); } diff --git a/test/OpenMP/simd_lastprivate_messages.cpp b/test/OpenMP/simd_lastprivate_messages.cpp index ca26db0d14..afa937da08 100644 --- a/test/OpenMP/simd_lastprivate_messages.cpp +++ b/test/OpenMP/simd_lastprivate_messages.cpp @@ -66,7 +66,7 @@ int foomain(I argc, C **argv) { I e(4); I g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp simd lastprivate // expected-error {{expected '(' after 'lastprivate'}} for (int k = 0; k < argc; ++k) ++k; @@ -118,7 +118,7 @@ int foomain(I argc, C **argv) { } #pragma omp parallel shared(i) #pragma omp parallel private(i) -#pragma omp simd lastprivate(j) // expected-error {{arguments of OpenMP clause 'lastprivate' cannot be of reference type}} +#pragma omp simd lastprivate(j) for (int k = 0; k < argc; ++k) ++k; #pragma omp simd lastprivate(i) @@ -134,7 +134,7 @@ int main(int argc, char **argv) { S5 g(5); S3 m; int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp simd lastprivate // expected-error {{expected '(' after 'lastprivate'}} for (i = 0; i < argc; ++i) foo(); @@ -210,7 +210,7 @@ int main(int argc, char **argv) { for (i = 0; i < argc; ++i) foo(); #pragma omp parallel -#pragma omp simd lastprivate(j) // expected-error {{arguments of OpenMP clause 'lastprivate' cannot be of reference type}} +#pragma omp simd lastprivate(j) for (i = 0; i < argc; ++i) foo(); return 0; diff --git a/test/OpenMP/simd_linear_messages.cpp b/test/OpenMP/simd_linear_messages.cpp index 6fac26290b..631dadfd7a 100644 --- a/test/OpenMP/simd_linear_messages.cpp +++ b/test/OpenMP/simd_linear_messages.cpp @@ -102,7 +102,7 @@ template int foomain(I argc, C **argv) { I e(4); I g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp simd linear // expected-error {{expected '(' after 'linear'}} for (int k = 0; k < argc; ++k) ++k; #pragma omp simd linear ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} @@ -138,7 +138,7 @@ template int foomain(I argc, C **argv) { #pragma omp simd linear(v:i) for (int k = 0; k < argc; ++k) { i = k; v += i; } } - #pragma omp simd linear(j) // expected-error {{arguments of OpenMP clause 'linear' cannot be of reference type}} + #pragma omp simd linear(j) for (int k = 0; k < argc; ++k) ++k; int v = 0; #pragma omp simd linear(v:j) @@ -167,7 +167,7 @@ int main(int argc, char **argv) { S4 e(4); // expected-note {{'e' defined here}} S5 g(5); // expected-note {{'g' defined here}} int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp simd linear(f) linear(f) // expected-error {{linear variable cannot be linear}} expected-note {{defined as linear}} for (int k = 0; k < argc; ++k) ++k; #pragma omp simd linear // expected-error {{expected '(' after 'linear'}} @@ -206,7 +206,7 @@ int main(int argc, char **argv) { #pragma omp simd linear(i : 4) for (int k = 0; k < argc; ++k) { ++k; i += 4; } } - #pragma omp simd linear(j) // expected-error {{arguments of OpenMP clause 'linear' cannot be of reference type 'int &'}} + #pragma omp simd linear(j) for (int k = 0; k < argc; ++k) ++k; #pragma omp simd linear(i) for (int k = 0; k < argc; ++k) ++k; diff --git a/test/OpenMP/simd_private_messages.cpp b/test/OpenMP/simd_private_messages.cpp index adef373b6a..3442d182ed 100644 --- a/test/OpenMP/simd_private_messages.cpp +++ b/test/OpenMP/simd_private_messages.cpp @@ -42,7 +42,7 @@ template int foomain(I argc, C **argv) { I e(4); I g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp simd private // expected-error {{expected '(' after 'private'}} for (int k = 0; k < argc; ++k) ++k; #pragma omp simd private ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} @@ -78,7 +78,7 @@ template int foomain(I argc, C **argv) { } #pragma omp parallel shared(i) #pragma omp parallel private(i) - #pragma omp simd private(j) // expected-error {{arguments of OpenMP clause 'private' cannot be of reference type}} + #pragma omp simd private(j) for (int k = 0; k < argc; ++k) ++k; #pragma omp simd private(i) for (int k = 0; k < argc; ++k) ++k; @@ -97,7 +97,7 @@ int main(int argc, char **argv) { S4 e(4); S5 g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp simd private // expected-error {{expected '(' after 'private'}} for (int k = 0; k < argc; ++k) ++k; #pragma omp simd private ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} @@ -132,7 +132,7 @@ int main(int argc, char **argv) { } #pragma omp parallel shared(i) #pragma omp parallel private(i) - #pragma omp simd private(j) // expected-error {{arguments of OpenMP clause 'private' cannot be of reference type}} + #pragma omp simd private(j) for (int k = 0; k < argc; ++k) ++k; #pragma omp simd private(i) for (int k = 0; k < argc; ++k) ++k; diff --git a/test/OpenMP/single_firstprivate_messages.cpp b/test/OpenMP/single_firstprivate_messages.cpp index 6f21a42208..104385e3f8 100644 --- a/test/OpenMP/single_firstprivate_messages.cpp +++ b/test/OpenMP/single_firstprivate_messages.cpp @@ -65,7 +65,7 @@ int foomain(int argc, char **argv) { I e(4); C g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel #pragma omp single firstprivate // expected-error {{expected '(' after 'firstprivate'}} foo(); @@ -115,7 +115,7 @@ int foomain(int argc, char **argv) { } #pragma omp parallel shared(i) #pragma omp parallel private(i) -#pragma omp single firstprivate(j) // expected-error {{arguments of OpenMP clause 'firstprivate' cannot be of reference type}} +#pragma omp single firstprivate(j) foo(); #pragma omp parallel #pragma omp single firstprivate(i) @@ -148,7 +148,7 @@ int main(int argc, char **argv) { S3 m; S6 n(2); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp parallel #pragma omp single firstprivate // expected-error {{expected '(' after 'firstprivate'}} foo(); @@ -220,7 +220,7 @@ int main(int argc, char **argv) { #pragma omp single firstprivate(xa) // OK: may be firstprivate foo(); #pragma omp parallel -#pragma omp single firstprivate(j) // expected-error {{arguments of OpenMP clause 'firstprivate' cannot be of reference type}} +#pragma omp single firstprivate(j) foo(); #pragma omp parallel #pragma omp single firstprivate(g) // expected-error {{calling a private constructor of class 'S5'}} diff --git a/test/OpenMP/single_private_messages.cpp b/test/OpenMP/single_private_messages.cpp index 0e04e0f5af..f389fa7606 100644 --- a/test/OpenMP/single_private_messages.cpp +++ b/test/OpenMP/single_private_messages.cpp @@ -47,7 +47,7 @@ int foomain(I argc, C **argv) { I e(4); I g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp single private // expected-error {{expected '(' after 'private'}} foo(); #pragma omp single private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} @@ -84,7 +84,7 @@ int foomain(I argc, C **argv) { } #pragma omp parallel shared(i) #pragma omp parallel private(i) -#pragma omp single private(j) // expected-error {{arguments of OpenMP clause 'private' cannot be of reference type}} +#pragma omp single private(j) foo(); #pragma omp single private(i) foo(); @@ -103,7 +103,7 @@ int main(int argc, char **argv) { S4 e(4); S5 g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp single private // expected-error {{expected '(' after 'private'}} foo(); #pragma omp single private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} @@ -138,7 +138,7 @@ int main(int argc, char **argv) { } #pragma omp parallel shared(i) #pragma omp parallel private(i) -#pragma omp single private(j) // expected-error {{arguments of OpenMP clause 'private' cannot be of reference type}} +#pragma omp single private(j) foo(); #pragma omp single private(i) foo(); diff --git a/test/OpenMP/task_firstprivate_messages.cpp b/test/OpenMP/task_firstprivate_messages.cpp index 0126d47c50..7b767ba84d 100644 --- a/test/OpenMP/task_firstprivate_messages.cpp +++ b/test/OpenMP/task_firstprivate_messages.cpp @@ -70,7 +70,7 @@ int main(int argc, char **argv) { S4 e(4); S5 g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp task firstprivate // expected-error {{expected '(' after 'firstprivate'}} #pragma omp task firstprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} #pragma omp task firstprivate() // expected-error {{expected expression}} @@ -92,7 +92,7 @@ int main(int argc, char **argv) { foo(); #pragma omp task shared(i) #pragma omp task firstprivate(i) -#pragma omp task firstprivate(j) // expected-error {{arguments of OpenMP clause 'firstprivate' cannot be of reference type}} +#pragma omp task firstprivate(j) foo(); return 0; diff --git a/test/OpenMP/task_messages.cpp b/test/OpenMP/task_messages.cpp index ec67998afd..64bf8a40f0 100644 --- a/test/OpenMP/task_messages.cpp +++ b/test/OpenMP/task_messages.cpp @@ -6,7 +6,7 @@ void foo() { #pragma omp task // expected-error {{unexpected OpenMP directive '#pragma omp task'}} class S { - S(const S &s) { a = s.a + 12; } // expected-note 6 {{implicitly declared private here}} + S(const S &s) { a = s.a + 12; } // expected-note 10 {{implicitly declared private here}} int a; public: @@ -29,7 +29,7 @@ public: template int foo() { T a; - T &b = a; // expected-note 4 {{'b' defined here}} + T &b = a; int r; S1 s1; // expected-error@+1 2 {{call to deleted constructor of 'S1'}} @@ -53,16 +53,11 @@ int foo() { #pragma omp task #pragma omp parallel ++a; -// expected-error@+2 {{predetermined as a firstprivate in a task construct variable cannot be of reference type 'int &'}} -// expected-error@+1 {{predetermined as a firstprivate in a task construct variable cannot be of reference type 'S &'}} +// expected-error@+2 {{calling a private constructor of class 'S'}} #pragma omp task - // expected-note@+1 2 {{used here}} ++b; -// expected-error@+2 {{predetermined as a firstprivate in a task construct variable cannot be of reference type 'int &'}} -// expected-error@+1 {{predetermined as a firstprivate in a task construct variable cannot be of reference type 'S &'}} #pragma omp task -// expected-error@+2 {{calling a private constructor of class 'S'}} -// expected-note@+1 2 {{used here}} +// expected-error@+1 2 {{calling a private constructor of class 'S'}} #pragma omp parallel shared(a, b) ++a, ++b; // expected-note@+1 3 {{defined as reduction}} @@ -120,9 +115,9 @@ int foo() { int main(int argc, char **argv) { int a; - int &b = a; // expected-note 2 {{'b' defined here}} + int &b = a; S sa; - S &sb = sa; // expected-note 2 {{'sb' defined here}} + S &sb = sa; int r; #pragma omp task { // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}} foo(); @@ -192,13 +187,9 @@ L2: #pragma omp task #pragma omp parallel ++a; -// expected-error@+1 {{predetermined as a firstprivate in a task construct variable cannot be of reference type 'int &'}} #pragma omp task - // expected-note@+1 {{used here}} ++b; -// expected-error@+1 {{predetermined as a firstprivate in a task construct variable cannot be of reference type 'int &'}} #pragma omp task -// expected-note@+1 {{used here}} #pragma omp parallel shared(a, b) ++a, ++b; #pragma omp task default(none) @@ -218,14 +209,11 @@ L2: #pragma omp task #pragma omp parallel ++sa; -// expected-error@+1 {{predetermined as a firstprivate in a task construct variable cannot be of reference type 'S &'}} +// expected-error@+2 {{calling a private constructor of class 'S'}} #pragma omp task - // expected-note@+1 {{used here}} ++sb; -// expected-error@+1 {{predetermined as a firstprivate in a task construct variable cannot be of reference type 'S &'}} +// expected-error@+2 2 {{calling a private constructor of class 'S'}} #pragma omp task -// expected-error@+2 {{calling a private constructor of class 'S'}} -// expected-note@+1 {{used here}} #pragma omp parallel shared(sa, sb) ++sa, ++sb; // expected-note@+1 2 {{defined as reduction}} diff --git a/test/OpenMP/task_private_messages.cpp b/test/OpenMP/task_private_messages.cpp index c2c1f519d0..5ad4f3be61 100644 --- a/test/OpenMP/task_private_messages.cpp +++ b/test/OpenMP/task_private_messages.cpp @@ -64,7 +64,7 @@ int main(int argc, char **argv) { S4 e(4); S5 g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp task private // expected-error {{expected '(' after 'private'}} #pragma omp task private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} #pragma omp task private() // expected-error {{expected expression}} @@ -86,7 +86,7 @@ int main(int argc, char **argv) { #pragma omp task firstprivate(i) private(i) // expected-error {{firstprivate variable cannot be private}} expected-note {{defined as firstprivate}} foo(); #pragma omp task private(i) -#pragma omp task private(j) // expected-error {{arguments of OpenMP clause 'private' cannot be of reference type 'int &'}} +#pragma omp task private(j) foo(); #pragma omp task firstprivate(i) for (int k = 0; k < 10; ++k) { diff --git a/test/OpenMP/teams_firstprivate_messages.cpp b/test/OpenMP/teams_firstprivate_messages.cpp index ac5197749b..d64e883bb6 100644 --- a/test/OpenMP/teams_firstprivate_messages.cpp +++ b/test/OpenMP/teams_firstprivate_messages.cpp @@ -63,7 +63,7 @@ int main(int argc, char **argv) { S4 e(4); S5 g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp target #pragma omp teams firstprivate // expected-error {{expected '(' after 'firstprivate'}} foo(); @@ -125,7 +125,7 @@ int main(int argc, char **argv) { #pragma omp teams firstprivate(i) foo(); #pragma omp target -#pragma omp teams firstprivate(j) // expected-error {{arguments of OpenMP clause 'firstprivate' cannot be of reference type}} +#pragma omp teams firstprivate(j) foo(); return 0; diff --git a/test/OpenMP/teams_private_messages.cpp b/test/OpenMP/teams_private_messages.cpp index f50060ff29..f7f27cbbaa 100644 --- a/test/OpenMP/teams_private_messages.cpp +++ b/test/OpenMP/teams_private_messages.cpp @@ -55,7 +55,7 @@ int main(int argc, char **argv) { S4 e(4); S5 g(5); int i; - int &j = i; // expected-note {{'j' defined here}} + int &j = i; #pragma omp target #pragma omp teams private // expected-error {{expected '(' after 'private'}} foo(); @@ -114,7 +114,7 @@ int main(int argc, char **argv) { #pragma omp teams private(i) foo(); #pragma omp target - #pragma omp teams private(j) // expected-error {{arguments of OpenMP clause 'private' cannot be of reference type 'int &'}} + #pragma omp teams private(j) foo(); #pragma omp target #pragma omp teams firstprivate(i) diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index 46125e3a52..e5e2730e68 100644 --- a/tools/libclang/CIndex.cpp +++ b/tools/libclang/CIndex.cpp @@ -2106,6 +2106,9 @@ void OMPClauseEnqueue::VisitOMPReductionClause(const OMPReductionClause *C) { } void OMPClauseEnqueue::VisitOMPLinearClause(const OMPLinearClause *C) { VisitOMPClauseList(C); + for (const auto *E : C->privates()) { + Visitor->AddStmt(E); + } for (const auto *E : C->inits()) { Visitor->AddStmt(E); } -- 2.50.1