summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/include/clang/AST/DataRecursiveASTVisitor.h3
-rw-r--r--clang/include/clang/AST/OpenMPClause.h41
-rw-r--r--clang/include/clang/AST/RecursiveASTVisitor.h3
-rw-r--r--clang/include/clang/Basic/DiagnosticSemaKinds.td2
-rw-r--r--clang/lib/AST/Stmt.cpp22
-rw-r--r--clang/lib/AST/StmtProfile.cpp3
-rw-r--r--clang/lib/CodeGen/CGStmtOpenMP.cpp15
-rw-r--r--clang/lib/Sema/SemaOpenMP.cpp75
-rw-r--r--clang/lib/Serialization/ASTReaderStmt.cpp4
-rw-r--r--clang/lib/Serialization/ASTWriterStmt.cpp3
-rw-r--r--clang/test/OpenMP/for_codegen.cpp4
-rw-r--r--clang/test/OpenMP/for_firstprivate_codegen.cpp2
-rw-r--r--clang/test/OpenMP/for_firstprivate_messages.cpp8
-rw-r--r--clang/test/OpenMP/for_lastprivate_codegen.cpp2
-rw-r--r--clang/test/OpenMP/for_lastprivate_messages.cpp8
-rw-r--r--clang/test/OpenMP/for_linear_codegen.cpp2
-rw-r--r--clang/test/OpenMP/for_linear_messages.cpp8
-rw-r--r--clang/test/OpenMP/for_private_messages.cpp8
-rw-r--r--clang/test/OpenMP/for_simd_firstprivate_messages.cpp8
-rw-r--r--clang/test/OpenMP/for_simd_lastprivate_messages.cpp8
-rw-r--r--clang/test/OpenMP/for_simd_linear_messages.cpp8
-rw-r--r--clang/test/OpenMP/for_simd_private_messages.cpp8
-rw-r--r--clang/test/OpenMP/parallel_firstprivate_messages.cpp4
-rw-r--r--clang/test/OpenMP/parallel_for_firstprivate_messages.cpp8
-rw-r--r--clang/test/OpenMP/parallel_for_lastprivate_messages.cpp8
-rw-r--r--clang/test/OpenMP/parallel_for_linear_messages.cpp8
-rw-r--r--clang/test/OpenMP/parallel_for_private_messages.cpp8
-rw-r--r--clang/test/OpenMP/parallel_for_simd_firstprivate_messages.cpp8
-rw-r--r--clang/test/OpenMP/parallel_for_simd_lastprivate_messages.cpp8
-rw-r--r--clang/test/OpenMP/parallel_for_simd_linear_messages.cpp8
-rw-r--r--clang/test/OpenMP/parallel_for_simd_private_messages.cpp8
-rw-r--r--clang/test/OpenMP/parallel_private_messages.cpp4
-rw-r--r--clang/test/OpenMP/parallel_sections_firstprivate_messages.cpp8
-rw-r--r--clang/test/OpenMP/parallel_sections_lastprivate_messages.cpp8
-rw-r--r--clang/test/OpenMP/parallel_sections_private_messages.cpp8
-rw-r--r--clang/test/OpenMP/sections_firstprivate_messages.cpp8
-rw-r--r--clang/test/OpenMP/sections_lastprivate_messages.cpp8
-rw-r--r--clang/test/OpenMP/sections_private_messages.cpp8
-rw-r--r--clang/test/OpenMP/simd_lastprivate_messages.cpp8
-rw-r--r--clang/test/OpenMP/simd_linear_messages.cpp8
-rw-r--r--clang/test/OpenMP/simd_private_messages.cpp8
-rw-r--r--clang/test/OpenMP/single_firstprivate_messages.cpp8
-rw-r--r--clang/test/OpenMP/single_private_messages.cpp8
-rw-r--r--clang/test/OpenMP/task_firstprivate_messages.cpp4
-rw-r--r--clang/test/OpenMP/task_messages.cpp28
-rw-r--r--clang/test/OpenMP/task_private_messages.cpp4
-rw-r--r--clang/test/OpenMP/teams_firstprivate_messages.cpp4
-rw-r--r--clang/test/OpenMP/teams_private_messages.cpp4
-rw-r--r--clang/tools/libclang/CIndex.cpp3
49 files changed, 230 insertions, 222 deletions
diff --git a/clang/include/clang/AST/DataRecursiveASTVisitor.h b/clang/include/clang/AST/DataRecursiveASTVisitor.h
index 997d0400c7a..5a6952f321d 100644
--- a/clang/include/clang/AST/DataRecursiveASTVisitor.h
+++ b/clang/include/clang/AST/DataRecursiveASTVisitor.h
@@ -2587,6 +2587,9 @@ bool RecursiveASTVisitor<Derived>::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/clang/include/clang/AST/OpenMPClause.h b/clang/include/clang/AST/OpenMPClause.h
index dc08db48fb5..866d6dfd127 100644
--- a/clang/include/clang/AST/OpenMPClause.h
+++ b/clang/include/clang/AST/OpenMPClause.h
@@ -1685,16 +1685,23 @@ class OMPLinearClause : public OMPVarListClause<OMPLinearClause> {
/// 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<Expr *> getInits() {
+ MutableArrayRef<Expr *> getPrivates() {
return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
}
- ArrayRef<const Expr *> getInits() const {
+ ArrayRef<const Expr *> getPrivates() const {
return llvm::makeArrayRef(varlist_end(), varlist_size());
}
+ MutableArrayRef<Expr *> getInits() {
+ return MutableArrayRef<Expr *>(getPrivates().end(), varlist_size());
+ }
+ ArrayRef<const Expr *> getInits() const {
+ return llvm::makeArrayRef(getPrivates().end(), varlist_size());
+ }
+
/// \brief Sets the list of update expressions for linear variables.
MutableArrayRef<Expr *> getUpdates() {
return MutableArrayRef<Expr *>(getInits().end(), varlist_size());
@@ -1711,6 +1718,10 @@ class OMPLinearClause : public OMPVarListClause<OMPLinearClause> {
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<Expr *> PL);
+
/// \brief Sets the list of the initial values for linear variables.
/// \param IL List of expressions.
void setInits(ArrayRef<Expr *> 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<Expr *> VL, ArrayRef<Expr *> IL,
- Expr *Step, Expr *CalcStep);
+ static OMPLinearClause *
+ Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
+ SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef<Expr *> VL,
+ ArrayRef<Expr *> PL, ArrayRef<Expr *> 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<Expr *> FL);
+ typedef MutableArrayRef<Expr *>::iterator privates_iterator;
+ typedef ArrayRef<const Expr *>::iterator privates_const_iterator;
+ typedef llvm::iterator_range<privates_iterator> privates_range;
+ typedef llvm::iterator_range<privates_const_iterator> 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<Expr *>::iterator inits_iterator;
typedef ArrayRef<const Expr *>::iterator inits_const_iterator;
typedef llvm::iterator_range<inits_iterator> inits_range;
diff --git a/clang/include/clang/AST/RecursiveASTVisitor.h b/clang/include/clang/AST/RecursiveASTVisitor.h
index b8ae8331fd5..61e61a9b7bd 100644
--- a/clang/include/clang/AST/RecursiveASTVisitor.h
+++ b/clang/include/clang/AST/RecursiveASTVisitor.h
@@ -2619,6 +2619,9 @@ bool RecursiveASTVisitor<Derived>::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/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 2d6545cfb67..e079de02092 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/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/clang/lib/AST/Stmt.cpp b/clang/lib/AST/Stmt.cpp
index 94e9c4dc603..175526a9313 100644
--- a/clang/lib/AST/Stmt.cpp
+++ b/clang/lib/AST/Stmt.cpp
@@ -1317,10 +1317,16 @@ OMPSharedClause *OMPSharedClause::CreateEmpty(const ASTContext &C,
return new (Mem) OMPSharedClause(N);
}
+void OMPLinearClause::setPrivates(ArrayRef<Expr *> 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<Expr *> 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<Expr *> UL) {
@@ -1335,19 +1341,19 @@ void OMPLinearClause::setFinals(ArrayRef<Expr *> FL) {
std::copy(FL.begin(), FL.end(), getUpdates().end());
}
-OMPLinearClause *
-OMPLinearClause::Create(const ASTContext &C, SourceLocation StartLoc,
- SourceLocation LParenLoc, SourceLocation ColonLoc,
- SourceLocation EndLoc, ArrayRef<Expr *> VL,
- ArrayRef<Expr *> IL, Expr *Step, Expr *CalcStep) {
+OMPLinearClause *OMPLinearClause::Create(
+ const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
+ SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef<Expr *> VL,
+ ArrayRef<Expr *> PL, ArrayRef<Expr *> 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<Expr *>()) +
- (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<Expr *>()) +
- (4 * NumVars + 2) * sizeof(Expr *));
+ (5 * NumVars + 2) * sizeof(Expr *));
return new (Mem) OMPLinearClause(NumVars);
}
diff --git a/clang/lib/AST/StmtProfile.cpp b/clang/lib/AST/StmtProfile.cpp
index fa1be8644b9..0318330abbd 100644
--- a/clang/lib/AST/StmtProfile.cpp
+++ b/clang/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/clang/lib/CodeGen/CGStmtOpenMP.cpp b/clang/lib/CodeGen/CGStmtOpenMP.cpp
index 1f1000beb44..ecf95c6d8ca 100644
--- a/clang/lib/CodeGen/CGStmtOpenMP.cpp
+++ b/clang/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<OMPLinearClause>(*I);
+ auto CurPrivate = C->privates().begin();
for (auto *E : C->varlists()) {
- auto VD = cast<VarDecl>(cast<DeclRefExpr>(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<VarDecl>(cast<DeclRefExpr>(E)->getDecl());
+ auto *PrivateVD =
+ cast<VarDecl>(cast<DeclRefExpr>(*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/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index da808371987..ddfb2d246e2 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -715,7 +715,7 @@ void Sema::EndOpenMPDSABlock(Stmt *CurDirective) {
continue;
}
auto *VD = cast<VarDecl>(cast<DeclRefExpr>(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<Expr *> 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<Expr *> 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<Expr *> 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<Expr *> VarList, Expr *Step,
SourceLocation ColonLoc,
SourceLocation EndLoc) {
SmallVector<Expr *, 8> Vars;
+ SmallVector<Expr *, 8> Privates;
SmallVector<Expr *, 8> Inits;
for (auto &RefExpr : VarList) {
assert(RefExpr && "NULL expr in OpenMP linear clause.");
if (isa<DependentScopeDeclRefExpr>(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<Expr *> 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<Expr *> 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<Expr *> 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<Expr *> 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<Expr *> 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<BinaryOperator>(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<DeclRefExpr>(RefExpr);
- auto PrivateRef =
+ auto CapturedRef =
buildDeclRefExpr(SemaRef, cast<VarDecl>(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<Expr *> 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/clang/lib/Serialization/ASTReaderStmt.cpp b/clang/lib/Serialization/ASTReaderStmt.cpp
index 19b0bcfeac4..a04f4e56e0b 100644
--- a/clang/lib/Serialization/ASTReaderStmt.cpp
+++ b/clang/lib/Serialization/ASTReaderStmt.cpp
@@ -1979,6 +1979,10 @@ void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *C) {
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);
Vars.clear();
for (unsigned i = 0; i != NumVars; ++i)
diff --git a/clang/lib/Serialization/ASTWriterStmt.cpp b/clang/lib/Serialization/ASTWriterStmt.cpp
index dabd1a436c8..d9dc9e0e904 100644
--- a/clang/lib/Serialization/ASTWriterStmt.cpp
+++ b/clang/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/clang/test/OpenMP/for_codegen.cpp b/clang/test/OpenMP/for_codegen.cpp
index fc35a98c9ed..824dfd585dc 100644
--- a/clang/test/OpenMP/for_codegen.cpp
+++ b/clang/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/clang/test/OpenMP/for_firstprivate_codegen.cpp b/clang/test/OpenMP/for_firstprivate_codegen.cpp
index 0d5f83ed4ec..91061dcc2b7 100644
--- a/clang/test/OpenMP/for_firstprivate_codegen.cpp
+++ b/clang/test/OpenMP/for_firstprivate_codegen.cpp
@@ -38,7 +38,7 @@ T tmain() {
T t_var = T();
T vec[] = {1, 2};
S<T> s_arr[] = {1, 2};
- S<T> var(3);
+ S<T> &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/clang/test/OpenMP/for_firstprivate_messages.cpp b/clang/test/OpenMP/for_firstprivate_messages.cpp
index 8caed3b722f..a37bf46a940 100644
--- a/clang/test/OpenMP/for_firstprivate_messages.cpp
+++ b/clang/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/clang/test/OpenMP/for_lastprivate_codegen.cpp b/clang/test/OpenMP/for_lastprivate_codegen.cpp
index 880637ea8b9..c025f90fe6a 100644
--- a/clang/test/OpenMP/for_lastprivate_codegen.cpp
+++ b/clang/test/OpenMP/for_lastprivate_codegen.cpp
@@ -36,7 +36,7 @@ T tmain() {
T t_var = T();
T vec[] = {1, 2};
S<T> s_arr[] = {1, 2};
- S<T> var(3);
+ S<T> &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/clang/test/OpenMP/for_lastprivate_messages.cpp b/clang/test/OpenMP/for_lastprivate_messages.cpp
index 63ee82c920c..46e512c7279 100644
--- a/clang/test/OpenMP/for_lastprivate_messages.cpp
+++ b/clang/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/clang/test/OpenMP/for_linear_codegen.cpp b/clang/test/OpenMP/for_linear_codegen.cpp
index 0bd573d5dc1..8073273feee 100644
--- a/clang/test/OpenMP/for_linear_codegen.cpp
+++ b/clang/test/OpenMP/for_linear_codegen.cpp
@@ -33,7 +33,7 @@ template <typename T>
T tmain() {
S<T> 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/clang/test/OpenMP/for_linear_messages.cpp b/clang/test/OpenMP/for_linear_messages.cpp
index 7d8a3330e47..b06852e2ab7 100644
--- a/clang/test/OpenMP/for_linear_messages.cpp
+++ b/clang/test/OpenMP/for_linear_messages.cpp
@@ -102,7 +102,7 @@ template<class I, class C> 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<class I, class C> 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/clang/test/OpenMP/for_private_messages.cpp b/clang/test/OpenMP/for_private_messages.cpp
index 225a1beb99e..97a875aa5d2 100644
--- a/clang/test/OpenMP/for_private_messages.cpp
+++ b/clang/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/clang/test/OpenMP/for_simd_firstprivate_messages.cpp b/clang/test/OpenMP/for_simd_firstprivate_messages.cpp
index 6b49b11eaff..8f93e52cfbd 100644
--- a/clang/test/OpenMP/for_simd_firstprivate_messages.cpp
+++ b/clang/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/clang/test/OpenMP/for_simd_lastprivate_messages.cpp b/clang/test/OpenMP/for_simd_lastprivate_messages.cpp
index 2aa4dd12045..28ddc5e387e 100644
--- a/clang/test/OpenMP/for_simd_lastprivate_messages.cpp
+++ b/clang/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/clang/test/OpenMP/for_simd_linear_messages.cpp b/clang/test/OpenMP/for_simd_linear_messages.cpp
index 189c8b0be88..44370a15664 100644
--- a/clang/test/OpenMP/for_simd_linear_messages.cpp
+++ b/clang/test/OpenMP/for_simd_linear_messages.cpp
@@ -102,7 +102,7 @@ template<class I, class C> 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<class I, class C> 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/clang/test/OpenMP/for_simd_private_messages.cpp b/clang/test/OpenMP/for_simd_private_messages.cpp
index 96885c859e9..7751ac61312 100644
--- a/clang/test/OpenMP/for_simd_private_messages.cpp
+++ b/clang/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/clang/test/OpenMP/parallel_firstprivate_messages.cpp b/clang/test/OpenMP/parallel_firstprivate_messages.cpp
index c6f8dbe138d..c8b8e22a5b8 100644
--- a/clang/test/OpenMP/parallel_firstprivate_messages.cpp
+++ b/clang/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/clang/test/OpenMP/parallel_for_firstprivate_messages.cpp b/clang/test/OpenMP/parallel_for_firstprivate_messages.cpp
index 1a9b0593b8d..eb8f658bd02 100644
--- a/clang/test/OpenMP/parallel_for_firstprivate_messages.cpp
+++ b/clang/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/clang/test/OpenMP/parallel_for_lastprivate_messages.cpp b/clang/test/OpenMP/parallel_for_lastprivate_messages.cpp
index cdc94964c95..d534d7b0721 100644
--- a/clang/test/OpenMP/parallel_for_lastprivate_messages.cpp
+++ b/clang/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/clang/test/OpenMP/parallel_for_linear_messages.cpp b/clang/test/OpenMP/parallel_for_linear_messages.cpp
index 528fa27dca3..7272aada92a 100644
--- a/clang/test/OpenMP/parallel_for_linear_messages.cpp
+++ b/clang/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/clang/test/OpenMP/parallel_for_private_messages.cpp b/clang/test/OpenMP/parallel_for_private_messages.cpp
index 17344f62d7f..b0c10ef0f6c 100644
--- a/clang/test/OpenMP/parallel_for_private_messages.cpp
+++ b/clang/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/clang/test/OpenMP/parallel_for_simd_firstprivate_messages.cpp b/clang/test/OpenMP/parallel_for_simd_firstprivate_messages.cpp
index 2ff32246dc1..232e97a048b 100644
--- a/clang/test/OpenMP/parallel_for_simd_firstprivate_messages.cpp
+++ b/clang/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/clang/test/OpenMP/parallel_for_simd_lastprivate_messages.cpp b/clang/test/OpenMP/parallel_for_simd_lastprivate_messages.cpp
index e85e28b3f18..0112be218f1 100644
--- a/clang/test/OpenMP/parallel_for_simd_lastprivate_messages.cpp
+++ b/clang/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/clang/test/OpenMP/parallel_for_simd_linear_messages.cpp b/clang/test/OpenMP/parallel_for_simd_linear_messages.cpp
index 55b0c3d7f9c..858f53f4674 100644
--- a/clang/test/OpenMP/parallel_for_simd_linear_messages.cpp
+++ b/clang/test/OpenMP/parallel_for_simd_linear_messages.cpp
@@ -102,7 +102,7 @@ template<class I, class C> 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<class I, class C> 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/clang/test/OpenMP/parallel_for_simd_private_messages.cpp b/clang/test/OpenMP/parallel_for_simd_private_messages.cpp
index 130736a33a0..13ddbdd0574 100644
--- a/clang/test/OpenMP/parallel_for_simd_private_messages.cpp
+++ b/clang/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/clang/test/OpenMP/parallel_private_messages.cpp b/clang/test/OpenMP/parallel_private_messages.cpp
index a637b5018f5..d93ee04423c 100644
--- a/clang/test/OpenMP/parallel_private_messages.cpp
+++ b/clang/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/clang/test/OpenMP/parallel_sections_firstprivate_messages.cpp b/clang/test/OpenMP/parallel_sections_firstprivate_messages.cpp
index 84d18596c99..3982d73ad7f 100644
--- a/clang/test/OpenMP/parallel_sections_firstprivate_messages.cpp
+++ b/clang/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/clang/test/OpenMP/parallel_sections_lastprivate_messages.cpp b/clang/test/OpenMP/parallel_sections_lastprivate_messages.cpp
index 10cc36e5ea7..c1cbef519f7 100644
--- a/clang/test/OpenMP/parallel_sections_lastprivate_messages.cpp
+++ b/clang/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/clang/test/OpenMP/parallel_sections_private_messages.cpp b/clang/test/OpenMP/parallel_sections_private_messages.cpp
index d9c4404bd98..06472df14a4 100644
--- a/clang/test/OpenMP/parallel_sections_private_messages.cpp
+++ b/clang/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/clang/test/OpenMP/sections_firstprivate_messages.cpp b/clang/test/OpenMP/sections_firstprivate_messages.cpp
index ff7614967ee..c744bfecc08 100644
--- a/clang/test/OpenMP/sections_firstprivate_messages.cpp
+++ b/clang/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/clang/test/OpenMP/sections_lastprivate_messages.cpp b/clang/test/OpenMP/sections_lastprivate_messages.cpp
index 870dd158aee..0f9cc2f73f5 100644
--- a/clang/test/OpenMP/sections_lastprivate_messages.cpp
+++ b/clang/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/clang/test/OpenMP/sections_private_messages.cpp b/clang/test/OpenMP/sections_private_messages.cpp
index 7854b3d8bdd..5628bbd048d 100644
--- a/clang/test/OpenMP/sections_private_messages.cpp
+++ b/clang/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/clang/test/OpenMP/simd_lastprivate_messages.cpp b/clang/test/OpenMP/simd_lastprivate_messages.cpp
index ca26db0d144..afa937da087 100644
--- a/clang/test/OpenMP/simd_lastprivate_messages.cpp
+++ b/clang/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/clang/test/OpenMP/simd_linear_messages.cpp b/clang/test/OpenMP/simd_linear_messages.cpp
index 6fac26290b4..631dadfd7af 100644
--- a/clang/test/OpenMP/simd_linear_messages.cpp
+++ b/clang/test/OpenMP/simd_linear_messages.cpp
@@ -102,7 +102,7 @@ template<class I, class C> 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<class I, class C> 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/clang/test/OpenMP/simd_private_messages.cpp b/clang/test/OpenMP/simd_private_messages.cpp
index adef373b6a4..3442d182ed0 100644
--- a/clang/test/OpenMP/simd_private_messages.cpp
+++ b/clang/test/OpenMP/simd_private_messages.cpp
@@ -42,7 +42,7 @@ template<class I, class C> 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<class I, class C> 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/clang/test/OpenMP/single_firstprivate_messages.cpp b/clang/test/OpenMP/single_firstprivate_messages.cpp
index 6f21a42208f..104385e3f8a 100644
--- a/clang/test/OpenMP/single_firstprivate_messages.cpp
+++ b/clang/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/clang/test/OpenMP/single_private_messages.cpp b/clang/test/OpenMP/single_private_messages.cpp
index 0e04e0f5aff..f389fa76060 100644
--- a/clang/test/OpenMP/single_private_messages.cpp
+++ b/clang/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/clang/test/OpenMP/task_firstprivate_messages.cpp b/clang/test/OpenMP/task_firstprivate_messages.cpp
index 0126d47c50f..7b767ba84de 100644
--- a/clang/test/OpenMP/task_firstprivate_messages.cpp
+++ b/clang/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/clang/test/OpenMP/task_messages.cpp b/clang/test/OpenMP/task_messages.cpp
index ec67998afdc..64bf8a40f02 100644
--- a/clang/test/OpenMP/task_messages.cpp
+++ b/clang/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 <class T>
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/clang/test/OpenMP/task_private_messages.cpp b/clang/test/OpenMP/task_private_messages.cpp
index c2c1f519d0c..5ad4f3be61e 100644
--- a/clang/test/OpenMP/task_private_messages.cpp
+++ b/clang/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/clang/test/OpenMP/teams_firstprivate_messages.cpp b/clang/test/OpenMP/teams_firstprivate_messages.cpp
index ac5197749bb..d64e883bb62 100644
--- a/clang/test/OpenMP/teams_firstprivate_messages.cpp
+++ b/clang/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/clang/test/OpenMP/teams_private_messages.cpp b/clang/test/OpenMP/teams_private_messages.cpp
index f50060ff29b..f7f27cbbaae 100644
--- a/clang/test/OpenMP/teams_private_messages.cpp
+++ b/clang/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/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp
index 46125e3a52b..e5e2730e68f 100644
--- a/clang/tools/libclang/CIndex.cpp
+++ b/clang/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);
}
OpenPOWER on IntegriCloud