forked from OSchip/llvm-project
[OPENMP50]Basic parsing/sema analysis for order(concurrent) clause.
Added parsing/sema/serialization support for order(concurrent) clause in loop|simd-based directives.
This commit is contained in:
parent
5c2e6207b7
commit
cb8e69148d
|
@ -6367,6 +6367,85 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
/// This represents 'order' clause in the '#pragma omp ...' directive.
|
||||
///
|
||||
/// \code
|
||||
/// #pragma omp simd order(concurrent)
|
||||
/// \endcode
|
||||
/// In this example directive '#pragma omp parallel' has simple 'order'
|
||||
/// clause with kind 'concurrent'.
|
||||
class OMPOrderClause final : public OMPClause {
|
||||
friend class OMPClauseReader;
|
||||
|
||||
/// Location of '('.
|
||||
SourceLocation LParenLoc;
|
||||
|
||||
/// A kind of the 'default' clause.
|
||||
OpenMPOrderClauseKind Kind = OMPC_ORDER_unknown;
|
||||
|
||||
/// Start location of the kind in source code.
|
||||
SourceLocation KindKwLoc;
|
||||
|
||||
/// Set kind of the clause.
|
||||
///
|
||||
/// \param K Argument of clause.
|
||||
void setKind(OpenMPOrderClauseKind K) { Kind = K; }
|
||||
|
||||
/// Set argument location.
|
||||
///
|
||||
/// \param KLoc Argument location.
|
||||
void setKindKwLoc(SourceLocation KLoc) { KindKwLoc = KLoc; }
|
||||
|
||||
public:
|
||||
/// Build 'order' clause with argument \p A ('concurrent').
|
||||
///
|
||||
/// \param A Argument of the clause ('concurrent').
|
||||
/// \param ALoc Starting location of the argument.
|
||||
/// \param StartLoc Starting location of the clause.
|
||||
/// \param LParenLoc Location of '('.
|
||||
/// \param EndLoc Ending location of the clause.
|
||||
OMPOrderClause(OpenMPOrderClauseKind A, SourceLocation ALoc,
|
||||
SourceLocation StartLoc, SourceLocation LParenLoc,
|
||||
SourceLocation EndLoc)
|
||||
: OMPClause(OMPC_order, StartLoc, EndLoc), LParenLoc(LParenLoc), Kind(A),
|
||||
KindKwLoc(ALoc) {}
|
||||
|
||||
/// Build an empty clause.
|
||||
OMPOrderClause()
|
||||
: OMPClause(OMPC_order, SourceLocation(), SourceLocation()) {}
|
||||
|
||||
/// Sets the location of '('.
|
||||
void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
|
||||
|
||||
/// Returns the location of '('.
|
||||
SourceLocation getLParenLoc() const { return LParenLoc; }
|
||||
|
||||
/// Returns kind of the clause.
|
||||
OpenMPOrderClauseKind getKind() const { return Kind; }
|
||||
|
||||
/// Returns location of clause kind.
|
||||
SourceLocation getKindKwLoc() const { return KindKwLoc; }
|
||||
|
||||
child_range children() {
|
||||
return child_range(child_iterator(), child_iterator());
|
||||
}
|
||||
|
||||
const_child_range children() const {
|
||||
return const_child_range(const_child_iterator(), const_child_iterator());
|
||||
}
|
||||
|
||||
child_range used_children() {
|
||||
return child_range(child_iterator(), child_iterator());
|
||||
}
|
||||
const_child_range used_children() const {
|
||||
return const_child_range(const_child_iterator(), const_child_iterator());
|
||||
}
|
||||
|
||||
static bool classof(const OMPClause *T) {
|
||||
return T->getClauseKind() == OMPC_order;
|
||||
}
|
||||
};
|
||||
|
||||
/// This class implements a simple visitor for OMPClause
|
||||
/// subclasses.
|
||||
template<class ImplClass, template <typename> class Ptr, typename RetTy>
|
||||
|
|
|
@ -3442,6 +3442,11 @@ bool RecursiveASTVisitor<Derived>::VisitOMPNontemporalClause(
|
|||
return true;
|
||||
}
|
||||
|
||||
template <typename Derived>
|
||||
bool RecursiveASTVisitor<Derived>::VisitOMPOrderClause(OMPOrderClause *) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// FIXME: look at the following tricky-seeming exprs to see if we
|
||||
// need to recurse on anything. These are ones that have methods
|
||||
// returning decls or qualtypes or nestednamespecifier -- though I'm
|
||||
|
|
|
@ -9714,7 +9714,7 @@ def err_omp_ordered_directive_with_param : Error<
|
|||
def err_omp_ordered_directive_without_param : Error<
|
||||
"'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter">;
|
||||
def note_omp_ordered_param : Note<
|
||||
"'ordered' clause with specified parameter">;
|
||||
"'ordered' clause%select{| with specified parameter}0">;
|
||||
def err_omp_expected_base_var_name : Error<
|
||||
"expected variable name as a base of the array %select{subscript|section}0">;
|
||||
def err_omp_map_shared_storage : Error<
|
||||
|
@ -9759,8 +9759,8 @@ def err_omp_unexpected_schedule_modifier : Error<
|
|||
"modifier '%0' cannot be used along with modifier '%1'">;
|
||||
def err_omp_schedule_nonmonotonic_static : Error<
|
||||
"'nonmonotonic' modifier can only be specified with 'dynamic' or 'guided' schedule kind">;
|
||||
def err_omp_schedule_nonmonotonic_ordered : Error<
|
||||
"'schedule' clause with 'nonmonotonic' modifier cannot be specified if an 'ordered' clause is specified">;
|
||||
def err_omp_simple_clause_incompatible_with_ordered : Error<
|
||||
"'%0' clause with '%1' modifier cannot be specified if an 'ordered' clause is specified">;
|
||||
def err_omp_ordered_simd : Error<
|
||||
"'ordered' clause with a parameter can not be specified in '#pragma omp %0' directive">;
|
||||
def err_omp_variable_in_given_clause_and_dsa : Error<
|
||||
|
|
|
@ -212,6 +212,9 @@
|
|||
#ifndef OPENMP_LASTPRIVATE_KIND
|
||||
#define OPENMP_LASTPRIVATE_KIND(Name)
|
||||
#endif
|
||||
#ifndef OPENMP_ORDER_KIND
|
||||
#define OPENMP_ORDER_KIND(Name)
|
||||
#endif
|
||||
|
||||
// OpenMP context selector sets.
|
||||
OPENMP_CONTEXT_SELECTOR_SET(implementation)
|
||||
|
@ -278,6 +281,7 @@ OPENMP_CLAUSE(dynamic_allocators, OMPDynamicAllocatorsClause)
|
|||
OPENMP_CLAUSE(atomic_default_mem_order, OMPAtomicDefaultMemOrderClause)
|
||||
OPENMP_CLAUSE(allocate, OMPAllocateClause)
|
||||
OPENMP_CLAUSE(nontemporal, OMPNontemporalClause)
|
||||
OPENMP_CLAUSE(order, OMPOrderClause)
|
||||
|
||||
// Clauses allowed for OpenMP directive 'parallel'.
|
||||
OPENMP_PARALLEL_CLAUSE(if)
|
||||
|
@ -303,6 +307,7 @@ OPENMP_SIMD_CLAUSE(reduction)
|
|||
OPENMP_SIMD_CLAUSE(allocate)
|
||||
OPENMP_SIMD_CLAUSE(if)
|
||||
OPENMP_SIMD_CLAUSE(nontemporal)
|
||||
OPENMP_SIMD_CLAUSE(order)
|
||||
|
||||
// Clauses allowed for directive 'omp for'.
|
||||
OPENMP_FOR_CLAUSE(private)
|
||||
|
@ -315,6 +320,7 @@ OPENMP_FOR_CLAUSE(ordered)
|
|||
OPENMP_FOR_CLAUSE(nowait)
|
||||
OPENMP_FOR_CLAUSE(linear)
|
||||
OPENMP_FOR_CLAUSE(allocate)
|
||||
OPENMP_FOR_CLAUSE(order)
|
||||
|
||||
// Clauses allowed for directive 'omp for simd'.
|
||||
OPENMP_FOR_SIMD_CLAUSE(private)
|
||||
|
@ -332,6 +338,7 @@ OPENMP_FOR_SIMD_CLAUSE(ordered)
|
|||
OPENMP_FOR_SIMD_CLAUSE(allocate)
|
||||
OPENMP_FOR_SIMD_CLAUSE(if)
|
||||
OPENMP_FOR_SIMD_CLAUSE(nontemporal)
|
||||
OPENMP_FOR_SIMD_CLAUSE(order)
|
||||
|
||||
// Clauses allowed for OpenMP directive 'omp sections'.
|
||||
OPENMP_SECTIONS_CLAUSE(private)
|
||||
|
@ -410,6 +417,7 @@ OPENMP_PARALLEL_FOR_CLAUSE(schedule)
|
|||
OPENMP_PARALLEL_FOR_CLAUSE(ordered)
|
||||
OPENMP_PARALLEL_FOR_CLAUSE(linear)
|
||||
OPENMP_PARALLEL_FOR_CLAUSE(allocate)
|
||||
OPENMP_PARALLEL_FOR_CLAUSE(order)
|
||||
|
||||
// Clauses allowed for OpenMP directive 'parallel for simd'.
|
||||
OPENMP_PARALLEL_FOR_SIMD_CLAUSE(if)
|
||||
|
@ -431,6 +439,7 @@ OPENMP_PARALLEL_FOR_SIMD_CLAUSE(aligned)
|
|||
OPENMP_PARALLEL_FOR_SIMD_CLAUSE(ordered)
|
||||
OPENMP_PARALLEL_FOR_SIMD_CLAUSE(allocate)
|
||||
OPENMP_PARALLEL_FOR_SIMD_CLAUSE(nontemporal)
|
||||
OPENMP_PARALLEL_FOR_SIMD_CLAUSE(order)
|
||||
|
||||
// Clauses allowed for OpenMP directive 'parallel master'.
|
||||
OPENMP_PARALLEL_MASTER_CLAUSE(if)
|
||||
|
@ -564,6 +573,7 @@ OPENMP_TARGET_PARALLEL_FOR_CLAUSE(ordered)
|
|||
OPENMP_TARGET_PARALLEL_FOR_CLAUSE(linear)
|
||||
OPENMP_TARGET_PARALLEL_FOR_CLAUSE(is_device_ptr)
|
||||
OPENMP_TARGET_PARALLEL_FOR_CLAUSE(allocate)
|
||||
OPENMP_TARGET_PARALLEL_FOR_CLAUSE(order)
|
||||
|
||||
// Clauses allowed for OpenMP directive 'target update'.
|
||||
OPENMP_TARGET_UPDATE_CLAUSE(if)
|
||||
|
@ -649,6 +659,7 @@ OPENMP_TASKLOOP_SIMD_CLAUSE(reduction)
|
|||
OPENMP_TASKLOOP_SIMD_CLAUSE(in_reduction)
|
||||
OPENMP_TASKLOOP_SIMD_CLAUSE(allocate)
|
||||
OPENMP_TASKLOOP_SIMD_CLAUSE(nontemporal)
|
||||
OPENMP_TASKLOOP_SIMD_CLAUSE(order)
|
||||
|
||||
// Clauses allowed for OpenMP directive 'master taskloop'.
|
||||
OPENMP_MASTER_TASKLOOP_CLAUSE(if)
|
||||
|
@ -692,6 +703,7 @@ OPENMP_MASTER_TASKLOOP_SIMD_CLAUSE(reduction)
|
|||
OPENMP_MASTER_TASKLOOP_SIMD_CLAUSE(in_reduction)
|
||||
OPENMP_MASTER_TASKLOOP_SIMD_CLAUSE(allocate)
|
||||
OPENMP_MASTER_TASKLOOP_SIMD_CLAUSE(nontemporal)
|
||||
OPENMP_MASTER_TASKLOOP_SIMD_CLAUSE(order)
|
||||
|
||||
// Clauses allowed for OpenMP directive 'parallel master taskloop'.
|
||||
OPENMP_PARALLEL_MASTER_TASKLOOP_CLAUSE(if)
|
||||
|
@ -739,6 +751,7 @@ OPENMP_PARALLEL_MASTER_TASKLOOP_SIMD_CLAUSE(aligned)
|
|||
OPENMP_PARALLEL_MASTER_TASKLOOP_SIMD_CLAUSE(safelen)
|
||||
OPENMP_PARALLEL_MASTER_TASKLOOP_SIMD_CLAUSE(simdlen)
|
||||
OPENMP_PARALLEL_MASTER_TASKLOOP_SIMD_CLAUSE(nontemporal)
|
||||
OPENMP_PARALLEL_MASTER_TASKLOOP_SIMD_CLAUSE(order)
|
||||
|
||||
// Clauses allowed for OpenMP directive 'critical'.
|
||||
OPENMP_CRITICAL_CLAUSE(hint)
|
||||
|
@ -769,6 +782,7 @@ OPENMP_DISTRIBUTE_PARALLEL_FOR_CLAUSE(reduction)
|
|||
OPENMP_DISTRIBUTE_PARALLEL_FOR_CLAUSE(copyin)
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_CLAUSE(schedule)
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_CLAUSE(allocate)
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_CLAUSE(order)
|
||||
|
||||
// Clauses allowed for OpenMP directive 'distribute parallel for simd'
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(firstprivate)
|
||||
|
@ -790,6 +804,7 @@ OPENMP_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(safelen)
|
|||
OPENMP_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(simdlen)
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(allocate)
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(nontemporal)
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(order)
|
||||
|
||||
// Clauses allowed for OpenMP directive 'distribute simd'
|
||||
OPENMP_DISTRIBUTE_SIMD_CLAUSE(private)
|
||||
|
@ -805,6 +820,7 @@ OPENMP_DISTRIBUTE_SIMD_CLAUSE(reduction)
|
|||
OPENMP_DISTRIBUTE_SIMD_CLAUSE(allocate)
|
||||
OPENMP_DISTRIBUTE_SIMD_CLAUSE(if)
|
||||
OPENMP_DISTRIBUTE_SIMD_CLAUSE(nontemporal)
|
||||
OPENMP_DISTRIBUTE_SIMD_CLAUSE(order)
|
||||
|
||||
// Clauses allowed for OpenMP directive 'target parallel for simd'.
|
||||
OPENMP_TARGET_PARALLEL_FOR_SIMD_CLAUSE(if)
|
||||
|
@ -831,6 +847,7 @@ OPENMP_TARGET_PARALLEL_FOR_SIMD_CLAUSE(aligned)
|
|||
OPENMP_TARGET_PARALLEL_FOR_SIMD_CLAUSE(is_device_ptr)
|
||||
OPENMP_TARGET_PARALLEL_FOR_SIMD_CLAUSE(allocate)
|
||||
OPENMP_TARGET_PARALLEL_FOR_SIMD_CLAUSE(nontemporal)
|
||||
OPENMP_TARGET_PARALLEL_FOR_SIMD_CLAUSE(order)
|
||||
|
||||
// Clauses allowed for OpenMP directive 'target simd'.
|
||||
OPENMP_TARGET_SIMD_CLAUSE(if)
|
||||
|
@ -851,6 +868,7 @@ OPENMP_TARGET_SIMD_CLAUSE(collapse)
|
|||
OPENMP_TARGET_SIMD_CLAUSE(reduction)
|
||||
OPENMP_TARGET_SIMD_CLAUSE(allocate)
|
||||
OPENMP_TARGET_SIMD_CLAUSE(nontemporal)
|
||||
OPENMP_TARGET_SIMD_CLAUSE(order)
|
||||
|
||||
// Clauses allowed for OpenMP directive 'teams distribute'.
|
||||
OPENMP_TEAMS_DISTRIBUTE_CLAUSE(default)
|
||||
|
@ -883,6 +901,7 @@ OPENMP_TEAMS_DISTRIBUTE_SIMD_CLAUSE(simdlen)
|
|||
OPENMP_TEAMS_DISTRIBUTE_SIMD_CLAUSE(allocate)
|
||||
OPENMP_TEAMS_DISTRIBUTE_SIMD_CLAUSE(if)
|
||||
OPENMP_TEAMS_DISTRIBUTE_SIMD_CLAUSE(nontemporal)
|
||||
OPENMP_TEAMS_DISTRIBUTE_SIMD_CLAUSE(order)
|
||||
|
||||
// Clauses allowed for OpenMP directive 'teams distribute parallel for simd'
|
||||
OPENMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(firstprivate)
|
||||
|
@ -905,6 +924,7 @@ OPENMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(num_teams)
|
|||
OPENMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(thread_limit)
|
||||
OPENMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(allocate)
|
||||
OPENMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(nontemporal)
|
||||
OPENMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(order)
|
||||
|
||||
// Clauses allowed for OpenMP directive 'teams distribute parallel for'
|
||||
OPENMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_CLAUSE(firstprivate)
|
||||
|
@ -923,6 +943,7 @@ OPENMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_CLAUSE(num_teams)
|
|||
OPENMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_CLAUSE(thread_limit)
|
||||
OPENMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_CLAUSE(copyin)
|
||||
OPENMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_CLAUSE(allocate)
|
||||
OPENMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_CLAUSE(order)
|
||||
|
||||
// Clauses allowed for OpenMP directive 'target teams'.
|
||||
OPENMP_TARGET_TEAMS_CLAUSE(if)
|
||||
|
@ -983,6 +1004,7 @@ OPENMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_FOR_CLAUSE(num_threads)
|
|||
OPENMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_FOR_CLAUSE(proc_bind)
|
||||
OPENMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_FOR_CLAUSE(schedule)
|
||||
OPENMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_FOR_CLAUSE(allocate)
|
||||
OPENMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_FOR_CLAUSE(order)
|
||||
|
||||
// Clauses allowed for OpenMP directive
|
||||
// 'target teams distribute parallel for simd'.
|
||||
|
@ -1012,6 +1034,7 @@ OPENMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(safelen)
|
|||
OPENMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(simdlen)
|
||||
OPENMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(allocate)
|
||||
OPENMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(nontemporal)
|
||||
OPENMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(order)
|
||||
|
||||
// Clauses allowed for OpenMP directive 'target teams distribute simd'.
|
||||
OPENMP_TARGET_TEAMS_DISTRIBUTE_SIMD_CLAUSE(if)
|
||||
|
@ -1036,6 +1059,7 @@ OPENMP_TARGET_TEAMS_DISTRIBUTE_SIMD_CLAUSE(safelen)
|
|||
OPENMP_TARGET_TEAMS_DISTRIBUTE_SIMD_CLAUSE(simdlen)
|
||||
OPENMP_TARGET_TEAMS_DISTRIBUTE_SIMD_CLAUSE(allocate)
|
||||
OPENMP_TARGET_TEAMS_DISTRIBUTE_SIMD_CLAUSE(nontemporal)
|
||||
OPENMP_TARGET_TEAMS_DISTRIBUTE_SIMD_CLAUSE(order)
|
||||
|
||||
// Clauses allowed for OpenMP directive 'taskgroup'.
|
||||
OPENMP_TASKGROUP_CLAUSE(task_reduction)
|
||||
|
@ -1055,6 +1079,10 @@ OPENMP_DECLARE_VARIANT_CLAUSE(match)
|
|||
// Type of the 'lastprivate' clause.
|
||||
OPENMP_LASTPRIVATE_KIND(conditional)
|
||||
|
||||
// Type of the 'order' clause.
|
||||
OPENMP_ORDER_KIND(concurrent)
|
||||
|
||||
#undef OPENMP_ORDER_KIND
|
||||
#undef OPENMP_LASTPRIVATE_KIND
|
||||
#undef OPENMP_CONTEXT_SELECTOR
|
||||
#undef OPENMP_CONTEXT_SELECTOR_SET
|
||||
|
|
|
@ -194,6 +194,13 @@ enum OpenMPLastprivateModifier {
|
|||
OMPC_LASTPRIVATE_unknown,
|
||||
};
|
||||
|
||||
/// OpenMP attributes for 'order' clause.
|
||||
enum OpenMPOrderClauseKind {
|
||||
#define OPENMP_ORDER_KIND(Name) OMPC_ORDER_##Name,
|
||||
#include "clang/Basic/OpenMPKinds.def"
|
||||
OMPC_ORDER_unknown,
|
||||
};
|
||||
|
||||
/// Scheduling data for loop-based OpenMP directives.
|
||||
struct OpenMPScheduleTy final {
|
||||
OpenMPScheduleClauseKind Schedule = OMPC_SCHEDULE_unknown;
|
||||
|
|
|
@ -10264,6 +10264,12 @@ public:
|
|||
SourceLocation StartLoc,
|
||||
SourceLocation LParenLoc,
|
||||
SourceLocation EndLoc);
|
||||
/// Called on well-formed 'order' clause.
|
||||
OMPClause *ActOnOpenMPOrderClause(OpenMPOrderClauseKind Kind,
|
||||
SourceLocation KindLoc,
|
||||
SourceLocation StartLoc,
|
||||
SourceLocation LParenLoc,
|
||||
SourceLocation EndLoc);
|
||||
|
||||
OMPClause *ActOnOpenMPSingleExprWithArgClause(
|
||||
OpenMPClauseKind Kind, ArrayRef<unsigned> Arguments, Expr *Expr,
|
||||
|
|
|
@ -137,6 +137,7 @@ const OMPClauseWithPreInit *OMPClauseWithPreInit::get(const OMPClause *C) {
|
|||
case OMPC_device_type:
|
||||
case OMPC_match:
|
||||
case OMPC_nontemporal:
|
||||
case OMPC_order:
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -216,6 +217,7 @@ const OMPClauseWithPostUpdate *OMPClauseWithPostUpdate::get(const OMPClause *C)
|
|||
case OMPC_device_type:
|
||||
case OMPC_match:
|
||||
case OMPC_nontemporal:
|
||||
case OMPC_order:
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1691,3 +1693,8 @@ void OMPClausePrinter::VisitOMPNontemporalClause(OMPNontemporalClause *Node) {
|
|||
OS << ")";
|
||||
}
|
||||
}
|
||||
|
||||
void OMPClausePrinter::VisitOMPOrderClause(OMPOrderClause *Node) {
|
||||
OS << "order(" << getOpenMPSimpleClauseTypeName(OMPC_order, Node->getKind())
|
||||
<< ")";
|
||||
}
|
||||
|
|
|
@ -775,6 +775,7 @@ void OMPClauseProfiler::VisitOMPNontemporalClause(
|
|||
for (auto *E : C->private_refs())
|
||||
Profiler->VisitStmt(E);
|
||||
}
|
||||
void OMPClauseProfiler::VisitOMPOrderClause(const OMPOrderClause *C) {}
|
||||
} // namespace
|
||||
|
||||
void
|
||||
|
|
|
@ -180,6 +180,11 @@ unsigned clang::getOpenMPSimpleClauseType(OpenMPClauseKind Kind,
|
|||
#define OPENMP_LASTPRIVATE_KIND(Name) .Case(#Name, OMPC_LASTPRIVATE_##Name)
|
||||
#include "clang/Basic/OpenMPKinds.def"
|
||||
.Default(OMPC_LASTPRIVATE_unknown);
|
||||
case OMPC_order:
|
||||
return llvm::StringSwitch<OpenMPOrderClauseKind>(Str)
|
||||
#define OPENMP_ORDER_KIND(Name) .Case(#Name, OMPC_ORDER_##Name)
|
||||
#include "clang/Basic/OpenMPKinds.def"
|
||||
.Default(OMPC_ORDER_unknown);
|
||||
case OMPC_unknown:
|
||||
case OMPC_threadprivate:
|
||||
case OMPC_if:
|
||||
|
@ -382,6 +387,16 @@ const char *clang::getOpenMPSimpleClauseTypeName(OpenMPClauseKind Kind,
|
|||
#include "clang/Basic/OpenMPKinds.def"
|
||||
}
|
||||
llvm_unreachable("Invalid OpenMP 'lastprivate' clause type");
|
||||
case OMPC_order:
|
||||
switch (Type) {
|
||||
case OMPC_ORDER_unknown:
|
||||
return "unknown";
|
||||
#define OPENMP_ORDER_KIND(Name) \
|
||||
case OMPC_ORDER_##Name: \
|
||||
return #Name;
|
||||
#include "clang/Basic/OpenMPKinds.def"
|
||||
}
|
||||
llvm_unreachable("Invalid OpenMP 'order' clause type");
|
||||
case OMPC_unknown:
|
||||
case OMPC_threadprivate:
|
||||
case OMPC_if:
|
||||
|
@ -443,6 +458,9 @@ bool clang::isAllowedClauseForDirective(OpenMPDirectiveKind DKind,
|
|||
// Nontemporal clause is not supported in OpenMP < 5.0.
|
||||
if (OpenMPVersion < 50 && CKind == OMPC_nontemporal)
|
||||
return false;
|
||||
// Order clause is not supported in OpenMP < 5.0.
|
||||
if (OpenMPVersion < 50 && CKind == OMPC_order)
|
||||
return false;
|
||||
switch (DKind) {
|
||||
case OMPD_parallel:
|
||||
switch (CKind) {
|
||||
|
|
|
@ -4463,6 +4463,7 @@ static void emitOMPAtomicExpr(CodeGenFunction &CGF, OpenMPClauseKind Kind,
|
|||
case OMPC_device_type:
|
||||
case OMPC_match:
|
||||
case OMPC_nontemporal:
|
||||
case OMPC_order:
|
||||
llvm_unreachable("Clause is not allowed in 'omp atomic'.");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2151,6 +2151,7 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind,
|
|||
case OMPC_default:
|
||||
case OMPC_proc_bind:
|
||||
case OMPC_atomic_default_mem_order:
|
||||
case OMPC_order:
|
||||
// OpenMP [2.14.3.1, Restrictions]
|
||||
// Only a single default clause may be specified on a parallel, task or
|
||||
// teams directive.
|
||||
|
@ -2159,7 +2160,7 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind,
|
|||
// OpenMP [5.0, Requires directive, Restrictions]
|
||||
// At most one atomic_default_mem_order clause can appear
|
||||
// on the directive
|
||||
if (!FirstClause) {
|
||||
if (!FirstClause && CKind != OMPC_order) {
|
||||
Diag(Tok, diag::err_omp_more_one_clause)
|
||||
<< getOpenMPDirectiveName(DKind) << getOpenMPClauseName(CKind) << 0;
|
||||
ErrorFound = true;
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#include "clang/AST/StmtOpenMP.h"
|
||||
#include "clang/AST/StmtVisitor.h"
|
||||
#include "clang/AST/TypeOrdering.h"
|
||||
#include "clang/Basic/DiagnosticSema.h"
|
||||
#include "clang/Basic/OpenMPKinds.h"
|
||||
#include "clang/Basic/PartialDiagnostic.h"
|
||||
#include "clang/Sema/Initialization.h"
|
||||
|
@ -3871,6 +3872,36 @@ void Sema::tryCaptureOpenMPLambdas(ValueDecl *V) {
|
|||
}
|
||||
}
|
||||
|
||||
static bool checkOrderedOrderSpecified(Sema &S,
|
||||
const ArrayRef<OMPClause *> Clauses) {
|
||||
const OMPOrderedClause *Ordered = nullptr;
|
||||
const OMPOrderClause *Order = nullptr;
|
||||
|
||||
for (const OMPClause *Clause : Clauses) {
|
||||
if (Clause->getClauseKind() == OMPC_ordered)
|
||||
Ordered = cast<OMPOrderedClause>(Clause);
|
||||
else if (Clause->getClauseKind() == OMPC_order) {
|
||||
Order = cast<OMPOrderClause>(Clause);
|
||||
if (Order->getKind() != OMPC_ORDER_concurrent)
|
||||
Order = nullptr;
|
||||
}
|
||||
if (Ordered && Order)
|
||||
break;
|
||||
}
|
||||
|
||||
if (Ordered && Order) {
|
||||
S.Diag(Order->getKindKwLoc(),
|
||||
diag::err_omp_simple_clause_incompatible_with_ordered)
|
||||
<< getOpenMPClauseName(OMPC_order)
|
||||
<< getOpenMPSimpleClauseTypeName(OMPC_order, OMPC_ORDER_concurrent)
|
||||
<< SourceRange(Order->getBeginLoc(), Order->getEndLoc());
|
||||
S.Diag(Ordered->getBeginLoc(), diag::note_omp_ordered_param)
|
||||
<< 0 << SourceRange(Ordered->getBeginLoc(), Ordered->getEndLoc());
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
StmtResult Sema::ActOnOpenMPRegionEnd(StmtResult S,
|
||||
ArrayRef<OMPClause *> Clauses) {
|
||||
bool ErrorFound = false;
|
||||
|
@ -3941,10 +3972,18 @@ StmtResult Sema::ActOnOpenMPRegionEnd(StmtResult S,
|
|||
Diag(SC->getFirstScheduleModifier() == OMPC_SCHEDULE_MODIFIER_nonmonotonic
|
||||
? SC->getFirstScheduleModifierLoc()
|
||||
: SC->getSecondScheduleModifierLoc(),
|
||||
diag::err_omp_schedule_nonmonotonic_ordered)
|
||||
diag::err_omp_simple_clause_incompatible_with_ordered)
|
||||
<< getOpenMPClauseName(OMPC_schedule)
|
||||
<< getOpenMPSimpleClauseTypeName(OMPC_schedule,
|
||||
OMPC_SCHEDULE_MODIFIER_nonmonotonic)
|
||||
<< SourceRange(OC->getBeginLoc(), OC->getEndLoc());
|
||||
ErrorFound = true;
|
||||
}
|
||||
// OpenMP 5.0, 2.9.2 Worksharing-Loop Construct, Restrictions.
|
||||
// If an order(concurrent) clause is present, an ordered clause may not appear
|
||||
// on the same directive.
|
||||
if (checkOrderedOrderSpecified(*this, Clauses))
|
||||
ErrorFound = true;
|
||||
if (!LCs.empty() && OC && OC->getNumForLoops()) {
|
||||
for (const OMPLinearClause *C : LCs) {
|
||||
Diag(C->getBeginLoc(), diag::err_omp_linear_ordered)
|
||||
|
@ -4959,6 +4998,7 @@ StmtResult Sema::ActOnOpenMPExecutableDirective(
|
|||
case OMPC_use_device_ptr:
|
||||
case OMPC_is_device_ptr:
|
||||
case OMPC_nontemporal:
|
||||
case OMPC_order:
|
||||
continue;
|
||||
case OMPC_allocator:
|
||||
case OMPC_flush:
|
||||
|
@ -4979,7 +5019,7 @@ StmtResult Sema::ActOnOpenMPExecutableDirective(
|
|||
DSAChecker.Visit(CC);
|
||||
}
|
||||
}
|
||||
for (auto &P : DSAChecker.getVarsWithInheritedDSA())
|
||||
for (const auto &P : DSAChecker.getVarsWithInheritedDSA())
|
||||
VarsWithInheritedDSA[P.getFirst()] = P.getSecond();
|
||||
}
|
||||
for (const auto &P : VarsWithInheritedDSA) {
|
||||
|
@ -8588,7 +8628,7 @@ StmtResult Sema::ActOnOpenMPOrderedDirective(ArrayRef<OMPClause *> Clauses,
|
|||
SourceLocation ErrLoc = TC ? TC->getBeginLoc() : StartLoc;
|
||||
Diag(ErrLoc, diag::err_omp_ordered_directive_with_param)
|
||||
<< (TC != nullptr);
|
||||
Diag(Param->getBeginLoc(), diag::note_omp_ordered_param);
|
||||
Diag(Param->getBeginLoc(), diag::note_omp_ordered_param) << 1;
|
||||
ErrorFound = true;
|
||||
}
|
||||
}
|
||||
|
@ -10822,6 +10862,7 @@ OMPClause *Sema::ActOnOpenMPSingleExprClause(OpenMPClauseKind Kind, Expr *Expr,
|
|||
case OMPC_device_type:
|
||||
case OMPC_match:
|
||||
case OMPC_nontemporal:
|
||||
case OMPC_order:
|
||||
llvm_unreachable("Clause is not allowed.");
|
||||
}
|
||||
return Res;
|
||||
|
@ -11533,6 +11574,7 @@ static OpenMPDirectiveKind getOpenMPCaptureRegionForClause(
|
|||
case OMPC_device_type:
|
||||
case OMPC_match:
|
||||
case OMPC_nontemporal:
|
||||
case OMPC_order:
|
||||
llvm_unreachable("Unexpected OpenMP clause.");
|
||||
}
|
||||
return CaptureRegion;
|
||||
|
@ -11898,6 +11940,10 @@ OMPClause *Sema::ActOnOpenMPSimpleClause(
|
|||
static_cast<OpenMPAtomicDefaultMemOrderClauseKind>(Argument),
|
||||
ArgumentLoc, StartLoc, LParenLoc, EndLoc);
|
||||
break;
|
||||
case OMPC_order:
|
||||
Res = ActOnOpenMPOrderClause(static_cast<OpenMPOrderClauseKind>(Argument),
|
||||
ArgumentLoc, StartLoc, LParenLoc, EndLoc);
|
||||
break;
|
||||
case OMPC_if:
|
||||
case OMPC_final:
|
||||
case OMPC_num_threads:
|
||||
|
@ -12043,6 +12089,24 @@ OMPClause *Sema::ActOnOpenMPAtomicDefaultMemOrderClause(
|
|||
LParenLoc, EndLoc);
|
||||
}
|
||||
|
||||
OMPClause *Sema::ActOnOpenMPOrderClause(OpenMPOrderClauseKind Kind,
|
||||
SourceLocation KindKwLoc,
|
||||
SourceLocation StartLoc,
|
||||
SourceLocation LParenLoc,
|
||||
SourceLocation EndLoc) {
|
||||
if (Kind == OMPC_ORDER_unknown) {
|
||||
static_assert(OMPC_ORDER_unknown > 0,
|
||||
"OMPC_ORDER_unknown not greater than 0");
|
||||
Diag(KindKwLoc, diag::err_omp_unexpected_clause_value)
|
||||
<< getListOfPossibleValues(OMPC_order, /*First=*/0,
|
||||
/*Last=*/OMPC_ORDER_unknown)
|
||||
<< getOpenMPClauseName(OMPC_order);
|
||||
return nullptr;
|
||||
}
|
||||
return new (Context)
|
||||
OMPOrderClause(Kind, KindKwLoc, StartLoc, LParenLoc, EndLoc);
|
||||
}
|
||||
|
||||
OMPClause *Sema::ActOnOpenMPSingleExprWithArgClause(
|
||||
OpenMPClauseKind Kind, ArrayRef<unsigned> Argument, Expr *Expr,
|
||||
SourceLocation StartLoc, SourceLocation LParenLoc,
|
||||
|
@ -12137,6 +12201,7 @@ OMPClause *Sema::ActOnOpenMPSingleExprWithArgClause(
|
|||
case OMPC_device_type:
|
||||
case OMPC_match:
|
||||
case OMPC_nontemporal:
|
||||
case OMPC_order:
|
||||
llvm_unreachable("Clause is not allowed.");
|
||||
}
|
||||
return Res;
|
||||
|
@ -12349,6 +12414,7 @@ OMPClause *Sema::ActOnOpenMPClause(OpenMPClauseKind Kind,
|
|||
case OMPC_device_type:
|
||||
case OMPC_match:
|
||||
case OMPC_nontemporal:
|
||||
case OMPC_order:
|
||||
llvm_unreachable("Clause is not allowed.");
|
||||
}
|
||||
return Res;
|
||||
|
@ -12572,6 +12638,7 @@ OMPClause *Sema::ActOnOpenMPVarListClause(
|
|||
case OMPC_atomic_default_mem_order:
|
||||
case OMPC_device_type:
|
||||
case OMPC_match:
|
||||
case OMPC_order:
|
||||
llvm_unreachable("Clause is not allowed.");
|
||||
}
|
||||
return Res;
|
||||
|
|
|
@ -2016,6 +2016,19 @@ public:
|
|||
EndLoc);
|
||||
}
|
||||
|
||||
/// Build a new OpenMP 'order' clause.
|
||||
///
|
||||
/// By default, performs semantic analysis to build the new OpenMP clause.
|
||||
/// Subclasses may override this routine to provide different behavior.
|
||||
OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind,
|
||||
SourceLocation KindKwLoc,
|
||||
SourceLocation StartLoc,
|
||||
SourceLocation LParenLoc,
|
||||
SourceLocation EndLoc) {
|
||||
return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc,
|
||||
LParenLoc, EndLoc);
|
||||
}
|
||||
|
||||
/// Rebuild the operand to an Objective-C \@synchronized statement.
|
||||
///
|
||||
/// By default, performs semantic analysis to build the new statement.
|
||||
|
@ -9399,6 +9412,14 @@ TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) {
|
|||
Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
|
||||
}
|
||||
|
||||
template <typename Derived>
|
||||
OMPClause *
|
||||
TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) {
|
||||
return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(),
|
||||
C->getBeginLoc(), C->getLParenLoc(),
|
||||
C->getEndLoc());
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Expression transformation
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
|
@ -11810,6 +11810,9 @@ OMPClause *OMPClauseReader::readClause() {
|
|||
case OMPC_nontemporal:
|
||||
C = OMPNontemporalClause::CreateEmpty(Context, Record.readInt());
|
||||
break;
|
||||
case OMPC_order:
|
||||
C = new (Context) OMPOrderClause();
|
||||
break;
|
||||
}
|
||||
assert(C && "Unknown OMPClause type");
|
||||
|
||||
|
@ -12583,3 +12586,9 @@ void OMPClauseReader::VisitOMPNontemporalClause(OMPNontemporalClause *C) {
|
|||
Vars.push_back(Record.readSubExpr());
|
||||
C->setPrivateRefs(Vars);
|
||||
}
|
||||
|
||||
void OMPClauseReader::VisitOMPOrderClause(OMPOrderClause *C) {
|
||||
C->setKind(Record.readEnum<OpenMPOrderClauseKind>());
|
||||
C->setLParenLoc(Record.readSourceLocation());
|
||||
C->setKindKwLoc(Record.readSourceLocation());
|
||||
}
|
||||
|
|
|
@ -6563,3 +6563,10 @@ void OMPClauseWriter::VisitOMPNontemporalClause(OMPNontemporalClause *C) {
|
|||
for (auto *E : C->private_refs())
|
||||
Record.AddStmt(E);
|
||||
}
|
||||
|
||||
void OMPClauseWriter::VisitOMPOrderClause(OMPOrderClause *C) {
|
||||
Record.writeEnum(C->getKind());
|
||||
Record.AddSourceLocation(C->getLParenLoc());
|
||||
Record.AddSourceLocation(C->getKindKwLoc());
|
||||
}
|
||||
|
||||
|
|
|
@ -1,10 +1,16 @@
|
|||
// RUN: %clang_cc1 -verify -std=c++11 -fopenmp -fopenmp-version=45 -ast-print %s -Wno-openmp-mapping | FileCheck %s
|
||||
// RUN: %clang_cc1 -verify -std=c++11 -fopenmp -fopenmp-version=45 -ast-print %s -Wno-openmp-mapping | FileCheck %s --check-prefix=CHECK --check-prefix=OMP45
|
||||
// RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -emit-pch -o %t %s
|
||||
// RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s
|
||||
// RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s --check-prefix=CHECK --check-prefix=OMP45
|
||||
// RUN: %clang_cc1 -verify -std=c++11 -fopenmp -fopenmp-version=50 -ast-print %s -Wno-openmp-mapping -DOMP5 | FileCheck %s --check-prefix=CHECK --check-prefix=OMP50
|
||||
// RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s -DOMP5
|
||||
// RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-mapping -DOMP5 | FileCheck %s --check-prefix=CHECK --check-prefix=OMP50
|
||||
|
||||
// RUN: %clang_cc1 -verify -std=c++11 -fopenmp-simd -fopenmp-version=45 -ast-print %s -Wno-openmp-mapping | FileCheck %s
|
||||
// RUN: %clang_cc1 -verify -std=c++11 -fopenmp-simd -fopenmp-version=45 -ast-print %s -Wno-openmp-mapping | FileCheck %s --check-prefix=CHECK --check-prefix=OMP45
|
||||
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -emit-pch -o %t %s
|
||||
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s
|
||||
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s --check-prefix=CHECK --check-prefix=OMP45
|
||||
// RUN: %clang_cc1 -verify -std=c++11 -fopenmp-simd -fopenmp-version=50 -ast-print %s -Wno-openmp-mapping -DOMP5 | FileCheck %s --check-prefix=CHECK --check-prefix=OMP50
|
||||
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s -DOMP5
|
||||
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-mapping -DOMP5 | FileCheck %s --check-prefix=CHECK --check-prefix=OMP50
|
||||
// expected-no-diagnostics
|
||||
|
||||
#ifndef HEADER
|
||||
|
@ -125,11 +131,11 @@ void foo(int argc, char **argv) {
|
|||
#pragma omp distribute parallel for schedule(guided, argc) default(none) copyin(g) dist_schedule(static, a) private(a) shared(argc)
|
||||
// CHECK: #pragma omp distribute parallel for schedule(guided, argc) default(none) copyin(g) dist_schedule(static, a) private(a) shared(argc)
|
||||
for (int i = 0; i < 2; ++i)
|
||||
// CHECK: for (int i = 0; i < 2; ++i)
|
||||
// CHECK: for (int i = 0; i < 2; ++i)
|
||||
[&]() {
|
||||
a = 2;
|
||||
// CHECK: a = 2;
|
||||
}();
|
||||
a = 2;
|
||||
// CHECK: a = 2;
|
||||
}();
|
||||
|
||||
}();
|
||||
[&]() {
|
||||
|
@ -138,9 +144,9 @@ void foo(int argc, char **argv) {
|
|||
#pragma omp distribute parallel for private(argc, b), firstprivate(argv, c), lastprivate(d, f) collapse(2) schedule(auto) if (argc) num_threads(a) default(shared) shared(e) reduction(+ : h) dist_schedule(static, b)
|
||||
for (int i = 0; i < 10; ++i)
|
||||
for (int j = 0; j < 10; ++j)
|
||||
[&]() {
|
||||
a++;
|
||||
}();
|
||||
[&]() {
|
||||
a++;
|
||||
}();
|
||||
// CHECK: #pragma omp distribute parallel for private(argc,b) firstprivate(argv,c) lastprivate(d,f) collapse(2) schedule(auto) if(argc) num_threads(a) default(shared) shared(e) reduction(+: h) dist_schedule(static, b)
|
||||
// CHECK-NEXT: for (int i = 0; i < 10; ++i)
|
||||
// CHECK-NEXT: for (int j = 0; j < 10; ++j)
|
||||
|
@ -156,8 +162,13 @@ int main(int argc, char **argv) {
|
|||
#pragma omp threadprivate(g)
|
||||
#pragma omp target
|
||||
#pragma omp teams
|
||||
#ifdef OMP5
|
||||
#pragma omp distribute parallel for schedule(guided, argc) default(none) copyin(g) dist_schedule(static, a) private(a) shared(argc) order(concurrent)
|
||||
#else
|
||||
#pragma omp distribute parallel for schedule(guided, argc) default(none) copyin(g) dist_schedule(static, a) private(a) shared(argc)
|
||||
// CHECK: #pragma omp distribute parallel for schedule(guided, argc) default(none) copyin(g) dist_schedule(static, a) private(a) shared(argc)
|
||||
#endif // OMP5
|
||||
// OMP45: #pragma omp distribute parallel for schedule(guided, argc) default(none) copyin(g) dist_schedule(static, a) private(a) shared(argc)
|
||||
// OMP50: #pragma omp distribute parallel for schedule(guided, argc) default(none) copyin(g) dist_schedule(static, a) private(a) shared(argc) order(concurrent)
|
||||
for (int i = 0; i < 2; ++i)
|
||||
a = 2;
|
||||
// CHECK-NEXT: for (int i = 0; i < 2; ++i)
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -std=c++11 -o - %s -Wuninitialized
|
||||
// RUN: %clang_cc1 -verify=expected,omp45 -fopenmp -ferror-limit 100 -std=c++11 -o - %s -fopenmp-version=45 -Wuninitialized
|
||||
// RUN: %clang_cc1 -verify=expected,omp50 -fopenmp -ferror-limit 100 -std=c++11 -o - %s -fopenmp-version=50 -Wuninitialized
|
||||
|
||||
// RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 -std=c++11 -o - %s -Wuninitialized
|
||||
// RUN: %clang_cc1 -verify=expected,omp45 -fopenmp-simd -ferror-limit 100 -std=c++11 -o - %s -fopenmp-version=45 -Wuninitialized
|
||||
// RUN: %clang_cc1 -verify=expected,omp50 -fopenmp-simd -ferror-limit 100 -std=c++11 -o - %s -fopenmp-version=50 -Wuninitialized
|
||||
|
||||
void foo() {
|
||||
}
|
||||
|
@ -15,6 +17,21 @@ void xxx(int argc) {
|
|||
#pragma omp distribute parallel for // expected-error {{unexpected OpenMP directive '#pragma omp distribute parallel for'}}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
#pragma omp distribute parallel for order // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp distribute parallel for'}} expected-error {{expected '(' after 'order'}}
|
||||
for (int i = 0; i < argc; ++i)
|
||||
foo();
|
||||
#pragma omp distribute parallel for order( // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp distribute parallel for'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < argc; ++i)
|
||||
foo();
|
||||
#pragma omp distribute parallel for order(none // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp distribute parallel for'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < argc; ++i)
|
||||
foo();
|
||||
#pragma omp distribute parallel for order(concurrent // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp distribute parallel for'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
|
||||
for (int i = 0; i < argc; ++i)
|
||||
foo();
|
||||
#pragma omp distribute parallel for order(concurrent) // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp distribute parallel for'}}
|
||||
for (int i = 0; i < argc; ++i)
|
||||
foo();
|
||||
#pragma omp target
|
||||
#pragma omp teams
|
||||
#pragma omp distribute parallel for { // expected-warning {{extra tokens at the end of '#pragma omp distribute parallel for' are ignored}}
|
||||
|
|
|
@ -150,7 +150,7 @@ int main(int argc, char **argv) {
|
|||
#pragma omp target
|
||||
#pragma omp teams
|
||||
#ifdef OMP5
|
||||
#pragma omp distribute parallel for simd aligned(x:8) linear(i:2) safelen(8) simdlen(8) if(simd: argc) nontemporal(argc, c, d)
|
||||
#pragma omp distribute parallel for simd aligned(x:8) linear(i:2) safelen(8) simdlen(8) if(simd: argc) nontemporal(argc, c, d) order(concurrent)
|
||||
#else
|
||||
#pragma omp distribute parallel for simd aligned(x:8) linear(i:2) safelen(8) simdlen(8)
|
||||
#endif // OMP5
|
||||
|
@ -158,7 +158,7 @@ int main(int argc, char **argv) {
|
|||
for (int j = 0; j < 200; j++)
|
||||
a += h + x[j];
|
||||
// OMP45: #pragma omp distribute parallel for simd aligned(x: 8) linear(i: 2) safelen(8) simdlen(8)
|
||||
// OMP50: #pragma omp distribute parallel for simd aligned(x: 8) linear(i: 2) safelen(8) simdlen(8) if(simd: argc) nontemporal(argc,c,d)
|
||||
// OMP50: #pragma omp distribute parallel for simd aligned(x: 8) linear(i: 2) safelen(8) simdlen(8) if(simd: argc) nontemporal(argc,c,d) order(concurrent)
|
||||
// CHECK-NEXT: for (i = 0; i < 100; i++)
|
||||
// CHECK-NEXT: for (int j = 0; j < 200; j++)
|
||||
// CHECK-NEXT: a += h + x[j];
|
||||
|
|
|
@ -982,5 +982,20 @@ void test_nontemporal() {
|
|||
#pragma omp distribute parallel for simd lastprivate(x) nontemporal(x)
|
||||
for (i = 0; i < 16; ++i)
|
||||
;
|
||||
#pragma omp distribute parallel for simd order // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp distribute parallel for simd'}} expected-error {{expected '(' after 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp distribute parallel for simd order( // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp distribute parallel for simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp distribute parallel for simd order(none // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp distribute parallel for simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp distribute parallel for simd order(concurrent // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp distribute parallel for simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp distribute parallel for simd order(concurrent) // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp distribute parallel for simd'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
}
|
||||
|
||||
|
|
|
@ -148,7 +148,7 @@ int main(int argc, char **argv) {
|
|||
#pragma omp target
|
||||
#pragma omp teams
|
||||
#ifdef OMP5
|
||||
#pragma omp distribute simd aligned(x:8) linear(i:2) safelen(8) simdlen(8) if(argc) nontemporal(argc, c, d)
|
||||
#pragma omp distribute simd aligned(x:8) linear(i:2) safelen(8) simdlen(8) if(argc) nontemporal(argc, c, d) order(concurrent)
|
||||
#else
|
||||
#pragma omp distribute simd aligned(x:8) linear(i:2) safelen(8) simdlen(8)
|
||||
#endif // OMP5
|
||||
|
@ -156,7 +156,7 @@ int main(int argc, char **argv) {
|
|||
for (int j = 0; j < 200; j++)
|
||||
a += h + x[j];
|
||||
// OMP45: #pragma omp distribute simd aligned(x: 8) linear(i: 2) safelen(8) simdlen(8)
|
||||
// OMP50: #pragma omp distribute simd aligned(x: 8) linear(i: 2) safelen(8) simdlen(8) if(argc) nontemporal(argc,c,d)
|
||||
// OMP50: #pragma omp distribute simd aligned(x: 8) linear(i: 2) safelen(8) simdlen(8) if(argc) nontemporal(argc,c,d) order(concurrent)
|
||||
// CHECK-NEXT: for (i = 0; i < 100; i++)
|
||||
// CHECK-NEXT: for (int j = 0; j < 200; j++)
|
||||
// CHECK-NEXT: a += h + x[j];
|
||||
|
|
|
@ -1116,5 +1116,20 @@ void test_nontemporal() {
|
|||
#pragma omp distribute simd lastprivate(x) nontemporal(x)
|
||||
for (i = 0; i < 16; ++i)
|
||||
;
|
||||
#pragma omp distribute simd order // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp distribute simd'}} expected-error {{expected '(' after 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp distribute simd order( // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp distribute simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp distribute simd order(none // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp distribute simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp distribute simd order(concurrent // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp distribute simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp distribute simd order(concurrent) // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp distribute simd'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
}
|
||||
|
||||
|
|
|
@ -161,8 +161,8 @@ int main(int argc, char **argv) {
|
|||
float arr[20];
|
||||
static int a;
|
||||
// CHECK: static int a;
|
||||
#pragma omp for schedule(guided, argc) reduction(+:argv[0][:1])
|
||||
// CHECK-NEXT: #pragma omp for schedule(guided, argc) reduction(+: argv[0][:1])
|
||||
#pragma omp for schedule(guided, argc) reduction(+:argv[0][:1]) order(concurrent)
|
||||
// CHECK-NEXT: #pragma omp for schedule(guided, argc) reduction(+: argv[0][:1]) order(concurrent)
|
||||
for (int i = 0; i < 2; ++i)
|
||||
a = 2;
|
||||
// CHECK-NEXT: for (int i = 0; i < 2; ++i)
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -fopenmp -triple x86_64-unknown-unknown -verify %s -Wuninitialized
|
||||
// RUN: %clang_cc1 -fsyntax-only -fopenmp -fopenmp-version=45 -triple x86_64-unknown-unknown -verify=expected,omp45 %s -Wuninitialized
|
||||
// RUN: %clang_cc1 -fsyntax-only -fopenmp -fopenmp-version=50 -triple x86_64-unknown-unknown -verify=expected,omp50 %s -Wuninitialized
|
||||
|
||||
// RUN: %clang_cc1 -fsyntax-only -fopenmp-simd -triple x86_64-unknown-unknown -verify %s -Wuninitialized
|
||||
// RUN: %clang_cc1 -fsyntax-only -fopenmp-simd -fopenmp-version=45 -triple x86_64-unknown-unknown -verify=expected,omp45 %s -Wuninitialized
|
||||
// RUN: %clang_cc1 -fsyntax-only -fopenmp-simd -fopenmp-version=50 -triple x86_64-unknown-unknown -verify=expected,omp50 %s -Wuninitialized
|
||||
|
||||
void xxx(int argc) {
|
||||
int x; // expected-note {{initialize the variable 'x' to silence this warning}}
|
||||
|
@ -397,5 +399,20 @@ void test_loop_messages() {
|
|||
for (__int128 ii = 0; ii < 10; ii++) {
|
||||
c[ii] = a[ii] + b[ii];
|
||||
}
|
||||
#pragma omp for order // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp for'}} expected-error {{expected '(' after 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp for order( // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp for'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp for order(none // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp for'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp for order(concurrent // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp for'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp for ordered order(concurrent) // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp for'}} omp50-error {{'order' clause with 'concurrent' modifier cannot be specified if an 'ordered' clause is specified}} omp50-note {{'ordered' clause}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
}
|
||||
|
||||
|
|
|
@ -97,11 +97,11 @@ template<class T> struct S {
|
|||
// CHECK: T val;
|
||||
// CHECK: T lin = 0;
|
||||
#ifdef OMP5
|
||||
#pragma omp for simd private(val) safelen(7) linear(lin : -5) lastprivate(res) simdlen(5) allocate(res) if(res) nontemporal(res, val, lin)
|
||||
#pragma omp for simd private(val) safelen(7) linear(lin : -5) lastprivate(res) simdlen(5) allocate(res) if(res) nontemporal(res, val, lin) order(concurrent)
|
||||
#else
|
||||
#pragma omp for simd private(val) safelen(7) linear(lin : -5) lastprivate(res) simdlen(5) allocate(res)
|
||||
#endif
|
||||
// OMP50-NEXT: #pragma omp for simd private(val) safelen(7) linear(lin: -5) lastprivate(res) simdlen(5) allocate(res) if(res) nontemporal(res,val,lin)
|
||||
// OMP50-NEXT: #pragma omp for simd private(val) safelen(7) linear(lin: -5) lastprivate(res) simdlen(5) allocate(res) if(res) nontemporal(res,val,lin) order(concurrent)
|
||||
// OMP45-NEXT: #pragma omp for simd private(val) safelen(7) linear(lin: -5) lastprivate(res) simdlen(5) allocate(res)
|
||||
for (T i = 7; i < m_a; ++i) {
|
||||
val = v[i-7] + m_a;
|
||||
|
|
|
@ -849,5 +849,20 @@ void test_nontemporal() {
|
|||
#pragma omp for simd lastprivate(x) nontemporal(x)
|
||||
for (i = 0; i < 16; ++i)
|
||||
;
|
||||
#pragma omp for simd order // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp for simd'}} expected-error {{expected '(' after 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp for simd order( // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp for simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp for simd order(none // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp for simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp for simd order(concurrent // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp for simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp for simd order(concurrent) // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp for simd'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
}
|
||||
|
||||
|
|
|
@ -76,7 +76,7 @@ int main(int argc, char **argv) {
|
|||
// CHECK-NEXT: a = 2;
|
||||
#pragma omp parallel
|
||||
#ifdef OMP5
|
||||
#pragma omp master taskloop simd private(argc, b), firstprivate(argv, c), lastprivate(d, f) collapse(2) shared(g) if(simd:argc) mergeable priority(argc) simdlen(16) grainsize(argc) reduction(max: a, e) nontemporal(argc, c, d)
|
||||
#pragma omp master taskloop simd private(argc, b), firstprivate(argv, c), lastprivate(d, f) collapse(2) shared(g) if(simd:argc) mergeable priority(argc) simdlen(16) grainsize(argc) reduction(max: a, e) nontemporal(argc, c, d) order(concurrent)
|
||||
#else
|
||||
#pragma omp master taskloop simd private(argc, b), firstprivate(argv, c), lastprivate(d, f) collapse(2) shared(g) if(argc) mergeable priority(argc) simdlen(16) grainsize(argc) reduction(max: a, e)
|
||||
#endif // OMP5
|
||||
|
@ -84,7 +84,7 @@ int main(int argc, char **argv) {
|
|||
for (int j = 0; j < 10; ++j)
|
||||
foo();
|
||||
// CHECK-NEXT: #pragma omp parallel
|
||||
// OMP50-NEXT: #pragma omp master taskloop simd private(argc,b) firstprivate(argv,c) lastprivate(d,f) collapse(2) shared(g) if(simd: argc) mergeable priority(argc) simdlen(16) grainsize(argc) reduction(max: a,e) nontemporal(argc,c,d)
|
||||
// OMP50-NEXT: #pragma omp master taskloop simd private(argc,b) firstprivate(argv,c) lastprivate(d,f) collapse(2) shared(g) if(simd: argc) mergeable priority(argc) simdlen(16) grainsize(argc) reduction(max: a,e) nontemporal(argc,c,d) order(concurrent)
|
||||
// OMP45-NEXT: #pragma omp master taskloop simd private(argc,b) firstprivate(argv,c) lastprivate(d,f) collapse(2) shared(g) if(argc) mergeable priority(argc) simdlen(16) grainsize(argc) reduction(max: a,e)
|
||||
// CHECK-NEXT: for (int i = 0; i < 10; ++i)
|
||||
// CHECK-NEXT: for (int j = 0; j < 10; ++j)
|
||||
|
|
|
@ -70,8 +70,8 @@ T tmain(T argc) {
|
|||
// CHECK: static T a;
|
||||
static T g;
|
||||
#pragma omp threadprivate(g)
|
||||
#pragma omp parallel for schedule(dynamic) default(none) copyin(g) linear(a) allocate(a) lastprivate(conditional: d, e,f)
|
||||
// CHECK: #pragma omp parallel for schedule(dynamic) default(none) copyin(g) linear(a) allocate(a) lastprivate(conditional: d,e,f)
|
||||
#pragma omp parallel for schedule(dynamic) default(none) copyin(g) linear(a) allocate(a) lastprivate(conditional: d, e,f) order(concurrent)
|
||||
// CHECK: #pragma omp parallel for schedule(dynamic) default(none) copyin(g) linear(a) allocate(a) lastprivate(conditional: d,e,f) order(concurrent)
|
||||
for (int i = 0; i < 2; ++i)
|
||||
a = 2;
|
||||
// CHECK-NEXT: for (int i = 0; i < 2; ++i)
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -std=c++11 -o - %s -Wuninitialized
|
||||
// RUN: %clang_cc1 -verify=expected,omp45 -fopenmp -fopenmp-version=45 -ferror-limit 100 -std=c++11 -o - %s -Wuninitialized
|
||||
// RUN: %clang_cc1 -verify=expected,omp50 -fopenmp -fopenmp-version=50 -ferror-limit 100 -std=c++11 -o - %s -Wuninitialized
|
||||
|
||||
// RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 -std=c++11 -o - %s -Wuninitialized
|
||||
// RUN: %clang_cc1 -verify=expected,omp45 -fopenmp-simd -fopenmp-version=45 -ferror-limit 100 -std=c++11 -o - %s -Wuninitialized
|
||||
// RUN: %clang_cc1 -verify=expected,omp50 -fopenmp-simd -fopenmp-version=50 -ferror-limit 100 -std=c++11 -o - %s -Wuninitialized
|
||||
|
||||
void xxx(int argc) {
|
||||
int x; // expected-note {{initialize the variable 'x' to silence this warning}}
|
||||
|
@ -91,5 +93,20 @@ void test_ordered() {
|
|||
#pragma omp parallel for ordered ordered // expected-error {{directive '#pragma omp parallel for' cannot contain more than one 'ordered' clause}}
|
||||
for (int i = 0; i < 16; ++i)
|
||||
;
|
||||
#pragma omp parallel for order // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp parallel for'}} expected-error {{expected '(' after 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp parallel for order( // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp parallel for'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp parallel for order(none // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp parallel for'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp parallel for order(concurrent // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp parallel for'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp parallel for order(concurrent) // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp parallel for'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
}
|
||||
|
||||
|
|
|
@ -155,11 +155,11 @@ int main (int argc, char **argv) {
|
|||
static int *a;
|
||||
// CHECK: static int *a;
|
||||
#ifdef OMP5
|
||||
#pragma omp parallel for simd if(parallel :b) ordered if(simd: b) nontemporal(argc, c) lastprivate(conditional:d,f)
|
||||
#pragma omp parallel for simd if(parallel :b) if(simd: b) nontemporal(argc, c) lastprivate(conditional:d,f) order(concurrent)
|
||||
#else
|
||||
#pragma omp parallel for simd if(parallel :b) ordered
|
||||
#endif // OMP5
|
||||
// OMP50-NEXT: #pragma omp parallel for simd if(parallel: b) ordered if(simd: b) nontemporal(argc,c) lastprivate(conditional: d,f)
|
||||
// OMP50-NEXT: #pragma omp parallel for simd if(parallel: b) if(simd: b) nontemporal(argc,c) lastprivate(conditional: d,f) order(concurrent)
|
||||
// OMP45-NEXT: #pragma omp parallel for simd if(parallel: b) ordered
|
||||
for (int i=0; i < 2; ++i)*a=2;
|
||||
// CHECK-NEXT: for (int i = 0; i < 2; ++i)
|
||||
|
|
|
@ -838,5 +838,20 @@ void test_nontemporal() {
|
|||
#pragma omp parallel for simd lastprivate(x) nontemporal(x)
|
||||
for (i = 0; i < 16; ++i)
|
||||
;
|
||||
#pragma omp parallel for simd order // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp parallel for simd'}} expected-error {{expected '(' after 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp parallel for simd order( // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp parallel for simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp parallel for simd order(none // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp parallel for simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp parallel for simd order(concurrent // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp parallel for simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp parallel for simd order(concurrent) // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp parallel for simd'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
}
|
||||
|
||||
|
|
|
@ -75,7 +75,7 @@ int main(int argc, char **argv) {
|
|||
// CHECK-NEXT: a = 2;
|
||||
#pragma omp parallel
|
||||
#ifdef OMP5
|
||||
#pragma omp parallel master taskloop simd private(argc, b), firstprivate(argv, c), lastprivate(d, f) collapse(2) shared(g) if(simd:argc) mergeable priority(argc) grainsize(argc) reduction(max: a, e) nontemporal(argc, c, d)
|
||||
#pragma omp parallel master taskloop simd private(argc, b), firstprivate(argv, c), lastprivate(d, f) collapse(2) shared(g) if(simd:argc) mergeable priority(argc) grainsize(argc) reduction(max: a, e) nontemporal(argc, c, d) order(concurrent)
|
||||
#else
|
||||
#pragma omp parallel master taskloop simd private(argc, b), firstprivate(argv, c), lastprivate(d, f) collapse(2) shared(g) if(argc) mergeable priority(argc) grainsize(argc) reduction(max: a, e)
|
||||
#endif // OMP5
|
||||
|
@ -84,7 +84,7 @@ int main(int argc, char **argv) {
|
|||
foo();
|
||||
// CHECK-NEXT: #pragma omp parallel
|
||||
// OMP45-NEXT: #pragma omp parallel master taskloop simd private(argc,b) firstprivate(argv,c) lastprivate(d,f) collapse(2) shared(g) if(argc) mergeable priority(argc) grainsize(argc) reduction(max: a,e)
|
||||
// OMP50-NEXT: #pragma omp parallel master taskloop simd private(argc,b) firstprivate(argv,c) lastprivate(d,f) collapse(2) shared(g) if(simd: argc) mergeable priority(argc) grainsize(argc) reduction(max: a,e) nontemporal(argc,c,d)
|
||||
// OMP50-NEXT: #pragma omp parallel master taskloop simd private(argc,b) firstprivate(argv,c) lastprivate(d,f) collapse(2) shared(g) if(simd: argc) mergeable priority(argc) grainsize(argc) reduction(max: a,e) nontemporal(argc,c,d) order(concurrent)
|
||||
// CHECK-NEXT: for (int i = 0; i < 10; ++i)
|
||||
// CHECK-NEXT: for (int j = 0; j < 10; ++j)
|
||||
// CHECK-NEXT: foo();
|
||||
|
|
|
@ -164,8 +164,8 @@ int main (int argc, char **argv) {
|
|||
// CHECK-NEXT: for (int i = 0; i < 2; ++i)
|
||||
// CHECK-NEXT: *a = 2;
|
||||
#ifdef OMP5
|
||||
#pragma omp simd private(argc, b),lastprivate(d,f) collapse(2) aligned(a : 4) if(simd:a) nontemporal(argc, c, d) lastprivate(conditional: e, f)
|
||||
// OMP50-NEXT: #pragma omp simd private(argc,b) lastprivate(d,f) collapse(2) aligned(a: 4) if(simd: a) nontemporal(argc,c,d) lastprivate(conditional: e,f)
|
||||
#pragma omp simd private(argc, b),lastprivate(d,f) collapse(2) aligned(a : 4) if(simd:a) nontemporal(argc, c, d) lastprivate(conditional: e, f) order(concurrent)
|
||||
// OMP50-NEXT: #pragma omp simd private(argc,b) lastprivate(d,f) collapse(2) aligned(a: 4) if(simd: a) nontemporal(argc,c,d) lastprivate(conditional: e,f) order(concurrent)
|
||||
#else
|
||||
#pragma omp simd private(argc, b),lastprivate(d,f) collapse(2) aligned(a : 4)
|
||||
// OMP45-NEXT: #pragma omp simd private(argc,b) lastprivate(d,f) collapse(2) aligned(a: 4)
|
||||
|
|
|
@ -888,5 +888,20 @@ void test_nontemporal() {
|
|||
#pragma omp simd lastprivate(x) nontemporal(x)
|
||||
for (i = 0; i < 16; ++i)
|
||||
;
|
||||
#pragma omp simd order // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp simd'}} expected-error {{expected '(' after 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp simd order( // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp simd order(none // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp simd order(concurrent // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp simd order(concurrent) // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp simd'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -ast-print %s -Wno-openmp-mapping | FileCheck %s
|
||||
// RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -emit-pch -o %t %s -Wno-openmp-mapping
|
||||
// RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s
|
||||
// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=50 -ast-print %s -Wno-openmp-mapping | FileCheck %s
|
||||
// RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s -Wno-openmp-mapping
|
||||
// RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s
|
||||
|
||||
// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=45 -ast-print %s -Wno-openmp-mapping | FileCheck %s
|
||||
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -emit-pch -o %t %s -Wno-openmp-mapping
|
||||
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s
|
||||
// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=50 -ast-print %s -Wno-openmp-mapping | FileCheck %s
|
||||
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s -Wno-openmp-mapping
|
||||
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s
|
||||
// expected-no-diagnostics
|
||||
|
||||
#ifndef HEADER
|
||||
|
@ -73,8 +73,8 @@ T tmain(T argc, T *argv) {
|
|||
// CHECK: static T a;
|
||||
static T g;
|
||||
#pragma omp threadprivate(g)
|
||||
#pragma omp target parallel for schedule(dynamic) default(none) linear(a) allocate(a)
|
||||
// CHECK: #pragma omp target parallel for schedule(dynamic) default(none) linear(a) allocate(a)
|
||||
#pragma omp target parallel for schedule(dynamic) default(none) linear(a) allocate(a) order(concurrent)
|
||||
// CHECK: #pragma omp target parallel for schedule(dynamic) default(none) linear(a) allocate(a) order(concurrent)
|
||||
for (int i = 0; i < 2; ++i)
|
||||
a = 2;
|
||||
// CHECK-NEXT: for (int i = 0; i < 2; ++i)
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -std=c++11 -o - %s -Wuninitialized
|
||||
// RUN: %clang_cc1 -verify=expected,omp45 -fopenmp -fopenmp-version=45 -ferror-limit 100 -std=c++11 -o - %s -Wuninitialized
|
||||
// RUN: %clang_cc1 -verify=expected,omp50 -fopenmp -fopenmp-version=50 -ferror-limit 100 -std=c++11 -o - %s -Wuninitialized
|
||||
|
||||
// RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 -std=c++11 -o - %s -Wuninitialized
|
||||
// RUN: %clang_cc1 -verify=expected,omp45 -fopenmp-simd -fopenmp-version=45 -ferror-limit 100 -std=c++11 -o - %s -Wuninitialized
|
||||
// RUN: %clang_cc1 -verify=expected,omp50 -fopenmp-simd -fopenmp-version=50 -ferror-limit 100 -std=c++11 -o - %s -Wuninitialized
|
||||
|
||||
void xxx(int argc) {
|
||||
int x; // expected-note {{initialize the variable 'x' to silence this warning}}
|
||||
|
@ -97,5 +99,20 @@ void test_ordered() {
|
|||
#pragma omp target parallel for ordered ordered // expected-error {{directive '#pragma omp target parallel for' cannot contain more than one 'ordered' clause}}
|
||||
for (int i = 0; i < 16; ++i)
|
||||
;
|
||||
#pragma omp target parallel for order // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp target parallel for'}} expected-error {{expected '(' after 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target parallel for order( // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp target parallel for'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target parallel for order(none // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp target parallel for'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target parallel for order(concurrent // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp target parallel for'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target parallel for order(concurrent) // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp target parallel for'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
}
|
||||
|
||||
|
|
|
@ -115,13 +115,13 @@ T tmain(T argc, T *argv) {
|
|||
// CHECK-NEXT: }
|
||||
|
||||
#ifdef OMP5
|
||||
#pragma omp target parallel for simd if(target:argc > 0) if (simd: argc) nontemporal(argc, c, d)
|
||||
#pragma omp target parallel for simd if(target:argc > 0) if (simd: argc) nontemporal(argc, c, d) order(concurrent)
|
||||
#else
|
||||
#pragma omp target parallel for simd if(target:argc > 0)
|
||||
#endif // OMP5
|
||||
for (T i = 0; i < 2; ++i) {}
|
||||
// OMP45: #pragma omp target parallel for simd if(target: argc > 0)
|
||||
// OMP50: #pragma omp target parallel for simd if(target: argc > 0) if(simd: argc) nontemporal(argc,c,d)
|
||||
// OMP50: #pragma omp target parallel for simd if(target: argc > 0) if(simd: argc) nontemporal(argc,c,d) order(concurrent)
|
||||
// CHECK-NEXT: for (T i = 0; i < 2; ++i) {
|
||||
// CHECK-NEXT: }
|
||||
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -fopenmp -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp4 %s -Wno-openmp-mapping -Wuninitialized
|
||||
// RUN: %clang_cc1 -fsyntax-only -fopenmp -fopenmp-version=50 -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp5 %s -Wno-openmp-mapping -Wuninitialized
|
||||
// RUN: %clang_cc1 -fsyntax-only -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp45 %s -Wno-openmp-mapping -Wuninitialized
|
||||
// RUN: %clang_cc1 -fsyntax-only -fopenmp -fopenmp-version=50 -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp50 %s -Wno-openmp-mapping -Wuninitialized
|
||||
|
||||
// RUN: %clang_cc1 -fsyntax-only -fopenmp-simd -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp4 %s -Wno-openmp-mapping -Wuninitialized
|
||||
// RUN: %clang_cc1 -fsyntax-only -fopenmp-simd -fopenmp-version=50 -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp5 %s -Wno-openmp-mapping -Wuninitialized
|
||||
// RUN: %clang_cc1 -fsyntax-only -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp45 %s -Wno-openmp-mapping -Wuninitialized
|
||||
// RUN: %clang_cc1 -fsyntax-only -fopenmp-simd -fopenmp-version=50 -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp50 %s -Wno-openmp-mapping -Wuninitialized
|
||||
|
||||
class S {
|
||||
int a;
|
||||
|
@ -94,28 +94,28 @@ int test_iteration_spaces() {
|
|||
for (((ii)) = 0; ii < 10; ++ii)
|
||||
c[ii] = a[ii];
|
||||
|
||||
// omp4-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} omp5-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}}
|
||||
// omp45-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} omp50-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}}
|
||||
#pragma omp target parallel for simd
|
||||
for (int i = 0; i; i++)
|
||||
c[i] = a[i];
|
||||
|
||||
// omp4-error@+3 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} omp5-error@+3 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}}
|
||||
// omp45-error@+3 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} omp50-error@+3 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}}
|
||||
// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'i'}}
|
||||
#pragma omp target parallel for simd
|
||||
for (int i = 0; jj < kk; ii++)
|
||||
c[i] = a[i];
|
||||
|
||||
// omp4-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} omp5-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}}
|
||||
// omp45-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} omp50-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}}
|
||||
#pragma omp target parallel for simd
|
||||
for (int i = 0; !!i; i++)
|
||||
c[i] = a[i];
|
||||
|
||||
// omp4-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}}
|
||||
// omp45-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}}
|
||||
#pragma omp target parallel for simd
|
||||
for (int i = 0; i != 1; i++)
|
||||
c[i] = a[i];
|
||||
|
||||
// omp4-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} omp5-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}}
|
||||
// omp45-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} omp50-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}}
|
||||
#pragma omp target parallel for simd
|
||||
for (int i = 0;; i++)
|
||||
c[i] = a[i];
|
||||
|
@ -251,14 +251,14 @@ int test_iteration_spaces() {
|
|||
for (ii = 0; ii < 10; ii++)
|
||||
c[ii] = a[ii];
|
||||
|
||||
// omp4-note@+2 {{defined as private}}
|
||||
// omp4-error@+2 {{loop iteration variable in the associated loop of 'omp target parallel for simd' directive may not be private, predetermined as linear}}
|
||||
// omp45-note@+2 {{defined as private}}
|
||||
// omp45-error@+2 {{loop iteration variable in the associated loop of 'omp target parallel for simd' directive may not be private, predetermined as linear}}
|
||||
#pragma omp target parallel for simd private(ii)
|
||||
for (ii = 0; ii < 10; ii++)
|
||||
c[ii] = a[ii];
|
||||
|
||||
// omp4-note@+2 {{defined as lastprivate}}
|
||||
// omp4-error@+2 {{loop iteration variable in the associated loop of 'omp target parallel for simd' directive may not be lastprivate, predetermined as linear}}
|
||||
// omp45-note@+2 {{defined as lastprivate}}
|
||||
// omp45-error@+2 {{loop iteration variable in the associated loop of 'omp target parallel for simd' directive may not be lastprivate, predetermined as linear}}
|
||||
#pragma omp target parallel for simd lastprivate(ii)
|
||||
for (ii = 0; ii < 10; ii++)
|
||||
c[ii] = a[ii];
|
||||
|
@ -283,7 +283,7 @@ int test_iteration_spaces() {
|
|||
c[globalii] += a[globalii] + ii;
|
||||
}
|
||||
|
||||
// omp4-error@+2 {{statement after '#pragma omp target parallel for simd' must be a for loop}}
|
||||
// omp45-error@+2 {{statement after '#pragma omp target parallel for simd' must be a for loop}}
|
||||
#pragma omp target parallel for simd
|
||||
for (auto &item : a) {
|
||||
item = item + 1;
|
||||
|
@ -420,15 +420,15 @@ int test_with_random_access_iterator() {
|
|||
#pragma omp target parallel for simd
|
||||
for (begin = end; begin < end; ++begin)
|
||||
++begin;
|
||||
// omp4-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}} omp5-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'I'}}
|
||||
// omp45-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}} omp50-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'I'}}
|
||||
#pragma omp target parallel for simd
|
||||
for (GoodIter I = begin; I - I; ++I)
|
||||
++I;
|
||||
// omp4-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}} omp5-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'I'}}
|
||||
// omp45-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}} omp50-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'I'}}
|
||||
#pragma omp target parallel for simd
|
||||
for (GoodIter I = begin; begin < end; ++I)
|
||||
++I;
|
||||
// omp4-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}} omp5-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'I'}}
|
||||
// omp45-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}} omp50-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'I'}}
|
||||
#pragma omp target parallel for simd
|
||||
for (GoodIter I = begin; !I; ++I)
|
||||
++I;
|
||||
|
@ -630,4 +630,19 @@ void test_loop_firstprivate_lastprivate() {
|
|||
#pragma omp target parallel for simd lastprivate(s) firstprivate(s)
|
||||
for (int i = 0; i < 16; ++i)
|
||||
;
|
||||
#pragma omp target parallel for simd order // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp target parallel for simd'}} expected-error {{expected '(' after 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target parallel for simd order( // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp target parallel for simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target parallel for simd order(none // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp target parallel for simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target parallel for simd order(concurrent // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp target parallel for simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target parallel for simd order(concurrent) // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp target parallel for simd'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
}
|
||||
|
|
|
@ -242,13 +242,13 @@ int main(int argc, char **argv) {
|
|||
// CHECK-NEXT: }
|
||||
|
||||
#ifdef OMP5
|
||||
#pragma omp target simd if (target:argc > 0) if(simd:argc) nontemporal(argc, c, d) lastprivate(conditional: d, f)
|
||||
#pragma omp target simd if (target:argc > 0) if(simd:argc) nontemporal(argc, c, d) lastprivate(conditional: d, f) order(concurrent)
|
||||
#else
|
||||
#pragma omp target simd if (target:argc > 0)
|
||||
#endif // OMP5
|
||||
for (int i = 0; i < 2; ++i) {}
|
||||
// OMP45: #pragma omp target simd if(target: argc > 0)
|
||||
// OMP50: #pragma omp target simd if(target: argc > 0) if(simd: argc) nontemporal(argc,c,d) lastprivate(conditional: d,f)
|
||||
// OMP50: #pragma omp target simd if(target: argc > 0) if(simd: argc) nontemporal(argc,c,d) lastprivate(conditional: d,f) order(concurrent)
|
||||
// CHECK-NEXT: for (int i = 0; i < 2; ++i) {
|
||||
// CHECK-NEXT: }
|
||||
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -fopenmp -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp4 %s -Wno-openmp-mapping -Wuninitialized
|
||||
// RUN: %clang_cc1 -fsyntax-only -fopenmp -fopenmp-version=50 -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp5 %s -Wno-openmp-mapping -Wuninitialized
|
||||
// RUN: %clang_cc1 -fsyntax-only -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp45 %s -Wno-openmp-mapping -Wuninitialized
|
||||
// RUN: %clang_cc1 -fsyntax-only -fopenmp -fopenmp-version=50 -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp50 %s -Wno-openmp-mapping -Wuninitialized
|
||||
|
||||
// RUN: %clang_cc1 -fsyntax-only -fopenmp-simd -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp4 %s -Wno-openmp-mapping -Wuninitialized
|
||||
// RUN: %clang_cc1 -fsyntax-only -fopenmp-simd -fopenmp-version=50 -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp5 %s -Wno-openmp-mapping -Wuninitialized
|
||||
// RUN: %clang_cc1 -fsyntax-only -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp45 %s -Wno-openmp-mapping -Wuninitialized
|
||||
// RUN: %clang_cc1 -fsyntax-only -fopenmp-simd -fopenmp-version=50 -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp50 %s -Wno-openmp-mapping -Wuninitialized
|
||||
|
||||
class S {
|
||||
int a;
|
||||
|
@ -94,28 +94,28 @@ int test_iteration_spaces() {
|
|||
for (((ii)) = 0; ii < 10; ++ii)
|
||||
c[ii] = a[ii];
|
||||
|
||||
// omp4-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} omp5-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}}
|
||||
// omp45-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} omp50-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}}
|
||||
#pragma omp target simd
|
||||
for (int i = 0; i; i++)
|
||||
c[i] = a[i];
|
||||
|
||||
// omp4-error@+3 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} omp5-error@+3 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}}
|
||||
// omp45-error@+3 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} omp50-error@+3 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}}
|
||||
// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'i'}}
|
||||
#pragma omp target simd
|
||||
for (int i = 0; jj < kk; ii++)
|
||||
c[i] = a[i];
|
||||
|
||||
// omp4-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} omp5-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}}
|
||||
// omp45-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} omp50-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}}
|
||||
#pragma omp target simd
|
||||
for (int i = 0; !!i; i++)
|
||||
c[i] = a[i];
|
||||
|
||||
// omp4-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}}
|
||||
// omp45-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}}
|
||||
#pragma omp target simd
|
||||
for (int i = 0; i != 1; i++)
|
||||
c[i] = a[i];
|
||||
|
||||
// omp4-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} omp5-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}}
|
||||
// omp45-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} omp50-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}}
|
||||
#pragma omp target simd
|
||||
for (int i = 0;; i++)
|
||||
c[i] = a[i];
|
||||
|
@ -251,14 +251,14 @@ int test_iteration_spaces() {
|
|||
for (ii = 0; ii < 10; ii++)
|
||||
c[ii] = a[ii];
|
||||
|
||||
// omp4-note@+2 {{defined as private}}
|
||||
// omp4-error@+2 {{loop iteration variable in the associated loop of 'omp target simd' directive may not be private, predetermined as linear}}
|
||||
// omp45-note@+2 {{defined as private}}
|
||||
// omp45-error@+2 {{loop iteration variable in the associated loop of 'omp target simd' directive may not be private, predetermined as linear}}
|
||||
#pragma omp target simd private(ii)
|
||||
for (ii = 0; ii < 10; ii++)
|
||||
c[ii] = a[ii];
|
||||
|
||||
// omp4-note@+2 {{defined as lastprivate}}
|
||||
// omp4-error@+2 {{loop iteration variable in the associated loop of 'omp target simd' directive may not be lastprivate, predetermined as linear}}
|
||||
// omp45-note@+2 {{defined as lastprivate}}
|
||||
// omp45-error@+2 {{loop iteration variable in the associated loop of 'omp target simd' directive may not be lastprivate, predetermined as linear}}
|
||||
#pragma omp target simd lastprivate(ii)
|
||||
for (ii = 0; ii < 10; ii++)
|
||||
c[ii] = a[ii];
|
||||
|
@ -283,7 +283,7 @@ int test_iteration_spaces() {
|
|||
c[globalii] += a[globalii] + ii;
|
||||
}
|
||||
|
||||
// omp4-error@+2 {{statement after '#pragma omp target simd' must be a for loop}}
|
||||
// omp45-error@+2 {{statement after '#pragma omp target simd' must be a for loop}}
|
||||
#pragma omp target simd
|
||||
for (auto &item : a) {
|
||||
item = item + 1;
|
||||
|
@ -420,15 +420,15 @@ int test_with_random_access_iterator() {
|
|||
#pragma omp target simd
|
||||
for (begin = end; begin < end; ++begin)
|
||||
++begin;
|
||||
// omp4-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}} omp5-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'I'}}
|
||||
// omp45-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}} omp50-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'I'}}
|
||||
#pragma omp target simd
|
||||
for (GoodIter I = begin; I - I; ++I)
|
||||
++I;
|
||||
// omp4-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}} omp5-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'I'}}
|
||||
// omp45-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}} omp50-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'I'}}
|
||||
#pragma omp target simd
|
||||
for (GoodIter I = begin; begin < end; ++I)
|
||||
++I;
|
||||
// omp4-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}} omp5-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'I'}}
|
||||
// omp45-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}} omp50-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'I'}}
|
||||
#pragma omp target simd
|
||||
for (GoodIter I = begin; !I; ++I)
|
||||
++I;
|
||||
|
@ -630,4 +630,19 @@ void test_loop_firstprivate_lastprivate() {
|
|||
#pragma omp target simd lastprivate(s) firstprivate(s)
|
||||
for (int i = 0; i < 16; ++i)
|
||||
;
|
||||
#pragma omp target simd order // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp target simd'}} expected-error {{expected '(' after 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target simd order( // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp target simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target simd order(none // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp target simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target simd order(concurrent // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp target simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target simd order(concurrent) // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp target simd'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
}
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
// RUN: %clang_cc1 -verify -fopenmp -ast-print %s -Wno-openmp-mapping | FileCheck %s
|
||||
// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s -Wno-openmp-mapping
|
||||
// RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s
|
||||
// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=50 -ast-print %s -Wno-openmp-mapping | FileCheck %s
|
||||
// RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s -Wno-openmp-mapping
|
||||
// RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s
|
||||
|
||||
// RUN: %clang_cc1 -verify -fopenmp-simd -ast-print %s -Wno-openmp-mapping | FileCheck %s
|
||||
// RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -emit-pch -o %t %s -Wno-openmp-mapping
|
||||
// RUN: %clang_cc1 -fopenmp-simd -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s
|
||||
// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=50 -ast-print %s -Wno-openmp-mapping | FileCheck %s
|
||||
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s -Wno-openmp-mapping
|
||||
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s
|
||||
// expected-no-diagnostics
|
||||
|
||||
#ifndef HEADER
|
||||
|
@ -96,11 +96,11 @@ T tmain(T argc) {
|
|||
// CHECK: #pragma omp target teams distribute parallel for{{$}}
|
||||
// CHECK-NEXT: for (int i = 0; i < 2; ++i)
|
||||
// CHECK-NEXT: a = 2;
|
||||
#pragma omp target teams distribute parallel for private(argc, b), firstprivate(c, d), collapse(2)
|
||||
#pragma omp target teams distribute parallel for private(argc, b), firstprivate(c, d), collapse(2) order(concurrent)
|
||||
for (int i = 0; i < 10; ++i)
|
||||
for (int j = 0; j < 10; ++j)
|
||||
foo();
|
||||
// CHECK: #pragma omp target teams distribute parallel for private(argc,b) firstprivate(c,d) collapse(2)
|
||||
// CHECK: #pragma omp target teams distribute parallel for private(argc,b) firstprivate(c,d) collapse(2) order(concurrent)
|
||||
// CHECK-NEXT: for (int i = 0; i < 10; ++i)
|
||||
// CHECK-NEXT: for (int j = 0; j < 10; ++j)
|
||||
// CHECK-NEXT: foo();
|
||||
|
@ -113,7 +113,7 @@ T tmain(T argc) {
|
|||
foo();
|
||||
// CHECK: #pragma omp target teams distribute parallel for
|
||||
// CHECK-NEXT: for (int i = 0; i < 10; ++i)
|
||||
// CHECK-NEXT: foo();
|
||||
// CHECK-NEXT: foo();
|
||||
#pragma omp target teams distribute parallel for default(none), private(b) firstprivate(argc) shared(d) reduction(+:c) reduction(max:e) num_teams(f) thread_limit(d)
|
||||
for (int k = 0; k < 10; ++k)
|
||||
e += d + argc;
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
// RUN: %clang_cc1 -verify -fopenmp -std=c++11 %s -Wuninitialized
|
||||
// RUN: %clang_cc1 -verify=expected,omp45 -fopenmp -fopenmp-version=45 -std=c++11 %s -Wuninitialized
|
||||
// RUN: %clang_cc1 -verify=expected,omp50 -fopenmp -fopenmp-version=50 -std=c++11 %s -Wuninitialized
|
||||
|
||||
// RUN: %clang_cc1 -verify -fopenmp-simd -std=c++11 %s -Wuninitialized
|
||||
// RUN: %clang_cc1 -verify=expected,omp45 -fopenmp-simd -fopenmp-version=45 -std=c++11 %s -Wuninitialized
|
||||
// RUN: %clang_cc1 -verify=expected,omp50 -fopenmp-simd -fopenmp-version=50 -std=c++11 %s -Wuninitialized
|
||||
|
||||
void xxx(int argc) {
|
||||
int x; // expected-note {{initialize the variable 'x' to silence this warning}}
|
||||
|
@ -76,7 +78,7 @@ L1:
|
|||
#pragma omp target teams distribute parallel for
|
||||
for (int i = 0; i < argc; ++i)
|
||||
L2: foo();
|
||||
|
||||
|
||||
#pragma omp target teams distribute parallel for
|
||||
for (int i = 0; i < argc; ++i) {
|
||||
return 1; // expected-error {{cannot return from OpenMP region}}
|
||||
|
@ -97,5 +99,20 @@ void test_ordered() {
|
|||
#pragma omp target teams distribute parallel for ordered // expected-error {{unexpected OpenMP clause 'ordered' in directive '#pragma omp target teams distribute parallel for'}}
|
||||
for (int i = 0; i < 16; ++i)
|
||||
;
|
||||
#pragma omp target teams distribute parallel for order // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp target teams distribute parallel for'}} expected-error {{expected '(' after 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target teams distribute parallel for order( // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp target teams distribute parallel for'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target teams distribute parallel for order(none // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp target teams distribute parallel for'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target teams distribute parallel for order(concurrent // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp target teams distribute parallel for'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target teams distribute parallel for order(concurrent) // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp target teams distribute parallel for'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
// RUN: %clang_cc1 -verify -fopenmp -ast-print %s -Wno-openmp-mapping | FileCheck %s
|
||||
// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s -Wno-openmp-mapping
|
||||
// RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s
|
||||
// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=50 -ast-print %s -Wno-openmp-mapping | FileCheck %s
|
||||
// RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s -Wno-openmp-mapping
|
||||
// RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s
|
||||
|
||||
// RUN: %clang_cc1 -verify -fopenmp-simd -ast-print %s -Wno-openmp-mapping | FileCheck %s
|
||||
// RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -emit-pch -o %t %s -Wno-openmp-mapping
|
||||
// RUN: %clang_cc1 -fopenmp-simd -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s
|
||||
// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=50 -ast-print %s -Wno-openmp-mapping | FileCheck %s
|
||||
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s -Wno-openmp-mapping
|
||||
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s
|
||||
// expected-no-diagnostics
|
||||
|
||||
#ifndef HEADER
|
||||
|
@ -168,11 +168,11 @@ int main (int argc, char **argv) {
|
|||
// CHECK: #pragma omp target teams distribute parallel for simd
|
||||
// CHECK-NEXT: for (int i = 0; i < 2; ++i)
|
||||
// CHECK-NEXT: a = 2;
|
||||
#pragma omp target teams distribute parallel for simd private(argc,b),firstprivate(argv, c), collapse(2)
|
||||
#pragma omp target teams distribute parallel for simd private(argc,b),firstprivate(argv, c), collapse(2) order(concurrent)
|
||||
for (int i = 0; i < 10; ++i)
|
||||
for (int j = 0; j < 10; ++j)
|
||||
foo();
|
||||
// CHECK: #pragma omp target teams distribute parallel for simd private(argc,b) firstprivate(argv,c) collapse(2)
|
||||
// CHECK: #pragma omp target teams distribute parallel for simd private(argc,b) firstprivate(argv,c) collapse(2) order(concurrent)
|
||||
// CHECK-NEXT: for (int i = 0; i < 10; ++i)
|
||||
// CHECK-NEXT: for (int j = 0; j < 10; ++j)
|
||||
// CHECK-NEXT: foo();
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -fopenmp -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp4 %s -Wno-openmp-mapping -Wuninitialized
|
||||
// RUN: %clang_cc1 -fsyntax-only -fopenmp -fopenmp-version=50 -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp5 %s -Wno-openmp-mapping -Wuninitialized
|
||||
// RUN: %clang_cc1 -fsyntax-only -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp45 %s -Wno-openmp-mapping -Wuninitialized
|
||||
// RUN: %clang_cc1 -fsyntax-only -fopenmp -fopenmp-version=50 -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp50 %s -Wno-openmp-mapping -Wuninitialized
|
||||
|
||||
// RUN: %clang_cc1 -fsyntax-only -fopenmp-simd -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp4 %s -Wno-openmp-mapping -Wuninitialized
|
||||
// RUN: %clang_cc1 -fsyntax-only -fopenmp-simd -fopenmp-version=50 -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp5 %s -Wno-openmp-mapping -Wuninitialized
|
||||
// RUN: %clang_cc1 -fsyntax-only -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp45 %s -Wno-openmp-mapping -Wuninitialized
|
||||
// RUN: %clang_cc1 -fsyntax-only -fopenmp-simd -fopenmp-version=50 -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp50 %s -Wno-openmp-mapping -Wuninitialized
|
||||
|
||||
class S {
|
||||
int a;
|
||||
|
@ -95,28 +95,28 @@ int test_iteration_spaces() {
|
|||
c[ii] = a[ii];
|
||||
|
||||
#pragma omp target teams distribute parallel for simd
|
||||
// omp4-error@+1 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} omp5-error@+1 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}}
|
||||
// omp45-error@+1 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} omp50-error@+1 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}}
|
||||
for (int i = 0; i; i++)
|
||||
c[i] = a[i];
|
||||
|
||||
#pragma omp target teams distribute parallel for simd
|
||||
// omp4-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} omp5-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}}
|
||||
// omp45-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} omp50-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}}
|
||||
// expected-error@+1 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'i'}}
|
||||
for (int i = 0; jj < kk; ii++)
|
||||
c[i] = a[i];
|
||||
|
||||
#pragma omp target teams distribute parallel for simd
|
||||
// omp4-error@+1 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} omp5-error@+1 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}}
|
||||
// omp45-error@+1 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} omp50-error@+1 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}}
|
||||
for (int i = 0; !!i; i++)
|
||||
c[i] = a[i];
|
||||
|
||||
// omp4-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}}
|
||||
// omp45-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}}
|
||||
#pragma omp target teams distribute parallel for simd
|
||||
for (int i = 0; i != 1; i++)
|
||||
c[i] = a[i];
|
||||
|
||||
#pragma omp target teams distribute parallel for simd
|
||||
// omp4-error@+1 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} omp5-error@+1 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}}
|
||||
// omp45-error@+1 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} omp50-error@+1 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}}
|
||||
for (int i = 0;; i++)
|
||||
c[i] = a[i];
|
||||
|
||||
|
@ -247,13 +247,13 @@ int test_iteration_spaces() {
|
|||
for (ii = 0; ii < 10; ii++)
|
||||
c[ii] = a[ii];
|
||||
|
||||
// omp4-error@+2 {{loop iteration variable in the associated loop of 'omp target teams distribute parallel for simd' directive may not be private, predetermined as linear}}
|
||||
#pragma omp target teams distribute parallel for simd private(ii) // omp4-note {{defined as private}}
|
||||
// omp45-error@+2 {{loop iteration variable in the associated loop of 'omp target teams distribute parallel for simd' directive may not be private, predetermined as linear}}
|
||||
#pragma omp target teams distribute parallel for simd private(ii) // omp45-note {{defined as private}}
|
||||
for (ii = 0; ii < 10; ii++)
|
||||
c[ii] = a[ii];
|
||||
|
||||
// omp4-error@+2 {{loop iteration variable in the associated loop of 'omp target teams distribute parallel for simd' directive may not be lastprivate, predetermined as linear}}
|
||||
#pragma omp target teams distribute parallel for simd lastprivate(ii) // omp4-note {{defined as lastprivate}}
|
||||
// omp45-error@+2 {{loop iteration variable in the associated loop of 'omp target teams distribute parallel for simd' directive may not be lastprivate, predetermined as linear}}
|
||||
#pragma omp target teams distribute parallel for simd lastprivate(ii) // omp45-note {{defined as lastprivate}}
|
||||
for (ii = 0; ii < 10; ii++)
|
||||
c[ii] = a[ii];
|
||||
|
||||
|
@ -269,7 +269,7 @@ int test_iteration_spaces() {
|
|||
c[globalii] += a[globalii] + ii;
|
||||
}
|
||||
|
||||
// omp4-error@+2 {{statement after '#pragma omp target teams distribute parallel for simd' must be a for loop}}
|
||||
// omp45-error@+2 {{statement after '#pragma omp target teams distribute parallel for simd' must be a for loop}}
|
||||
#pragma omp target teams distribute parallel for simd
|
||||
for (auto &item : a) {
|
||||
item = item + 1;
|
||||
|
@ -406,15 +406,15 @@ int test_with_random_access_iterator() {
|
|||
for (begin = end; begin < end; ++begin)
|
||||
++begin;
|
||||
#pragma omp target teams distribute parallel for simd
|
||||
// omp4-error@+1 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}} omp5-error@+1 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'I'}}
|
||||
// omp45-error@+1 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}} omp50-error@+1 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'I'}}
|
||||
for (GoodIter I = begin; I - I; ++I)
|
||||
++I;
|
||||
#pragma omp target teams distribute parallel for simd
|
||||
// omp4-error@+1 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}} omp5-error@+1 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'I'}}
|
||||
// omp45-error@+1 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}} omp50-error@+1 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'I'}}
|
||||
for (GoodIter I = begin; begin < end; ++I)
|
||||
++I;
|
||||
#pragma omp target teams distribute parallel for simd
|
||||
// omp4-error@+1 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}} omp5-error@+1 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'I'}}
|
||||
// omp45-error@+1 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}} omp50-error@+1 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'I'}}
|
||||
for (GoodIter I = begin; !I; ++I)
|
||||
++I;
|
||||
#pragma omp target teams distribute parallel for simd
|
||||
|
@ -628,5 +628,20 @@ void test_nowait() {
|
|||
#pragma omp target teams distribute parallel for simd nowait nowait // expected-error {{directive '#pragma omp target teams distribute parallel for simd' cannot contain more than one 'nowait' clause}}
|
||||
for (int i = 0; i < 16; ++i)
|
||||
;
|
||||
#pragma omp target teams distribute parallel for simd order // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp target teams distribute parallel for simd'}} expected-error {{expected '(' after 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target teams distribute parallel for simd order( // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp target teams distribute parallel for simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target teams distribute parallel for simd order(none // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp target teams distribute parallel for simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target teams distribute parallel for simd order(concurrent // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp target teams distribute parallel for simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target teams distribute parallel for simd order(concurrent) // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp target teams distribute parallel for simd'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
}
|
||||
|
||||
|
|
|
@ -198,14 +198,14 @@ int main (int argc, char **argv) {
|
|||
// CHECK-NEXT: for (int k = 0; k < 10; ++k)
|
||||
// CHECK-NEXT: e += d + argc;
|
||||
#ifdef OMP5
|
||||
#pragma omp target teams distribute simd safelen(clen-1) aligned(arr:N+6) if(simd:argc) nontemporal(argc, c, d)
|
||||
#pragma omp target teams distribute simd safelen(clen-1) aligned(arr:N+6) if(simd:argc) nontemporal(argc, c, d) order(concurrent)
|
||||
#else
|
||||
#pragma omp target teams distribute simd safelen(clen-1) aligned(arr:N+6)
|
||||
#endif // OMP5
|
||||
for (int k = 0; k < 10; ++k)
|
||||
e += d + argc + arr[k];
|
||||
// OMP45: #pragma omp target teams distribute simd safelen(clen - 1) aligned(arr: N + 6)
|
||||
// OMP50: #pragma omp target teams distribute simd safelen(clen - 1) aligned(arr: N + 6) if(simd: argc) nontemporal(argc,c,d)
|
||||
// OMP50: #pragma omp target teams distribute simd safelen(clen - 1) aligned(arr: N + 6) if(simd: argc) nontemporal(argc,c,d) order(concurrent)
|
||||
// CHECK-NEXT: for (int k = 0; k < 10; ++k)
|
||||
// CHECK-NEXT: e += d + argc + arr[k];
|
||||
return (0);
|
||||
|
|
|
@ -403,5 +403,20 @@ void test_nontemporal() {
|
|||
#pragma omp target teams distribute simd lastprivate(x) nontemporal(x)
|
||||
for (i = 0; i < 16; ++i)
|
||||
;
|
||||
#pragma omp target teams distribute simd order // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp target teams distribute simd'}} expected-error {{expected '(' after 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target teams distribute simd order( // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp target teams distribute simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target teams distribute simd order(none // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp target teams distribute simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target teams distribute simd order(concurrent // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp target teams distribute simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target teams distribute simd order(concurrent) // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp target teams distribute simd'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
}
|
||||
|
||||
|
|
|
@ -76,7 +76,7 @@ int main(int argc, char **argv) {
|
|||
// CHECK-NEXT: a = 2;
|
||||
#pragma omp parallel
|
||||
#ifdef OMP5
|
||||
#pragma omp taskloop simd private(argc, b), firstprivate(argv, c), lastprivate(d, f) collapse(2) shared(g) if(simd: argc) mergeable priority(argc) simdlen(16) grainsize(argc) reduction(max: a, e) nontemporal(argc, c, d)
|
||||
#pragma omp taskloop simd private(argc, b), firstprivate(argv, c), lastprivate(d, f) collapse(2) shared(g) if(simd: argc) mergeable priority(argc) simdlen(16) grainsize(argc) reduction(max: a, e) nontemporal(argc, c, d) order(concurrent)
|
||||
#else
|
||||
#pragma omp taskloop simd private(argc, b), firstprivate(argv, c), lastprivate(d, f) collapse(2) shared(g) if(argc) mergeable priority(argc) simdlen(16) grainsize(argc) reduction(max: a, e)
|
||||
#endif // OMP5
|
||||
|
@ -84,7 +84,7 @@ int main(int argc, char **argv) {
|
|||
for (int j = 0; j < 10; ++j)
|
||||
foo();
|
||||
// CHECK-NEXT: #pragma omp parallel
|
||||
// OMP50-NEXT: #pragma omp taskloop simd private(argc,b) firstprivate(argv,c) lastprivate(d,f) collapse(2) shared(g) if(simd: argc) mergeable priority(argc) simdlen(16) grainsize(argc) reduction(max: a,e) nontemporal(argc,c,d)
|
||||
// OMP50-NEXT: #pragma omp taskloop simd private(argc,b) firstprivate(argv,c) lastprivate(d,f) collapse(2) shared(g) if(simd: argc) mergeable priority(argc) simdlen(16) grainsize(argc) reduction(max: a,e) nontemporal(argc,c,d) order(concurrent)
|
||||
// OMP45-NEXT: #pragma omp taskloop simd private(argc,b) firstprivate(argv,c) lastprivate(d,f) collapse(2) shared(g) if(argc) mergeable priority(argc) simdlen(16) grainsize(argc) reduction(max: a,e)
|
||||
// CHECK-NEXT: for (int i = 0; i < 10; ++i)
|
||||
// CHECK-NEXT: for (int j = 0; j < 10; ++j)
|
||||
|
|
|
@ -467,5 +467,20 @@ void test_nontemporal() {
|
|||
#pragma omp taskloop simd lastprivate(x) nontemporal(x)
|
||||
for (i = 0; i < 16; ++i)
|
||||
;
|
||||
#pragma omp taskloop simd order // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp taskloop simd'}} expected-error {{expected '(' after 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp taskloop simd order( // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp taskloop simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp taskloop simd order(none // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp taskloop simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp taskloop simd order(concurrent // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp taskloop simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp taskloop simd order(concurrent) // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp taskloop simd'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
// RUN: %clang_cc1 -verify -fopenmp -ast-print %s -Wno-openmp-mapping | FileCheck %s
|
||||
// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s
|
||||
// RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s
|
||||
// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=50 -ast-print %s -Wno-openmp-mapping | FileCheck %s
|
||||
// RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s
|
||||
// RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s
|
||||
|
||||
// RUN: %clang_cc1 -verify -fopenmp-simd -ast-print %s -Wno-openmp-mapping | FileCheck %s
|
||||
// RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -emit-pch -o %t %s
|
||||
// RUN: %clang_cc1 -fopenmp-simd -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s
|
||||
// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=50 -ast-print %s -Wno-openmp-mapping | FileCheck %s
|
||||
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s
|
||||
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s
|
||||
// expected-no-diagnostics
|
||||
|
||||
#ifndef HEADER
|
||||
|
@ -112,12 +112,12 @@ T tmain(T argc) {
|
|||
// CHECK-NEXT: for (int i = 0; i < 2; ++i)
|
||||
// CHECK-NEXT: a = 2;
|
||||
#pragma omp target
|
||||
#pragma omp teams distribute parallel for private(argc, b), firstprivate(c, d), collapse(2)
|
||||
#pragma omp teams distribute parallel for private(argc, b), firstprivate(c, d), collapse(2) order(concurrent)
|
||||
for (int i = 0; i < 10; ++i)
|
||||
for (int j = 0; j < 10; ++j)
|
||||
foo();
|
||||
// CHECK: #pragma omp target
|
||||
// CHECK-NEXT: #pragma omp teams distribute parallel for private(argc,b) firstprivate(c,d) collapse(2)
|
||||
// CHECK-NEXT: #pragma omp teams distribute parallel for private(argc,b) firstprivate(c,d) collapse(2) order(concurrent)
|
||||
// CHECK-NEXT: for (int i = 0; i < 10; ++i)
|
||||
// CHECK-NEXT: for (int j = 0; j < 10; ++j)
|
||||
// CHECK-NEXT: foo();
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
// RUN: %clang_cc1 -verify -fopenmp -std=c++11 %s -Wuninitialized
|
||||
// RUN: %clang_cc1 -verify=expected,omp45 -fopenmp -fopenmp-version=45 -std=c++11 %s -Wuninitialized
|
||||
// RUN: %clang_cc1 -verify=expected,omp50 -fopenmp -fopenmp-version=50 -std=c++11 %s -Wuninitialized
|
||||
|
||||
// RUN: %clang_cc1 -verify -fopenmp-simd -std=c++11 %s -Wuninitialized
|
||||
// RUN: %clang_cc1 -verify=expected,omp45 -fopenmp-simd -fopenmp-version=45 -std=c++11 %s -Wuninitialized
|
||||
// RUN: %clang_cc1 -verify=expected,omp50 -fopenmp-simd -fopenmp-version=50 -std=c++11 %s -Wuninitialized
|
||||
|
||||
void xxx(int argc) {
|
||||
int x; // expected-note {{initialize the variable 'x' to silence this warning}}
|
||||
|
@ -118,6 +120,26 @@ void test_ordered() {
|
|||
#pragma omp teams distribute parallel for ordered // expected-error {{unexpected OpenMP clause 'ordered' in directive '#pragma omp teams distribute parallel for'}}
|
||||
for (int i = 0; i < 16; ++i)
|
||||
;
|
||||
#pragma omp target
|
||||
#pragma omp teams distribute parallel for order // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp teams distribute parallel for'}} expected-error {{expected '(' after 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target
|
||||
#pragma omp teams distribute parallel for order( // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp teams distribute parallel for'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target
|
||||
#pragma omp teams distribute parallel for order(none // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp teams distribute parallel for'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target
|
||||
#pragma omp teams distribute parallel for order(concurrent // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp teams distribute parallel for'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target
|
||||
#pragma omp teams distribute parallel for order(concurrent) // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp teams distribute parallel for'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
}
|
||||
|
||||
void test_cancel() {
|
||||
|
|
|
@ -157,7 +157,7 @@ T tmain(T argc) {
|
|||
// CHECK-NEXT: foo();
|
||||
#pragma omp target
|
||||
#ifdef OMP5
|
||||
#pragma omp teams distribute parallel for simd if(simd:argc) nontemporal(argc, c, d)
|
||||
#pragma omp teams distribute parallel for simd if(simd:argc) nontemporal(argc, c, d) order(concurrent)
|
||||
#else
|
||||
#pragma omp teams distribute parallel for simd
|
||||
#endif // OMP5
|
||||
|
@ -165,7 +165,7 @@ T tmain(T argc) {
|
|||
foo();
|
||||
// CHECK: #pragma omp target
|
||||
// OMP45-NEXT: #pragma omp teams distribute parallel for simd
|
||||
// OMP50-NEXT: #pragma omp teams distribute parallel for simd if(simd: argc) nontemporal(argc,c,d)
|
||||
// OMP50-NEXT: #pragma omp teams distribute parallel for simd if(simd: argc) nontemporal(argc,c,d) order(concurrent)
|
||||
// CHECK-NEXT: for (int i = 0; i < 10; ++i)
|
||||
// CHECK-NEXT: foo();
|
||||
#pragma omp target
|
||||
|
|
|
@ -221,5 +221,25 @@ void test_nontemporal() {
|
|||
#pragma omp teams distribute parallel for simd lastprivate(x) nontemporal(x)
|
||||
for (i = 0; i < 16; ++i)
|
||||
;
|
||||
#pragma omp target
|
||||
#pragma omp teams distribute parallel for simd order // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp teams distribute parallel for simd'}} expected-error {{expected '(' after 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target
|
||||
#pragma omp teams distribute parallel for simd order( // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp teams distribute parallel for simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target
|
||||
#pragma omp teams distribute parallel for simd order(none // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp teams distribute parallel for simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target
|
||||
#pragma omp teams distribute parallel for simd order(concurrent // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp teams distribute parallel for simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target
|
||||
#pragma omp teams distribute parallel for simd order(concurrent) // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp teams distribute parallel for simd'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
}
|
||||
|
||||
|
|
|
@ -243,7 +243,7 @@ int main (int argc, char **argv) {
|
|||
// CHECK-NEXT: e += d + argc;
|
||||
#pragma omp target
|
||||
#ifdef OMP5
|
||||
#pragma omp teams distribute simd safelen(clen-1) aligned(arr:N+6) if(simd:b) nontemporal(argc, c, d)
|
||||
#pragma omp teams distribute simd safelen(clen-1) aligned(arr:N+6) if(simd:b) nontemporal(argc, c, d) order(concurrent)
|
||||
#else
|
||||
#pragma omp teams distribute simd safelen(clen-1) aligned(arr:N+6)
|
||||
#endif
|
||||
|
@ -251,7 +251,7 @@ int main (int argc, char **argv) {
|
|||
e += d + argc + arr[k];
|
||||
// CHECK: #pragma omp target
|
||||
// OMP45-NEXT: #pragma omp teams distribute simd safelen(clen - 1) aligned(arr: N + 6)
|
||||
// OMP50-NEXT: #pragma omp teams distribute simd safelen(clen - 1) aligned(arr: N + 6) if(simd: b) nontemporal(argc,c,d)
|
||||
// OMP50-NEXT: #pragma omp teams distribute simd safelen(clen - 1) aligned(arr: N + 6) if(simd: b) nontemporal(argc,c,d) order(concurrent)
|
||||
// CHECK-NEXT: for (int k = 0; k < 10; ++k)
|
||||
// CHECK-NEXT: e += d + argc + arr[k];
|
||||
return (0);
|
||||
|
|
|
@ -221,5 +221,25 @@ void test_nontemporal() {
|
|||
#pragma omp teams distribute simd lastprivate(x) nontemporal(x)
|
||||
for (i = 0; i < 16; ++i)
|
||||
;
|
||||
#pragma omp target
|
||||
#pragma omp teams distribute simd order // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp teams distribute simd'}} expected-error {{expected '(' after 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target
|
||||
#pragma omp teams distribute simd order( // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp teams distribute simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target
|
||||
#pragma omp teams distribute simd order(none // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp teams distribute simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'concurrent' in OpenMP clause 'order'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target
|
||||
#pragma omp teams distribute simd order(concurrent // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp teams distribute simd'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
#pragma omp target
|
||||
#pragma omp teams distribute simd order(concurrent) // omp45-error {{unexpected OpenMP clause 'order' in directive '#pragma omp teams distribute simd'}}
|
||||
for (int i = 0; i < 10; ++i)
|
||||
;
|
||||
}
|
||||
|
||||
|
|
|
@ -2466,6 +2466,7 @@ void OMPClauseEnqueue::VisitOMPNontemporalClause(
|
|||
for (const auto *E : C->private_refs())
|
||||
Visitor->AddStmt(E);
|
||||
}
|
||||
void OMPClauseEnqueue::VisitOMPOrderClause(const OMPOrderClause *C) {}
|
||||
}
|
||||
|
||||
void EnqueueVisitor::EnqueueChildren(const OMPClause *S) {
|
||||
|
|
Loading…
Reference in New Issue