See OMP-5.0 2.19.5.5 task_reduction Clause.
To add a positive test case we need `taskgroup` directive which is not added hence skipping the test.
This is a dependency for `taskgroup` construct.
Reviewed By: clementval
Differential Revision: https://reviews.llvm.org/D93105
// variable-name-list)
struct OmpReductionClause {
TUPLE_CLASS_BOILERPLATE(OmpReductionClause);
- std::tuple<OmpReductionOperator, std::list<Designator>> t;
+ std::tuple<OmpReductionOperator, OmpObjectList> t;
};
// OMP 5.0 2.11.4 allocate-clause -> ALLOCATE ([allocator:] variable-name-list)
construct<OmpReductionOperator>(Parser<ProcedureDesignator>{}))
TYPE_PARSER(construct<OmpReductionClause>(
- Parser<OmpReductionOperator>{} / ":", nonemptyList(designator)))
+ Parser<OmpReductionOperator>{} / ":", Parser<OmpObjectList>{}))
// OMP 5.0 2.11.4 ALLOCATE ([allocator:] variable-name-list)
TYPE_PARSER(construct<OmpAllocateClause>(
parenthesized(Parser<OmpProcBindClause>{}))) ||
"REDUCTION" >>
construct<OmpClause>(parenthesized(Parser<OmpReductionClause>{})) ||
+ "TASK_REDUCTION" >>
+ construct<OmpClause>(construct<OmpClause::TaskReduction>(
+ parenthesized(Parser<OmpReductionClause>{}))) ||
"RELAXED" >> construct<OmpClause>(construct<OmpClause::Relaxed>()) ||
"RELEASE" >> construct<OmpClause>(construct<OmpClause::Release>()) ||
"SAFELEN" >> construct<OmpClause>(construct<OmpClause::Safelen>(
Word("REDUCTION(");
Walk(std::get<OmpReductionOperator>(x.t));
Put(":");
- Walk(std::get<std::list<Designator>>(x.t), ",");
+ Walk(std::get<OmpObjectList>(x.t));
Put(")");
}
void Unparse(const OmpAllocateClause &x) {
CHECK_SIMPLE_CLAUSE(Nogroup, OMPC_nogroup)
CHECK_SIMPLE_CLAUSE(Notinbranch, OMPC_notinbranch)
CHECK_SIMPLE_CLAUSE(Nowait, OMPC_nowait)
+CHECK_SIMPLE_CLAUSE(TaskReduction, OMPC_task_reduction)
CHECK_SIMPLE_CLAUSE(To, OMPC_to)
CHECK_SIMPLE_CLAUSE(Uniform, OMPC_uniform)
CHECK_SIMPLE_CLAUSE(Untied, OMPC_untied)
void Enter(const parser::OmpClause::Safelen &);
void Enter(const parser::OmpClause::Shared &);
void Enter(const parser::OmpClause::Simdlen &);
+ void Enter(const parser::OmpClause::TaskReduction &);
void Enter(const parser::OmpClause::ThreadLimit &);
void Enter(const parser::OmpClause::To &);
void Enter(const parser::OmpClause::Link &);
! collapse-clause
a = 0.0
- !$omp simd private(b) reduction(+:a)
+ !ERROR: TASK_REDUCTION clause is not allowed on the SIMD directive
+ !$omp simd private(b) reduction(+:a) task_reduction(+:a)
do i = 1, N
a = a + b + 3.14
enddo
enddo
!ERROR: At most one NUM_TASKS clause can appear on the TASKLOOP directive
- !$omp taskloop num_tasks(3) num_tasks(2)
+ !ERROR: TASK_REDUCTION clause is not allowed on the TASKLOOP directive
+ !$omp taskloop num_tasks(3) num_tasks(2) task_reduction(*:a)
do i = 1,N
a = 3.14
enddo
}
def OMPC_TaskReduction : Clause<"task_reduction"> {
let clangClass = "OMPTaskReductionClause";
+ let flangClassValue = "OmpReductionClause";
}
def OMPC_InReduction : Clause<"in_reduction"> {
let clangClass = "OMPInReductionClause";