xref: /llvm-project/flang/lib/Lower/OpenMP/Clauses.h (revision 15ab7be2e049bc0f4ea6744ca037395686a923bc)
1ea2cfcc1SKrzysztof Parzyszek //===-- Clauses.h -- OpenMP clause handling -------------------------------===//
2ea2cfcc1SKrzysztof Parzyszek //
3ea2cfcc1SKrzysztof Parzyszek // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4ea2cfcc1SKrzysztof Parzyszek // See https://llvm.org/LICENSE.txt for license information.
5ea2cfcc1SKrzysztof Parzyszek // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ea2cfcc1SKrzysztof Parzyszek //
7ea2cfcc1SKrzysztof Parzyszek //===----------------------------------------------------------------------===//
8ea2cfcc1SKrzysztof Parzyszek #ifndef FORTRAN_LOWER_OPENMP_CLAUSES_H
9ea2cfcc1SKrzysztof Parzyszek #define FORTRAN_LOWER_OPENMP_CLAUSES_H
10ea2cfcc1SKrzysztof Parzyszek 
11ea2cfcc1SKrzysztof Parzyszek #include "flang/Evaluate/expression.h"
12973fa983SKrzysztof Parzyszek #include "flang/Evaluate/type.h"
13ea2cfcc1SKrzysztof Parzyszek #include "flang/Parser/parse-tree.h"
14ea2cfcc1SKrzysztof Parzyszek #include "flang/Semantics/expression.h"
15ea2cfcc1SKrzysztof Parzyszek #include "flang/Semantics/semantics.h"
16ea2cfcc1SKrzysztof Parzyszek #include "flang/Semantics/symbol.h"
17ea2cfcc1SKrzysztof Parzyszek 
18ea2cfcc1SKrzysztof Parzyszek #include "llvm/ADT/STLExtras.h"
19148a5579SKrzysztof Parzyszek #include "llvm/Frontend/OpenMP/ClauseT.h"
20ea2cfcc1SKrzysztof Parzyszek 
21ea2cfcc1SKrzysztof Parzyszek #include <optional>
22ea2cfcc1SKrzysztof Parzyszek #include <type_traits>
23ea2cfcc1SKrzysztof Parzyszek #include <utility>
24ea2cfcc1SKrzysztof Parzyszek 
258b18f2feSKrzysztof Parzyszek namespace Fortran::semantics {
268b18f2feSKrzysztof Parzyszek class Symbol;
278b18f2feSKrzysztof Parzyszek }
288b18f2feSKrzysztof Parzyszek 
29f9e55796SKrzysztof Parzyszek namespace Fortran::lower::omp {
30ea2cfcc1SKrzysztof Parzyszek using namespace Fortran;
31ea2cfcc1SKrzysztof Parzyszek using SomeExpr = semantics::SomeExpr;
32ea2cfcc1SKrzysztof Parzyszek using MaybeExpr = semantics::MaybeExpr;
33973fa983SKrzysztof Parzyszek using TypeTy = evaluate::DynamicType;
34be7c9e39SKrzysztof Parzyszek 
35b025d691SKrzysztof Parzyszek template <typename ExprTy>
36b025d691SKrzysztof Parzyszek struct IdTyTemplate {
37b025d691SKrzysztof Parzyszek   // "symbol" is always non-null for id's of actual objects.
38b025d691SKrzysztof Parzyszek   Fortran::semantics::Symbol *symbol;
39b025d691SKrzysztof Parzyszek   std::optional<ExprTy> designator;
40b025d691SKrzysztof Parzyszek 
41b025d691SKrzysztof Parzyszek   bool operator==(const IdTyTemplate &other) const {
42b025d691SKrzysztof Parzyszek     // If symbols are different, then the objects are different.
43b025d691SKrzysztof Parzyszek     if (symbol != other.symbol)
44b025d691SKrzysztof Parzyszek       return false;
45b025d691SKrzysztof Parzyszek     if (symbol == nullptr)
46b025d691SKrzysztof Parzyszek       return true;
47b025d691SKrzysztof Parzyszek     // Equal symbols don't necessarily indicate identical objects,
48b025d691SKrzysztof Parzyszek     // for example, a derived object component may use a single symbol,
49b025d691SKrzysztof Parzyszek     // which will refer to different objects for different designators,
50b025d691SKrzysztof Parzyszek     // e.g. a%c and b%c.
51b025d691SKrzysztof Parzyszek     return designator == other.designator;
52b025d691SKrzysztof Parzyszek   }
53b025d691SKrzysztof Parzyszek 
54e508baccSagozillon   // Defining an "ordering" which allows types derived from this to be
55e508baccSagozillon   // utilised in maps and other containers that require comparison
56e508baccSagozillon   // operators for ordering
57e508baccSagozillon   bool operator<(const IdTyTemplate &other) const {
58e508baccSagozillon     return symbol < other.symbol;
59e508baccSagozillon   }
60e508baccSagozillon 
61b025d691SKrzysztof Parzyszek   operator bool() const { return symbol != nullptr; }
62b025d691SKrzysztof Parzyszek };
63b025d691SKrzysztof Parzyszek 
64148a5579SKrzysztof Parzyszek using ExprTy = SomeExpr;
65ea2cfcc1SKrzysztof Parzyszek 
66ea2cfcc1SKrzysztof Parzyszek template <typename T>
67ea2cfcc1SKrzysztof Parzyszek using List = tomp::ListT<T>;
68f9e55796SKrzysztof Parzyszek } // namespace Fortran::lower::omp
69ea2cfcc1SKrzysztof Parzyszek 
70b025d691SKrzysztof Parzyszek // Specialization of the ObjectT template
71148a5579SKrzysztof Parzyszek namespace tomp::type {
72ea2cfcc1SKrzysztof Parzyszek template <>
73b025d691SKrzysztof Parzyszek struct ObjectT<Fortran::lower::omp::IdTyTemplate<Fortran::lower::omp::ExprTy>,
74b025d691SKrzysztof Parzyszek                Fortran::lower::omp::ExprTy> {
75b025d691SKrzysztof Parzyszek   using IdTy = Fortran::lower::omp::IdTyTemplate<Fortran::lower::omp::ExprTy>;
76148a5579SKrzysztof Parzyszek   using ExprTy = Fortran::lower::omp::ExprTy;
77ea2cfcc1SKrzysztof Parzyszek 
78b025d691SKrzysztof Parzyszek   IdTy id() const { return identity; }
79b025d691SKrzysztof Parzyszek   Fortran::semantics::Symbol *sym() const { return identity.symbol; }
80b025d691SKrzysztof Parzyszek   const std::optional<ExprTy> &ref() const { return identity.designator; }
81ea2cfcc1SKrzysztof Parzyszek 
82e508baccSagozillon   bool operator<(const ObjectT<IdTy, ExprTy> &other) const {
83e508baccSagozillon     return identity < other.identity;
84e508baccSagozillon   }
85e508baccSagozillon 
86b025d691SKrzysztof Parzyszek   IdTy identity;
87ea2cfcc1SKrzysztof Parzyszek };
88148a5579SKrzysztof Parzyszek } // namespace tomp::type
89ea2cfcc1SKrzysztof Parzyszek 
90f9e55796SKrzysztof Parzyszek namespace Fortran::lower::omp {
91b025d691SKrzysztof Parzyszek using IdTy = IdTyTemplate<ExprTy>;
92b025d691SKrzysztof Parzyszek }
93ea2cfcc1SKrzysztof Parzyszek 
94b025d691SKrzysztof Parzyszek namespace std {
95b025d691SKrzysztof Parzyszek template <>
96b025d691SKrzysztof Parzyszek struct hash<Fortran::lower::omp::IdTy> {
97b025d691SKrzysztof Parzyszek   size_t operator()(const Fortran::lower::omp::IdTy &id) const {
98b025d691SKrzysztof Parzyszek     return static_cast<size_t>(reinterpret_cast<uintptr_t>(id.symbol));
99b025d691SKrzysztof Parzyszek   }
100b025d691SKrzysztof Parzyszek };
101b025d691SKrzysztof Parzyszek } // namespace std
102b025d691SKrzysztof Parzyszek 
103b025d691SKrzysztof Parzyszek namespace Fortran::lower::omp {
104148a5579SKrzysztof Parzyszek using Object = tomp::ObjectT<IdTy, ExprTy>;
105148a5579SKrzysztof Parzyszek using ObjectList = tomp::ObjectListT<IdTy, ExprTy>;
106ea2cfcc1SKrzysztof Parzyszek 
107ea2cfcc1SKrzysztof Parzyszek Object makeObject(const parser::OmpObject &object,
108ea2cfcc1SKrzysztof Parzyszek                   semantics::SemanticsContext &semaCtx);
109ea2cfcc1SKrzysztof Parzyszek Object makeObject(const parser::Name &name,
110ea2cfcc1SKrzysztof Parzyszek                   semantics::SemanticsContext &semaCtx);
111ea2cfcc1SKrzysztof Parzyszek Object makeObject(const parser::Designator &dsg,
112ea2cfcc1SKrzysztof Parzyszek                   semantics::SemanticsContext &semaCtx);
113ea2cfcc1SKrzysztof Parzyszek Object makeObject(const parser::StructureComponent &comp,
114ea2cfcc1SKrzysztof Parzyszek                   semantics::SemanticsContext &semaCtx);
115ea2cfcc1SKrzysztof Parzyszek 
116ea2cfcc1SKrzysztof Parzyszek inline auto makeObjectFn(semantics::SemanticsContext &semaCtx) {
117ea2cfcc1SKrzysztof Parzyszek   return [&](auto &&s) { return makeObject(s, semaCtx); };
118ea2cfcc1SKrzysztof Parzyszek }
119ea2cfcc1SKrzysztof Parzyszek 
120ea2cfcc1SKrzysztof Parzyszek template <typename T>
121ea2cfcc1SKrzysztof Parzyszek SomeExpr makeExpr(T &&pftExpr, semantics::SemanticsContext &semaCtx) {
122ea2cfcc1SKrzysztof Parzyszek   auto maybeExpr = evaluate::ExpressionAnalyzer(semaCtx).Analyze(pftExpr);
123ea2cfcc1SKrzysztof Parzyszek   assert(maybeExpr);
124ea2cfcc1SKrzysztof Parzyszek   return std::move(*maybeExpr);
125ea2cfcc1SKrzysztof Parzyszek }
126ea2cfcc1SKrzysztof Parzyszek 
127ea2cfcc1SKrzysztof Parzyszek inline auto makeExprFn(semantics::SemanticsContext &semaCtx) {
128ea2cfcc1SKrzysztof Parzyszek   return [&](auto &&s) { return makeExpr(s, semaCtx); };
129ea2cfcc1SKrzysztof Parzyszek }
130ea2cfcc1SKrzysztof Parzyszek 
131ea2cfcc1SKrzysztof Parzyszek template <
132ea2cfcc1SKrzysztof Parzyszek     typename ContainerTy, typename FunctionTy,
133ea2cfcc1SKrzysztof Parzyszek     typename ElemTy = typename llvm::remove_cvref_t<ContainerTy>::value_type,
134ea2cfcc1SKrzysztof Parzyszek     typename ResultTy = std::invoke_result_t<FunctionTy, ElemTy>>
135ea2cfcc1SKrzysztof Parzyszek List<ResultTy> makeList(ContainerTy &&container, FunctionTy &&func) {
136ea2cfcc1SKrzysztof Parzyszek   List<ResultTy> v;
137ea2cfcc1SKrzysztof Parzyszek   llvm::transform(container, std::back_inserter(v), func);
138ea2cfcc1SKrzysztof Parzyszek   return v;
139ea2cfcc1SKrzysztof Parzyszek }
140ea2cfcc1SKrzysztof Parzyszek 
1414d177435SKrzysztof Parzyszek inline ObjectList makeObjects(const parser::OmpObjectList &objects,
142ea2cfcc1SKrzysztof Parzyszek                               semantics::SemanticsContext &semaCtx) {
143ea2cfcc1SKrzysztof Parzyszek   return makeList(objects.v, makeObjectFn(semaCtx));
144ea2cfcc1SKrzysztof Parzyszek }
145ea2cfcc1SKrzysztof Parzyszek 
146148a5579SKrzysztof Parzyszek template <typename FuncTy, //
147148a5579SKrzysztof Parzyszek           typename ArgTy,  //
148148a5579SKrzysztof Parzyszek           typename ResultTy = std::invoke_result_t<FuncTy, ArgTy>>
149ea2cfcc1SKrzysztof Parzyszek std::optional<ResultTy> maybeApply(FuncTy &&func,
150148a5579SKrzysztof Parzyszek                                    const std::optional<ArgTy> &arg) {
151148a5579SKrzysztof Parzyszek   if (!arg)
152ea2cfcc1SKrzysztof Parzyszek     return std::nullopt;
153e79cd246SKrzysztof Parzyszek   return func(*arg);
154e79cd246SKrzysztof Parzyszek }
155e79cd246SKrzysztof Parzyszek 
156cdbd2287SKrzysztof Parzyszek template <           //
157e79cd246SKrzysztof Parzyszek     typename FuncTy, //
158e79cd246SKrzysztof Parzyszek     typename ArgTy,  //
159cdbd2287SKrzysztof Parzyszek     typename ResultTy =
160cdbd2287SKrzysztof Parzyszek         std::invoke_result_t<FuncTy, decltype(std::declval<ArgTy>().v)>>
161e79cd246SKrzysztof Parzyszek std::optional<ResultTy> maybeApplyToV(FuncTy &&func, const ArgTy *arg) {
162e79cd246SKrzysztof Parzyszek   if (!arg)
163e79cd246SKrzysztof Parzyszek     return std::nullopt;
164e79cd246SKrzysztof Parzyszek   return func(arg->v);
165ea2cfcc1SKrzysztof Parzyszek }
166ea2cfcc1SKrzysztof Parzyszek 
1677a66e420SKrzysztof Parzyszek std::optional<Object> getBaseObject(const Object &object,
1687a66e420SKrzysztof Parzyszek                                     semantics::SemanticsContext &semaCtx);
169ea2cfcc1SKrzysztof Parzyszek 
170ea2cfcc1SKrzysztof Parzyszek namespace clause {
171973fa983SKrzysztof Parzyszek using Range = tomp::type::RangeT<ExprTy>;
17252755ac2SKrzysztof Parzyszek using Mapper = tomp::type::MapperT<IdTy, ExprTy>;
173973fa983SKrzysztof Parzyszek using Iterator = tomp::type::IteratorT<TypeTy, IdTy, ExprTy>;
174973fa983SKrzysztof Parzyszek using IteratorSpecifier = tomp::type::IteratorSpecifierT<TypeTy, IdTy, ExprTy>;
175148a5579SKrzysztof Parzyszek using DefinedOperator = tomp::type::DefinedOperatorT<IdTy, ExprTy>;
176148a5579SKrzysztof Parzyszek using ProcedureDesignator = tomp::type::ProcedureDesignatorT<IdTy, ExprTy>;
177148a5579SKrzysztof Parzyszek using ReductionOperator = tomp::type::ReductionIdentifierT<IdTy, ExprTy>;
178f87737f3SKrzysztof Parzyszek using DependenceType = tomp::type::DependenceType;
179bde79c0eSKrzysztof Parzyszek using Prescriptiveness = tomp::type::Prescriptiveness;
180ea2cfcc1SKrzysztof Parzyszek 
181ea2cfcc1SKrzysztof Parzyszek // "Requires" clauses are handled early on, and the aggregated information
182ea2cfcc1SKrzysztof Parzyszek // is stored in the Symbol details of modules, programs, and subprograms.
183ea2cfcc1SKrzysztof Parzyszek // These clauses are still handled here to cover all alternatives in the
184ea2cfcc1SKrzysztof Parzyszek // main clause variant.
185ea2cfcc1SKrzysztof Parzyszek 
1866d688601SJulian Brown using Absent = tomp::clause::AbsentT<TypeTy, IdTy, ExprTy>;
187148a5579SKrzysztof Parzyszek using AcqRel = tomp::clause::AcqRelT<TypeTy, IdTy, ExprTy>;
188148a5579SKrzysztof Parzyszek using Acquire = tomp::clause::AcquireT<TypeTy, IdTy, ExprTy>;
189148a5579SKrzysztof Parzyszek using AdjustArgs = tomp::clause::AdjustArgsT<TypeTy, IdTy, ExprTy>;
190148a5579SKrzysztof Parzyszek using Affinity = tomp::clause::AffinityT<TypeTy, IdTy, ExprTy>;
191148a5579SKrzysztof Parzyszek using Aligned = tomp::clause::AlignedT<TypeTy, IdTy, ExprTy>;
192148a5579SKrzysztof Parzyszek using Align = tomp::clause::AlignT<TypeTy, IdTy, ExprTy>;
193148a5579SKrzysztof Parzyszek using Allocate = tomp::clause::AllocateT<TypeTy, IdTy, ExprTy>;
194148a5579SKrzysztof Parzyszek using Allocator = tomp::clause::AllocatorT<TypeTy, IdTy, ExprTy>;
195148a5579SKrzysztof Parzyszek using AppendArgs = tomp::clause::AppendArgsT<TypeTy, IdTy, ExprTy>;
196ea2cfcc1SKrzysztof Parzyszek using AtomicDefaultMemOrder =
197148a5579SKrzysztof Parzyszek     tomp::clause::AtomicDefaultMemOrderT<TypeTy, IdTy, ExprTy>;
198148a5579SKrzysztof Parzyszek using At = tomp::clause::AtT<TypeTy, IdTy, ExprTy>;
199148a5579SKrzysztof Parzyszek using Bind = tomp::clause::BindT<TypeTy, IdTy, ExprTy>;
200148a5579SKrzysztof Parzyszek using Capture = tomp::clause::CaptureT<TypeTy, IdTy, ExprTy>;
201148a5579SKrzysztof Parzyszek using Collapse = tomp::clause::CollapseT<TypeTy, IdTy, ExprTy>;
202148a5579SKrzysztof Parzyszek using Compare = tomp::clause::CompareT<TypeTy, IdTy, ExprTy>;
20389c556cfSKrzysztof Parzyszek using Contains = tomp::clause::ContainsT<TypeTy, IdTy, ExprTy>;
204148a5579SKrzysztof Parzyszek using Copyin = tomp::clause::CopyinT<TypeTy, IdTy, ExprTy>;
205148a5579SKrzysztof Parzyszek using Copyprivate = tomp::clause::CopyprivateT<TypeTy, IdTy, ExprTy>;
206148a5579SKrzysztof Parzyszek using Defaultmap = tomp::clause::DefaultmapT<TypeTy, IdTy, ExprTy>;
207148a5579SKrzysztof Parzyszek using Default = tomp::clause::DefaultT<TypeTy, IdTy, ExprTy>;
208148a5579SKrzysztof Parzyszek using Depend = tomp::clause::DependT<TypeTy, IdTy, ExprTy>;
209148a5579SKrzysztof Parzyszek using Destroy = tomp::clause::DestroyT<TypeTy, IdTy, ExprTy>;
210148a5579SKrzysztof Parzyszek using Detach = tomp::clause::DetachT<TypeTy, IdTy, ExprTy>;
211148a5579SKrzysztof Parzyszek using Device = tomp::clause::DeviceT<TypeTy, IdTy, ExprTy>;
212148a5579SKrzysztof Parzyszek using DeviceType = tomp::clause::DeviceTypeT<TypeTy, IdTy, ExprTy>;
213148a5579SKrzysztof Parzyszek using DistSchedule = tomp::clause::DistScheduleT<TypeTy, IdTy, ExprTy>;
214148a5579SKrzysztof Parzyszek using Doacross = tomp::clause::DoacrossT<TypeTy, IdTy, ExprTy>;
215148a5579SKrzysztof Parzyszek using DynamicAllocators =
216148a5579SKrzysztof Parzyszek     tomp::clause::DynamicAllocatorsT<TypeTy, IdTy, ExprTy>;
217148a5579SKrzysztof Parzyszek using Enter = tomp::clause::EnterT<TypeTy, IdTy, ExprTy>;
218148a5579SKrzysztof Parzyszek using Exclusive = tomp::clause::ExclusiveT<TypeTy, IdTy, ExprTy>;
219148a5579SKrzysztof Parzyszek using Fail = tomp::clause::FailT<TypeTy, IdTy, ExprTy>;
220148a5579SKrzysztof Parzyszek using Filter = tomp::clause::FilterT<TypeTy, IdTy, ExprTy>;
221148a5579SKrzysztof Parzyszek using Final = tomp::clause::FinalT<TypeTy, IdTy, ExprTy>;
222148a5579SKrzysztof Parzyszek using Firstprivate = tomp::clause::FirstprivateT<TypeTy, IdTy, ExprTy>;
223148a5579SKrzysztof Parzyszek using From = tomp::clause::FromT<TypeTy, IdTy, ExprTy>;
224148a5579SKrzysztof Parzyszek using Full = tomp::clause::FullT<TypeTy, IdTy, ExprTy>;
225148a5579SKrzysztof Parzyszek using Grainsize = tomp::clause::GrainsizeT<TypeTy, IdTy, ExprTy>;
226148a5579SKrzysztof Parzyszek using HasDeviceAddr = tomp::clause::HasDeviceAddrT<TypeTy, IdTy, ExprTy>;
227148a5579SKrzysztof Parzyszek using Hint = tomp::clause::HintT<TypeTy, IdTy, ExprTy>;
2286d688601SJulian Brown using Holds = tomp::clause::HoldsT<TypeTy, IdTy, ExprTy>;
229148a5579SKrzysztof Parzyszek using If = tomp::clause::IfT<TypeTy, IdTy, ExprTy>;
230148a5579SKrzysztof Parzyszek using Inbranch = tomp::clause::InbranchT<TypeTy, IdTy, ExprTy>;
231148a5579SKrzysztof Parzyszek using Inclusive = tomp::clause::InclusiveT<TypeTy, IdTy, ExprTy>;
232148a5579SKrzysztof Parzyszek using Indirect = tomp::clause::IndirectT<TypeTy, IdTy, ExprTy>;
233148a5579SKrzysztof Parzyszek using Init = tomp::clause::InitT<TypeTy, IdTy, ExprTy>;
234148a5579SKrzysztof Parzyszek using InReduction = tomp::clause::InReductionT<TypeTy, IdTy, ExprTy>;
235148a5579SKrzysztof Parzyszek using IsDevicePtr = tomp::clause::IsDevicePtrT<TypeTy, IdTy, ExprTy>;
236148a5579SKrzysztof Parzyszek using Lastprivate = tomp::clause::LastprivateT<TypeTy, IdTy, ExprTy>;
237148a5579SKrzysztof Parzyszek using Linear = tomp::clause::LinearT<TypeTy, IdTy, ExprTy>;
238148a5579SKrzysztof Parzyszek using Link = tomp::clause::LinkT<TypeTy, IdTy, ExprTy>;
239148a5579SKrzysztof Parzyszek using Map = tomp::clause::MapT<TypeTy, IdTy, ExprTy>;
240148a5579SKrzysztof Parzyszek using Match = tomp::clause::MatchT<TypeTy, IdTy, ExprTy>;
241148a5579SKrzysztof Parzyszek using Mergeable = tomp::clause::MergeableT<TypeTy, IdTy, ExprTy>;
242148a5579SKrzysztof Parzyszek using Message = tomp::clause::MessageT<TypeTy, IdTy, ExprTy>;
2436d688601SJulian Brown using NoOpenmp = tomp::clause::NoOpenmpT<TypeTy, IdTy, ExprTy>;
2446d688601SJulian Brown using NoOpenmpRoutines = tomp::clause::NoOpenmpRoutinesT<TypeTy, IdTy, ExprTy>;
2456d688601SJulian Brown using NoParallelism = tomp::clause::NoParallelismT<TypeTy, IdTy, ExprTy>;
246148a5579SKrzysztof Parzyszek using Nocontext = tomp::clause::NocontextT<TypeTy, IdTy, ExprTy>;
247148a5579SKrzysztof Parzyszek using Nogroup = tomp::clause::NogroupT<TypeTy, IdTy, ExprTy>;
248148a5579SKrzysztof Parzyszek using Nontemporal = tomp::clause::NontemporalT<TypeTy, IdTy, ExprTy>;
249148a5579SKrzysztof Parzyszek using Notinbranch = tomp::clause::NotinbranchT<TypeTy, IdTy, ExprTy>;
250148a5579SKrzysztof Parzyszek using Novariants = tomp::clause::NovariantsT<TypeTy, IdTy, ExprTy>;
251148a5579SKrzysztof Parzyszek using Nowait = tomp::clause::NowaitT<TypeTy, IdTy, ExprTy>;
252148a5579SKrzysztof Parzyszek using NumTasks = tomp::clause::NumTasksT<TypeTy, IdTy, ExprTy>;
253148a5579SKrzysztof Parzyszek using NumTeams = tomp::clause::NumTeamsT<TypeTy, IdTy, ExprTy>;
254148a5579SKrzysztof Parzyszek using NumThreads = tomp::clause::NumThreadsT<TypeTy, IdTy, ExprTy>;
255148a5579SKrzysztof Parzyszek using OmpxAttribute = tomp::clause::OmpxAttributeT<TypeTy, IdTy, ExprTy>;
256148a5579SKrzysztof Parzyszek using OmpxBare = tomp::clause::OmpxBareT<TypeTy, IdTy, ExprTy>;
257148a5579SKrzysztof Parzyszek using OmpxDynCgroupMem = tomp::clause::OmpxDynCgroupMemT<TypeTy, IdTy, ExprTy>;
258148a5579SKrzysztof Parzyszek using Ordered = tomp::clause::OrderedT<TypeTy, IdTy, ExprTy>;
259148a5579SKrzysztof Parzyszek using Order = tomp::clause::OrderT<TypeTy, IdTy, ExprTy>;
260*15ab7be2SKrzysztof Parzyszek using Otherwise = tomp::clause::OtherwiseT<TypeTy, IdTy, ExprTy>;
261148a5579SKrzysztof Parzyszek using Partial = tomp::clause::PartialT<TypeTy, IdTy, ExprTy>;
262148a5579SKrzysztof Parzyszek using Priority = tomp::clause::PriorityT<TypeTy, IdTy, ExprTy>;
263148a5579SKrzysztof Parzyszek using Private = tomp::clause::PrivateT<TypeTy, IdTy, ExprTy>;
264148a5579SKrzysztof Parzyszek using ProcBind = tomp::clause::ProcBindT<TypeTy, IdTy, ExprTy>;
265148a5579SKrzysztof Parzyszek using Read = tomp::clause::ReadT<TypeTy, IdTy, ExprTy>;
266148a5579SKrzysztof Parzyszek using Reduction = tomp::clause::ReductionT<TypeTy, IdTy, ExprTy>;
267148a5579SKrzysztof Parzyszek using Relaxed = tomp::clause::RelaxedT<TypeTy, IdTy, ExprTy>;
268148a5579SKrzysztof Parzyszek using Release = tomp::clause::ReleaseT<TypeTy, IdTy, ExprTy>;
269148a5579SKrzysztof Parzyszek using ReverseOffload = tomp::clause::ReverseOffloadT<TypeTy, IdTy, ExprTy>;
270148a5579SKrzysztof Parzyszek using Safelen = tomp::clause::SafelenT<TypeTy, IdTy, ExprTy>;
271148a5579SKrzysztof Parzyszek using Schedule = tomp::clause::ScheduleT<TypeTy, IdTy, ExprTy>;
272148a5579SKrzysztof Parzyszek using SeqCst = tomp::clause::SeqCstT<TypeTy, IdTy, ExprTy>;
273148a5579SKrzysztof Parzyszek using Severity = tomp::clause::SeverityT<TypeTy, IdTy, ExprTy>;
274148a5579SKrzysztof Parzyszek using Shared = tomp::clause::SharedT<TypeTy, IdTy, ExprTy>;
275148a5579SKrzysztof Parzyszek using Simdlen = tomp::clause::SimdlenT<TypeTy, IdTy, ExprTy>;
276148a5579SKrzysztof Parzyszek using Simd = tomp::clause::SimdT<TypeTy, IdTy, ExprTy>;
277148a5579SKrzysztof Parzyszek using Sizes = tomp::clause::SizesT<TypeTy, IdTy, ExprTy>;
2785b03efb8SMichael Kruse using Permutation = tomp::clause::PermutationT<TypeTy, IdTy, ExprTy>;
279148a5579SKrzysztof Parzyszek using TaskReduction = tomp::clause::TaskReductionT<TypeTy, IdTy, ExprTy>;
280148a5579SKrzysztof Parzyszek using ThreadLimit = tomp::clause::ThreadLimitT<TypeTy, IdTy, ExprTy>;
281148a5579SKrzysztof Parzyszek using Threads = tomp::clause::ThreadsT<TypeTy, IdTy, ExprTy>;
282148a5579SKrzysztof Parzyszek using To = tomp::clause::ToT<TypeTy, IdTy, ExprTy>;
283148a5579SKrzysztof Parzyszek using UnifiedAddress = tomp::clause::UnifiedAddressT<TypeTy, IdTy, ExprTy>;
284148a5579SKrzysztof Parzyszek using UnifiedSharedMemory =
285148a5579SKrzysztof Parzyszek     tomp::clause::UnifiedSharedMemoryT<TypeTy, IdTy, ExprTy>;
286148a5579SKrzysztof Parzyszek using Uniform = tomp::clause::UniformT<TypeTy, IdTy, ExprTy>;
287148a5579SKrzysztof Parzyszek using Unknown = tomp::clause::UnknownT<TypeTy, IdTy, ExprTy>;
288148a5579SKrzysztof Parzyszek using Untied = tomp::clause::UntiedT<TypeTy, IdTy, ExprTy>;
289148a5579SKrzysztof Parzyszek using Update = tomp::clause::UpdateT<TypeTy, IdTy, ExprTy>;
290148a5579SKrzysztof Parzyszek using UseDeviceAddr = tomp::clause::UseDeviceAddrT<TypeTy, IdTy, ExprTy>;
291148a5579SKrzysztof Parzyszek using UseDevicePtr = tomp::clause::UseDevicePtrT<TypeTy, IdTy, ExprTy>;
292148a5579SKrzysztof Parzyszek using UsesAllocators = tomp::clause::UsesAllocatorsT<TypeTy, IdTy, ExprTy>;
293148a5579SKrzysztof Parzyszek using Use = tomp::clause::UseT<TypeTy, IdTy, ExprTy>;
294148a5579SKrzysztof Parzyszek using Weak = tomp::clause::WeakT<TypeTy, IdTy, ExprTy>;
295148a5579SKrzysztof Parzyszek using When = tomp::clause::WhenT<TypeTy, IdTy, ExprTy>;
296148a5579SKrzysztof Parzyszek using Write = tomp::clause::WriteT<TypeTy, IdTy, ExprTy>;
297ea2cfcc1SKrzysztof Parzyszek } // namespace clause
298ea2cfcc1SKrzysztof Parzyszek 
299be7c9e39SKrzysztof Parzyszek using tomp::type::operator==;
300be7c9e39SKrzysztof Parzyszek 
301148a5579SKrzysztof Parzyszek struct CancellationConstructType {
302148a5579SKrzysztof Parzyszek   using EmptyTrait = std::true_type;
303148a5579SKrzysztof Parzyszek };
304148a5579SKrzysztof Parzyszek struct Depobj {
305148a5579SKrzysztof Parzyszek   using EmptyTrait = std::true_type;
306148a5579SKrzysztof Parzyszek };
307148a5579SKrzysztof Parzyszek struct Flush {
308148a5579SKrzysztof Parzyszek   using EmptyTrait = std::true_type;
309148a5579SKrzysztof Parzyszek };
310148a5579SKrzysztof Parzyszek struct MemoryOrder {
311148a5579SKrzysztof Parzyszek   using EmptyTrait = std::true_type;
312148a5579SKrzysztof Parzyszek };
313148a5579SKrzysztof Parzyszek struct Threadprivate {
314148a5579SKrzysztof Parzyszek   using EmptyTrait = std::true_type;
315148a5579SKrzysztof Parzyszek };
316148a5579SKrzysztof Parzyszek 
317148a5579SKrzysztof Parzyszek using ClauseBase = tomp::ClauseT<TypeTy, IdTy, ExprTy,
318148a5579SKrzysztof Parzyszek                                  // Extras...
319148a5579SKrzysztof Parzyszek                                  CancellationConstructType, Depobj, Flush,
320148a5579SKrzysztof Parzyszek                                  MemoryOrder, Threadprivate>;
321148a5579SKrzysztof Parzyszek 
322148a5579SKrzysztof Parzyszek struct Clause : public ClauseBase {
323be7c9e39SKrzysztof Parzyszek   Clause(ClauseBase &&base, const parser::CharBlock source = {})
324be7c9e39SKrzysztof Parzyszek       : ClauseBase(std::move(base)), source(source) {}
325be7c9e39SKrzysztof Parzyszek   // "source" will be ignored by tomp::type::operator==.
326ea2cfcc1SKrzysztof Parzyszek   parser::CharBlock source;
327ea2cfcc1SKrzysztof Parzyszek };
328ea2cfcc1SKrzysztof Parzyszek 
329ea2cfcc1SKrzysztof Parzyszek template <typename Specific>
330ea2cfcc1SKrzysztof Parzyszek Clause makeClause(llvm::omp::Clause id, Specific &&specific,
331ea2cfcc1SKrzysztof Parzyszek                   parser::CharBlock source = {}) {
332be7c9e39SKrzysztof Parzyszek   return Clause(typename Clause::BaseT{id, specific}, source);
333ea2cfcc1SKrzysztof Parzyszek }
334ea2cfcc1SKrzysztof Parzyszek 
3357a66e420SKrzysztof Parzyszek Clause makeClause(const parser::OmpClause &cls,
336ea2cfcc1SKrzysztof Parzyszek                   semantics::SemanticsContext &semaCtx);
337ea2cfcc1SKrzysztof Parzyszek 
3384d177435SKrzysztof Parzyszek List<Clause> makeClauses(const parser::OmpClauseList &clauses,
339ea2cfcc1SKrzysztof Parzyszek                          semantics::SemanticsContext &semaCtx);
340be7c9e39SKrzysztof Parzyszek 
341be7c9e39SKrzysztof Parzyszek bool transferLocations(const List<Clause> &from, List<Clause> &to);
342f9e55796SKrzysztof Parzyszek } // namespace Fortran::lower::omp
343ea2cfcc1SKrzysztof Parzyszek 
344ea2cfcc1SKrzysztof Parzyszek #endif // FORTRAN_LOWER_OPENMP_CLAUSES_H
345