Author: abataev Date: Thu Aug 6 07:30:57 2015 New Revision: 244209 URL: http://llvm.org/viewvc/llvm-project?rev=244209&view=rev Log: [OPENMP 4.1] Allow references in init expression for loop-based constructs.
OpenMP 4.1 allows to use variables with reference types in private clauses and, therefore, in init expressions of the cannonical loop forms. Modified: cfe/trunk/include/clang/AST/StmtOpenMP.h cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td cfe/trunk/lib/AST/Stmt.cpp cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp cfe/trunk/lib/Sema/SemaOpenMP.cpp cfe/trunk/lib/Serialization/ASTReaderStmt.cpp cfe/trunk/lib/Serialization/ASTWriterStmt.cpp cfe/trunk/test/OpenMP/for_codegen.cpp cfe/trunk/test/OpenMP/for_loop_messages.cpp cfe/trunk/test/OpenMP/for_simd_loop_messages.cpp cfe/trunk/test/OpenMP/parallel_for_loop_messages.cpp cfe/trunk/test/OpenMP/parallel_for_simd_loop_messages.cpp cfe/trunk/test/OpenMP/simd_loop_messages.cpp Modified: cfe/trunk/include/clang/AST/StmtOpenMP.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/StmtOpenMP.h?rev=244209&r1=244208&r2=244209&view=diff ============================================================================== --- cfe/trunk/include/clang/AST/StmtOpenMP.h (original) +++ cfe/trunk/include/clang/AST/StmtOpenMP.h Thu Aug 6 07:30:57 2015 @@ -311,11 +311,18 @@ class OMPLoopDirective : public OMPExecu return MutableArrayRef<Expr *>(Storage, CollapsedNum); } + /// \brief Get the private counters storage. + MutableArrayRef<Expr *> getPrivateCounters() { + Expr **Storage = reinterpret_cast<Expr **>(&*std::next( + child_begin(), getArraysOffset(getDirectiveKind()) + CollapsedNum)); + return MutableArrayRef<Expr *>(Storage, CollapsedNum); + } + /// \brief Get the updates storage. MutableArrayRef<Expr *> getUpdates() { Expr **Storage = reinterpret_cast<Expr **>( &*std::next(child_begin(), - getArraysOffset(getDirectiveKind()) + CollapsedNum)); + getArraysOffset(getDirectiveKind()) + 2 * CollapsedNum)); return MutableArrayRef<Expr *>(Storage, CollapsedNum); } @@ -323,7 +330,7 @@ class OMPLoopDirective : public OMPExecu MutableArrayRef<Expr *> getFinals() { Expr **Storage = reinterpret_cast<Expr **>( &*std::next(child_begin(), - getArraysOffset(getDirectiveKind()) + 2 * CollapsedNum)); + getArraysOffset(getDirectiveKind()) + 3 * CollapsedNum)); return MutableArrayRef<Expr *>(Storage, CollapsedNum); } @@ -358,7 +365,7 @@ protected: static unsigned numLoopChildren(unsigned CollapsedNum, OpenMPDirectiveKind Kind) { return getArraysOffset(Kind) + - 3 * CollapsedNum; // Counters, Updates and Finals + 4 * CollapsedNum; // Counters, PrivateCounters, Updates and Finals } void setIterationVariable(Expr *IV) { @@ -414,6 +421,7 @@ protected: *std::next(child_begin(), NextUpperBoundOffset) = NUB; } void setCounters(ArrayRef<Expr *> A); + void setPrivateCounters(ArrayRef<Expr *> A); void setUpdates(ArrayRef<Expr *> A); void setFinals(ArrayRef<Expr *> A); @@ -453,6 +461,8 @@ public: Expr *NUB; /// \brief Counters Loop counters. SmallVector<Expr *, 4> Counters; + /// \brief PrivateCounters Loop counters. + SmallVector<Expr *, 4> PrivateCounters; /// \brief Expressions for loop counters update for CodeGen. SmallVector<Expr *, 4> Updates; /// \brief Final loop counter values for GodeGen. @@ -484,10 +494,12 @@ public: NLB = nullptr; NUB = nullptr; Counters.resize(Size); + PrivateCounters.resize(Size); Updates.resize(Size); Finals.resize(Size); for (unsigned i = 0; i < Size; ++i) { Counters[i] = nullptr; + PrivateCounters[i] = nullptr; Updates[i] = nullptr; Finals[i] = nullptr; } @@ -584,6 +596,12 @@ public: return const_cast<OMPLoopDirective *>(this)->getCounters(); } + ArrayRef<Expr *> private_counters() { return getPrivateCounters(); } + + ArrayRef<Expr *> private_counters() const { + return const_cast<OMPLoopDirective *>(this)->getPrivateCounters(); + } + ArrayRef<Expr *> updates() { return getUpdates(); } ArrayRef<Expr *> updates() const { Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=244209&r1=244208&r2=244209&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Thu Aug 6 07:30:57 2015 @@ -7545,8 +7545,8 @@ def err_omp_aligned_twice : Error< def err_omp_local_var_in_threadprivate_init : Error< "variable with local storage in initial value of threadprivate variable">; def err_omp_loop_not_canonical_init : Error< - "initialization clause of OpenMP for loop must be of the form " - "'var = init' or 'T var = init'">; + "initialization clause of OpenMP for loop is not in canonical form " + "('var = init' or 'T var = init')">; def ext_omp_loop_not_canonical_init : ExtWarn< "initialization clause of OpenMP for loop is not in canonical form " "('var = init' or 'T var = init')">, InGroup<OpenMPLoopForm>; Modified: cfe/trunk/lib/AST/Stmt.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Stmt.cpp?rev=244209&r1=244208&r2=244209&view=diff ============================================================================== --- cfe/trunk/lib/AST/Stmt.cpp (original) +++ cfe/trunk/lib/AST/Stmt.cpp Thu Aug 6 07:30:57 2015 @@ -1496,6 +1496,13 @@ void OMPLoopDirective::setCounters(Array std::copy(A.begin(), A.end(), getCounters().begin()); } +void OMPLoopDirective::setPrivateCounters(ArrayRef<Expr *> A) { + assert(A.size() == getCollapsedNumber() && "Number of loop private counters " + "is not the same as the collapsed " + "number"); + std::copy(A.begin(), A.end(), getPrivateCounters().begin()); +} + void OMPLoopDirective::setUpdates(ArrayRef<Expr *> A) { assert(A.size() == getCollapsedNumber() && "Number of counter updates is not the same as the collapsed number"); @@ -1661,6 +1668,7 @@ OMPSimdDirective::Create(const ASTContex Dir->setInit(Exprs.Init); Dir->setInc(Exprs.Inc); Dir->setCounters(Exprs.Counters); + Dir->setPrivateCounters(Exprs.PrivateCounters); Dir->setUpdates(Exprs.Updates); Dir->setFinals(Exprs.Finals); return Dir; @@ -1707,6 +1715,7 @@ OMPForDirective::Create(const ASTContext Dir->setNextLowerBound(Exprs.NLB); Dir->setNextUpperBound(Exprs.NUB); Dir->setCounters(Exprs.Counters); + Dir->setPrivateCounters(Exprs.PrivateCounters); Dir->setUpdates(Exprs.Updates); Dir->setFinals(Exprs.Finals); return Dir; @@ -1753,6 +1762,7 @@ OMPForSimdDirective::Create(const ASTCon Dir->setNextLowerBound(Exprs.NLB); Dir->setNextUpperBound(Exprs.NUB); Dir->setCounters(Exprs.Counters); + Dir->setPrivateCounters(Exprs.PrivateCounters); Dir->setUpdates(Exprs.Updates); Dir->setFinals(Exprs.Finals); return Dir; @@ -1908,6 +1918,7 @@ OMPParallelForDirective *OMPParallelForD Dir->setNextLowerBound(Exprs.NLB); Dir->setNextUpperBound(Exprs.NUB); Dir->setCounters(Exprs.Counters); + Dir->setPrivateCounters(Exprs.PrivateCounters); Dir->setUpdates(Exprs.Updates); Dir->setFinals(Exprs.Finals); return Dir; @@ -1952,6 +1963,7 @@ OMPParallelForSimdDirective *OMPParallel Dir->setNextLowerBound(Exprs.NLB); Dir->setNextUpperBound(Exprs.NUB); Dir->setCounters(Exprs.Counters); + Dir->setPrivateCounters(Exprs.PrivateCounters); Dir->setUpdates(Exprs.Updates); Dir->setFinals(Exprs.Finals); return Dir; Modified: cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp?rev=244209&r1=244208&r2=244209&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp (original) +++ cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp Thu Aug 6 07:30:57 2015 @@ -680,15 +680,22 @@ static void emitAlignedClause(CodeGenFun static void emitPrivateLoopCounters(CodeGenFunction &CGF, CodeGenFunction::OMPPrivateScope &LoopScope, - ArrayRef<Expr *> Counters) { + ArrayRef<Expr *> Counters, + ArrayRef<Expr *> PrivateCounters) { + auto I = PrivateCounters.begin(); for (auto *E : Counters) { - auto VD = cast<VarDecl>(cast<DeclRefExpr>(E)->getDecl()); - (void)LoopScope.addPrivate(VD, [&]() -> llvm::Value *{ + auto *VD = cast<VarDecl>(cast<DeclRefExpr>(E)->getDecl()); + auto *PrivateVD = cast<VarDecl>(cast<DeclRefExpr>(*I)->getDecl()); + llvm::Value *Addr; + (void)LoopScope.addPrivate(PrivateVD, [&]() -> llvm::Value * { // Emit var without initialization. - auto VarEmission = CGF.EmitAutoVarAlloca(*VD); + auto VarEmission = CGF.EmitAutoVarAlloca(*PrivateVD); CGF.EmitAutoVarCleanups(VarEmission); - return VarEmission.getAllocatedAddress(); + Addr = VarEmission.getAllocatedAddress(); + return Addr; }); + (void)LoopScope.addPrivate(VD, [&]() -> llvm::Value * { return Addr; }); + ++I; } } @@ -697,7 +704,8 @@ static void emitPreCond(CodeGenFunction llvm::BasicBlock *FalseBlock, uint64_t TrueCount) { { CodeGenFunction::OMPPrivateScope PreCondScope(CGF); - emitPrivateLoopCounters(CGF, PreCondScope, S.counters()); + emitPrivateLoopCounters(CGF, PreCondScope, S.counters(), + S.private_counters()); const VarDecl *IVDecl = cast<VarDecl>(cast<DeclRefExpr>(S.getIterationVariable())->getDecl()); bool IsRegistered = PreCondScope.addPrivate(IVDecl, [&]() -> llvm::Value *{ @@ -835,7 +843,8 @@ void CodeGenFunction::EmitOMPSimdDirecti bool HasLastprivateClause; { OMPPrivateScope LoopScope(CGF); - emitPrivateLoopCounters(CGF, LoopScope, S.counters()); + emitPrivateLoopCounters(CGF, LoopScope, S.counters(), + S.private_counters()); emitPrivateLinearVars(CGF, S, LoopScope); CGF.EmitOMPPrivateClause(S, LoopScope); CGF.EmitOMPReductionClauseInit(S, LoopScope); @@ -1124,7 +1133,8 @@ bool CodeGenFunction::EmitOMPWorksharing EmitOMPPrivateClause(S, LoopScope); HasLastprivateClause = EmitOMPLastprivateClauseInit(S, LoopScope); EmitOMPReductionClauseInit(S, LoopScope); - emitPrivateLoopCounters(*this, LoopScope, S.counters()); + emitPrivateLoopCounters(*this, LoopScope, S.counters(), + S.private_counters()); emitPrivateLinearVars(*this, S, LoopScope); (void)LoopScope.Privatize(); Modified: cfe/trunk/lib/Sema/SemaOpenMP.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOpenMP.cpp?rev=244209&r1=244208&r2=244209&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaOpenMP.cpp (original) +++ cfe/trunk/lib/Sema/SemaOpenMP.cpp Thu Aug 6 07:30:57 2015 @@ -2251,6 +2251,9 @@ public: Expr *BuildPreCond(Scope *S, Expr *Cond) const; /// \brief Build reference expression to the counter be used for codegen. Expr *BuildCounterVar() const; + /// \brief Build reference expression to the private counter be used for + /// codegen. + Expr *BuildPrivateCounterVar() const; /// \brief Build initization of the counter be used for codegen. Expr *BuildCounterInit() const; /// \brief Build step of the counter be used for codegen. @@ -2414,7 +2417,7 @@ bool OpenMPIterationSpaceChecker::CheckI } else if (auto DS = dyn_cast<DeclStmt>(S)) { if (DS->isSingleDecl()) { if (auto Var = dyn_cast_or_null<VarDecl>(DS->getSingleDecl())) { - if (Var->hasInit()) { + if (Var->hasInit() && !Var->getType()->isReferenceType()) { // Accept non-canonical init form here but emit ext. warning. if (Var->getInitStyle() != VarDecl::CInit && EmitDiags) SemaRef.Diag(S->getLocStart(), @@ -2699,7 +2702,19 @@ Expr *OpenMPIterationSpaceChecker::Build /// \brief Build reference expression to the counter be used for codegen. Expr *OpenMPIterationSpaceChecker::BuildCounterVar() const { - return buildDeclRefExpr(SemaRef, Var, Var->getType(), DefaultLoc); + return buildDeclRefExpr(SemaRef, Var, Var->getType().getNonReferenceType(), + DefaultLoc); +} + +Expr *OpenMPIterationSpaceChecker::BuildPrivateCounterVar() const { + if (Var && !Var->isInvalidDecl()) { + auto Type = Var->getType().getNonReferenceType(); + auto *PrivateVar = buildVarDecl(SemaRef, DefaultLoc, Type, Var->getName()); + if (PrivateVar->isInvalidDecl()) + return nullptr; + return buildDeclRefExpr(SemaRef, PrivateVar, Type, DefaultLoc); + } + return nullptr; } /// \brief Build initization of the counter be used for codegen. @@ -2717,6 +2732,8 @@ struct LoopIterationSpace { Expr *NumIterations; /// \brief The loop counter variable. Expr *CounterVar; + /// \brief Private loop counter variable. + Expr *PrivateCounterVar; /// \brief This is initializer for the initial value of #CounterVar. Expr *CounterInit; /// \brief This is step for the #CounterVar used to generate its update: @@ -2801,7 +2818,7 @@ static bool CheckOpenMPIterationSpace( // A variable of signed or unsigned integer type. // For C++, a variable of a random access iterator type. // For C, a variable of a pointer type. - auto VarType = Var->getType(); + auto VarType = Var->getType().getNonReferenceType(); if (!VarType->isDependentType() && !VarType->isIntegerType() && !VarType->isPointerType() && !(SemaRef.getLangOpts().CPlusPlus && VarType->isOverloadableType())) { @@ -2877,6 +2894,7 @@ static bool CheckOpenMPIterationSpace( ResultIterSpace.NumIterations = ISC.BuildNumIterations( DSA.getCurScope(), /* LimitedType */ isOpenMPWorksharingDirective(DKind)); ResultIterSpace.CounterVar = ISC.BuildCounterVar(); + ResultIterSpace.PrivateCounterVar = ISC.BuildPrivateCounterVar(); ResultIterSpace.CounterInit = ISC.BuildCounterInit(); ResultIterSpace.CounterStep = ISC.BuildCounterStep(); ResultIterSpace.InitSrcRange = ISC.GetInitSrcRange(); @@ -2887,6 +2905,7 @@ static bool CheckOpenMPIterationSpace( HasErrors |= (ResultIterSpace.PreCond == nullptr || ResultIterSpace.NumIterations == nullptr || ResultIterSpace.CounterVar == nullptr || + ResultIterSpace.PrivateCounterVar == nullptr || ResultIterSpace.CounterInit == nullptr || ResultIterSpace.CounterStep == nullptr); @@ -3286,6 +3305,7 @@ CheckOpenMPLoop(OpenMPDirectiveKind DKin } // Save results Built.Counters[Cnt] = IS.CounterVar; + Built.PrivateCounters[Cnt] = IS.PrivateCounterVar; Built.Updates[Cnt] = Update.get(); Built.Finals[Cnt] = Final.get(); } Modified: cfe/trunk/lib/Serialization/ASTReaderStmt.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderStmt.cpp?rev=244209&r1=244208&r2=244209&view=diff ============================================================================== --- cfe/trunk/lib/Serialization/ASTReaderStmt.cpp (original) +++ cfe/trunk/lib/Serialization/ASTReaderStmt.cpp Thu Aug 6 07:30:57 2015 @@ -2113,6 +2113,10 @@ void ASTStmtReader::VisitOMPLoopDirectiv Sub.clear(); for (unsigned i = 0; i < CollapsedNum; ++i) Sub.push_back(Reader.ReadSubExpr()); + D->setPrivateCounters(Sub); + Sub.clear(); + for (unsigned i = 0; i < CollapsedNum; ++i) + Sub.push_back(Reader.ReadSubExpr()); D->setUpdates(Sub); Sub.clear(); for (unsigned i = 0; i < CollapsedNum; ++i) Modified: cfe/trunk/lib/Serialization/ASTWriterStmt.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriterStmt.cpp?rev=244209&r1=244208&r2=244209&view=diff ============================================================================== --- cfe/trunk/lib/Serialization/ASTWriterStmt.cpp (original) +++ cfe/trunk/lib/Serialization/ASTWriterStmt.cpp Thu Aug 6 07:30:57 2015 @@ -1957,6 +1957,9 @@ void ASTStmtWriter::VisitOMPLoopDirectiv for (auto I : D->counters()) { Writer.AddStmt(I); } + for (auto I : D->private_counters()) { + Writer.AddStmt(I); + } for (auto I : D->updates()) { Writer.AddStmt(I); } Modified: cfe/trunk/test/OpenMP/for_codegen.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/for_codegen.cpp?rev=244209&r1=244208&r2=244209&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/for_codegen.cpp (original) +++ cfe/trunk/test/OpenMP/for_codegen.cpp Thu Aug 6 07:30:57 2015 @@ -411,6 +411,21 @@ void for_with_global_lcv() { } } +// CHECK-LABEL: for_with_references +void for_with_references() { +// CHECK: [[I:%.+]] = alloca i8, +// CHECK: [[CNT:%.+]] = alloca i8*, +// CHECK: [[CNT_PRIV:%.+]] = alloca i8, +// CHECK: call void @__kmpc_for_static_init_4( +// CHECK-NOT: load i8, i8* [[CNT]], +// CHECK: call void @__kmpc_for_static_fini( + char i = 0; + char &cnt = i; +#pragma omp for + for (cnt = 0; cnt < 2; ++cnt) + k = cnt; +} + struct Bool { Bool(bool b) : b(b) {} operator bool() const { return b; } Modified: cfe/trunk/test/OpenMP/for_loop_messages.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/for_loop_messages.cpp?rev=244209&r1=244208&r2=244209&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/for_loop_messages.cpp (original) +++ cfe/trunk/test/OpenMP/for_loop_messages.cpp Thu Aug 6 07:30:57 2015 @@ -66,37 +66,37 @@ int test_iteration_spaces() { c[(int)fi] = a[(int)fi] + b[(int)fi]; } #pragma omp parallel -// expected-error@+2 {{variable must be of integer or random access iterator type}} +// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp for for (int &ref = ii; ref < 10; ref++) { } #pragma omp parallel -// expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}} +// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp for for (int i; i < 10; i++) c[i] = a[i]; #pragma omp parallel -// expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}} +// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp for for (int i = 0, j = 0; i < 10; ++i) c[i] = a[i]; #pragma omp parallel -// expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}} +// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp for for (; ii < 10; ++ii) c[ii] = a[ii]; #pragma omp parallel // expected-warning@+3 {{expression result unused}} -// expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}} +// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp for for (ii + 1; ii < 10; ++ii) c[ii] = a[ii]; #pragma omp parallel -// expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}} +// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp for for (c[ii] = 0; ii < 10; ++ii) c[ii] = a[ii]; @@ -446,7 +446,7 @@ int test_with_random_access_iterator() { for (GoodIter I = begin; I < end; ++I) ++I; #pragma omp parallel -// expected-error@+2 {{variable must be of integer or random access iterator type}} +// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp for for (GoodIter &I = begin; I < end; ++I) ++I; @@ -485,7 +485,7 @@ int test_with_random_access_iterator() { for (begin = begin0; begin < end; ++begin) ++begin; #pragma omp parallel -// expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}} +// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp for for (++begin; begin < end; ++begin) ++begin; Modified: cfe/trunk/test/OpenMP/for_simd_loop_messages.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/for_simd_loop_messages.cpp?rev=244209&r1=244208&r2=244209&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/for_simd_loop_messages.cpp (original) +++ cfe/trunk/test/OpenMP/for_simd_loop_messages.cpp Thu Aug 6 07:30:57 2015 @@ -63,37 +63,37 @@ int test_iteration_spaces() { c[(int)fi] = a[(int)fi] + b[(int)fi]; } #pragma omp parallel -// expected-error@+2 {{variable must be of integer or random access iterator type}} +// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp for simd for (int &ref = ii; ref < 10; ref++) { } #pragma omp parallel -// expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}} +// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp for simd for (int i; i < 10; i++) c[i] = a[i]; #pragma omp parallel -// expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}} +// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp for simd for (int i = 0, j = 0; i < 10; ++i) c[i] = a[i]; #pragma omp parallel -// expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}} +// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp for simd for (; ii < 10; ++ii) c[ii] = a[ii]; #pragma omp parallel // expected-warning@+3 {{expression result unused}} -// expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}} +// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp for simd for (ii + 1; ii < 10; ++ii) c[ii] = a[ii]; #pragma omp parallel -// expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}} +// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp for simd for (c[ii] = 0; ii < 10; ++ii) c[ii] = a[ii]; @@ -430,7 +430,7 @@ int test_with_random_access_iterator() { for (GoodIter I = begin; I < end; ++I) ++I; #pragma omp parallel -// expected-error@+2 {{variable must be of integer or random access iterator type}} +// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp for simd for (GoodIter &I = begin; I < end; ++I) ++I; @@ -469,7 +469,7 @@ int test_with_random_access_iterator() { for (begin = begin0; begin < end; ++begin) ++begin; #pragma omp parallel -// expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}} +// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp for simd for (++begin; begin < end; ++begin) ++begin; Modified: cfe/trunk/test/OpenMP/parallel_for_loop_messages.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/parallel_for_loop_messages.cpp?rev=244209&r1=244208&r2=244209&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/parallel_for_loop_messages.cpp (original) +++ cfe/trunk/test/OpenMP/parallel_for_loop_messages.cpp Thu Aug 6 07:30:57 2015 @@ -54,32 +54,32 @@ int test_iteration_spaces() { for (double fi = 0; fi < 10.0; fi++) { c[(int)fi] = a[(int)fi] + b[(int)fi]; } -// expected-error@+2 {{variable must be of integer or random access iterator type}} +// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp parallel for for (int &ref = ii; ref < 10; ref++) { } -// expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}} +// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp parallel for for (int i; i < 10; i++) c[i] = a[i]; -// expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}} +// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp parallel for for (int i = 0, j = 0; i < 10; ++i) c[i] = a[i]; -// expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}} +// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp parallel for for (; ii < 10; ++ii) c[ii] = a[ii]; // expected-warning@+3 {{expression result unused}} -// expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}} +// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp parallel for for (ii + 1; ii < 10; ++ii) c[ii] = a[ii]; -// expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}} +// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp parallel for for (c[ii] = 0; ii < 10; ++ii) c[ii] = a[ii]; @@ -374,7 +374,7 @@ int test_with_random_access_iterator() { #pragma omp parallel for for (GoodIter I = begin; I < end; ++I) ++I; -// expected-error@+2 {{variable must be of integer or random access iterator type}} +// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp parallel for for (GoodIter &I = begin; I < end; ++I) ++I; @@ -405,7 +405,7 @@ int test_with_random_access_iterator() { #pragma omp parallel for for (begin = begin0; begin < end; ++begin) ++begin; -// expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}} +// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp parallel for for (++begin; begin < end; ++begin) ++begin; Modified: cfe/trunk/test/OpenMP/parallel_for_simd_loop_messages.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/parallel_for_simd_loop_messages.cpp?rev=244209&r1=244208&r2=244209&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/parallel_for_simd_loop_messages.cpp (original) +++ cfe/trunk/test/OpenMP/parallel_for_simd_loop_messages.cpp Thu Aug 6 07:30:57 2015 @@ -54,32 +54,32 @@ int test_iteration_spaces() { for (double fi = 0; fi < 10.0; fi++) { c[(int)fi] = a[(int)fi] + b[(int)fi]; } -// expected-error@+2 {{variable must be of integer or random access iterator type}} +// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp parallel for simd for (int &ref = ii; ref < 10; ref++) { } -// expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}} +// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp parallel for simd for (int i; i < 10; i++) c[i] = a[i]; -// expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}} +// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp parallel for simd for (int i = 0, j = 0; i < 10; ++i) c[i] = a[i]; -// expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}} +// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp parallel for simd for (; ii < 10; ++ii) c[ii] = a[ii]; // expected-warning@+3 {{expression result unused}} -// expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}} +// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp parallel for simd for (ii + 1; ii < 10; ++ii) c[ii] = a[ii]; -// expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}} +// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp parallel for simd for (c[ii] = 0; ii < 10; ++ii) c[ii] = a[ii]; @@ -375,7 +375,7 @@ int test_with_random_access_iterator() { #pragma omp parallel for simd for (GoodIter I = begin; I < end; ++I) ++I; -// expected-error@+2 {{variable must be of integer or random access iterator type}} +// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp parallel for simd for (GoodIter &I = begin; I < end; ++I) ++I; @@ -406,7 +406,7 @@ int test_with_random_access_iterator() { #pragma omp parallel for simd for (begin = begin0; begin < end; ++begin) ++begin; -// expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}} +// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp parallel for simd for (++begin; begin < end; ++begin) ++begin; Modified: cfe/trunk/test/OpenMP/simd_loop_messages.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/simd_loop_messages.cpp?rev=244209&r1=244208&r2=244209&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/simd_loop_messages.cpp (original) +++ cfe/trunk/test/OpenMP/simd_loop_messages.cpp Thu Aug 6 07:30:57 2015 @@ -45,32 +45,32 @@ int test_iteration_spaces() { for (double fi = 0; fi < 10.0; fi++) { c[(int)fi] = a[(int)fi] + b[(int)fi]; } - // expected-error@+2 {{variable must be of integer or random access iterator type}} + // expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp simd for (int &ref = ii; ref < 10; ref++) { } - // expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}} + // expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp simd for (int i; i < 10; i++) c[i] = a[i]; - // expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}} + // expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp simd for (int i = 0, j = 0; i < 10; ++i) c[i] = a[i]; - // expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}} + // expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp simd for (;ii < 10; ++ii) c[ii] = a[ii]; // expected-warning@+3 {{expression result unused}} - // expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}} + // expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp simd for (ii + 1;ii < 10; ++ii) c[ii] = a[ii]; - // expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}} + // expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp simd for (c[ii] = 0;ii < 10; ++ii) c[ii] = a[ii]; @@ -364,7 +364,7 @@ int test_with_random_access_iterator() { #pragma omp simd for (GoodIter I = begin; I < end; ++I) ++I; - // expected-error@+2 {{variable must be of integer or random access iterator type}} + // expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp simd for (GoodIter &I = begin; I < end; ++I) ++I; @@ -393,7 +393,7 @@ int test_with_random_access_iterator() { #pragma omp simd for (begin = GoodIter(1,2); begin < end; ++begin) ++begin; - // expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}} + // expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp simd for (++begin; begin < end; ++begin) ++begin; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits