LLVM 19.0.0git
ClauseT.h
Go to the documentation of this file.
1//===- ClauseT.h -- clause template definitions ---------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8// This file contains template classes that represent OpenMP clauses, as
9// described in the OpenMP API specification.
10//
11// The general structure of any specific clause class is that it is either
12// empty, or it consists of a single data member, which can take one of these
13// three forms:
14// - a value member, named `v`, or
15// - a tuple of values, named `t`, or
16// - a variant (i.e. union) of values, named `u`.
17// To assist with generic visit algorithms, classes define one of the following
18// traits:
19// - EmptyTrait: the class has no data members.
20// - WrapperTrait: the class has a single member `v`
21// - TupleTrait: the class has a tuple member `t`
22// - UnionTrait the class has a varuant member `u`
23// - IncompleteTrait: the class is a placeholder class that is currently empty,
24// but will be completed at a later time.
25// Note: This structure follows the one used in flang parser.
26//
27// The types used in the class definitions follow the names used in the spec
28// (there are a few exceptions to this). For example, given
29// Clause `foo`
30// - foo-modifier : description...
31// - list : list of variables
32// the corresponding class would be
33// template <...>
34// struct FooT {
35// using FooModifier = type that can represent the modifier
36// using List = ListT<ObjectT<...>>;
37// using TupleTrait = std::true_type;
38// std::tuple<std::optional<FooModifier>, List> t;
39// };
40//===----------------------------------------------------------------------===//
41#ifndef LLVM_FRONTEND_OPENMP_CLAUSET_H
42#define LLVM_FRONTEND_OPENMP_CLAUSET_H
43
44#include "llvm/ADT/ArrayRef.h"
45#include "llvm/ADT/DenseMap.h"
46#include "llvm/ADT/DenseSet.h"
47#include "llvm/ADT/STLExtras.h"
52
53#include <algorithm>
54#include <iterator>
55#include <optional>
56#include <tuple>
57#include <type_traits>
58#include <utility>
59#include <variant>
60
61#define ENUM(Name, ...) enum class Name { __VA_ARGS__ }
62#define OPT(x) std::optional<x>
63
64// A number of OpenMP clauses contain values that come from a given set of
65// possibilities. In the IR these are usually represented by enums. Both
66// clang and flang use different types for the enums, and the enum elements
67// representing the same thing may have different values between clang and
68// flang.
69// Since the representation below tries to adhere to the spec, and be source
70// language agnostic, it defines its own enums, independent from any language
71// frontend. As a consequence, when instantiating the templates below,
72// frontend-specific enums need to be translated into the representation
73// used here. The macros below are intended to assist with the conversion.
74
75// Helper macro for enum-class conversion.
76#define CLAUSET_SCOPED_ENUM_MEMBER_CONVERT(Ov, Tv) \
77 if (v == OtherEnum::Ov) { \
78 return ThisEnum::Tv; \
79 }
80
81// Helper macro for enum (non-class) conversion.
82#define CLAUSET_UNSCOPED_ENUM_MEMBER_CONVERT(Ov, Tv) \
83 if (v == Ov) { \
84 return ThisEnum::Tv; \
85 }
86
87#define CLAUSET_ENUM_CONVERT(func, OtherE, ThisE, Maps) \
88 auto func = [](OtherE v) -> ThisE { \
89 using ThisEnum = ThisE; \
90 using OtherEnum = OtherE; \
91 (void)sizeof(OtherEnum); /*Avoid "unused local typedef" warning*/ \
92 Maps; \
93 llvm_unreachable("Unexpected value in " #OtherE); \
94 }
95
96// Usage:
97//
98// Given two enums,
99// enum class Other { o1, o2 };
100// enum class This { t1, t2 };
101// generate conversion function "Func : Other -> This" with
102// CLAUSET_ENUM_CONVERT(
103// Func, Other, This,
104// CLAUSET_ENUM_MEMBER_CONVERT(o1, t1) // <- No comma
105// CLAUSET_ENUM_MEMBER_CONVERT(o2, t2)
106// ...
107// )
108//
109// Note that the sequence of M(other-value, this-value) is separated
110// with _spaces_, not commas.
111
112namespace detail {
113// Type trait to determine whether T is a specialization of std::variant.
114template <typename T> struct is_variant {
115 static constexpr bool value = false;
116};
117
118template <typename... Ts> struct is_variant<std::variant<Ts...>> {
119 static constexpr bool value = true;
120};
121
122template <typename T> constexpr bool is_variant_v = is_variant<T>::value;
123
124// Helper utility to create a type which is a union of two given variants.
125template <typename...> struct UnionOfTwo;
126
127template <typename... Types1, typename... Types2>
128struct UnionOfTwo<std::variant<Types1...>, std::variant<Types2...>> {
129 using type = std::variant<Types1..., Types2...>;
130};
131} // namespace detail
132
133namespace tomp {
134namespace type {
135
136// Helper utility to create a type which is a union of an arbitrary number
137// of variants.
138template <typename...> struct Union;
139
140template <> struct Union<> {
141 // Legal to define, illegal to instantiate.
142 using type = std::variant<>;
143};
144
145template <typename T, typename... Ts> struct Union<T, Ts...> {
146 static_assert(detail::is_variant_v<T>);
147 using type =
148 typename detail::UnionOfTwo<T, typename Union<Ts...>::type>::type;
149};
150
151template <typename T> using ListT = llvm::SmallVector<T, 0>;
152
153// The ObjectT class represents a variable (as defined in the OpenMP spec).
154//
155// A specialization of ObjectT<Id, Expr> must provide the following definitions:
156// {
157// using IdTy = Id;
158// using ExprTy = Expr;
159//
160// auto id() const -> IdTy {
161// return the identifier of the object (for use in tests for
162// presence/absence of the object)
163// }
164//
165// auto ref() const -> (e.g. const ExprTy&) {
166// return the expression accessing (referencing) the object
167// }
168// }
169//
170// For example, the ObjectT instance created for "var[x+1]" would have
171// the `id()` return the identifier for `var`, and the `ref()` return the
172// representation of the array-access `var[x+1]`.
173//
174// The identity of an object must always be present, i.e. it cannot be
175// nullptr, std::nullopt, etc. The reference is optional.
176//
177// Note: the ObjectT template is not defined. Any user of it is expected to
178// provide their own specialization that conforms to the above requirements.
179template <typename IdType, typename ExprType> struct ObjectT;
180
181template <typename I, typename E> using ObjectListT = ListT<ObjectT<I, E>>;
182
183using DirectiveName = llvm::omp::Directive;
184
185template <typename I, typename E> //
188 using WrapperTrait = std::true_type;
190 };
191 ENUM(IntrinsicOperator, Power, Multiply, Divide, Add, Subtract, Concat, LT,
192 LE, EQ, NE, GE, GT, NOT, AND, OR, EQV, NEQV, Min, Max);
193 using UnionTrait = std::true_type;
194 std::variant<DefinedOpName, IntrinsicOperator> u;
195};
196
197// V5.2: [3.2.6] `iterator` modifier
198template <typename E> //
199struct RangeT {
200 // range-specification: begin : end[: step]
201 using TupleTrait = std::true_type;
202 std::tuple<E, E, OPT(E)> t;
203};
204
205// V5.2: [3.2.6] `iterator` modifier
206template <typename TypeType, typename IdType, typename ExprType> //
208 // iterators-specifier: [ iterator-type ] identifier = range-specification
209 using TupleTrait = std::true_type;
211};
212
213// Note:
214// For motion or map clauses the OpenMP spec allows a unique mapper modifier.
215// In practice, since these clauses apply to multiple objects, there can be
216// multiple effective mappers applicable to these objects (due to overloads,
217// etc.). Because of that store a list of mappers every time a mapper modifier
218// is allowed. If the mapper list contains a single element, it applies to
219// all objects in the clause, otherwise there should be as many mappers as
220// there are objects.
221// V5.2: [5.8.2] Mapper identifiers and `mapper` modifiers
222template <typename I, typename E> //
223struct MapperT {
225 using WrapperTrait = std::true_type;
227};
228
229// V5.2: [15.8.1] `memory-order` clauses
230// When used as arguments for other clauses, e.g. `fail`.
231ENUM(MemoryOrder, AcqRel, Acquire, Relaxed, Release, SeqCst);
232ENUM(MotionExpectation, Present);
233// V5.2: [15.9.1] `task-dependence-type` modifier
234ENUM(TaskDependenceType, In, Out, Inout, Mutexinoutset, Inoutset, Depobj);
235
236template <typename I, typename E> //
238 struct Distance {
239 using TupleTrait = std::true_type;
240 std::tuple<DefinedOperatorT<I, E>, E> t;
241 };
242 using TupleTrait = std::true_type;
243 std::tuple<ObjectT<I, E>, OPT(Distance)> t;
244};
245
246template <typename I, typename E> //
248 using WrapperTrait = std::true_type;
250};
251
252// Note:
253// For reduction clauses the OpenMP spec allows a unique reduction identifier.
254// For reasons analogous to those listed for the MapperT type, clauses that
255// according to the spec contain a reduction identifier will contain a list of
256// reduction identifiers. The same constraints apply: there is either a single
257// identifier that applies to all objects, or there are as many identifiers
258// as there are objects.
259template <typename I, typename E> //
261 using UnionTrait = std::true_type;
262 std::variant<DefinedOperatorT<I, E>, ProcedureDesignatorT<I, E>> u;
263};
264
265template <typename T, typename I, typename E> //
267} // namespace type
268
269template <typename T> using ListT = type::ListT<T>;
270
271template <typename I, typename E> using ObjectT = type::ObjectT<I, E>;
272template <typename I, typename E> using ObjectListT = type::ObjectListT<I, E>;
273
274template <typename T, typename I, typename E>
276
277template <
278 typename ContainerTy, typename FunctionTy,
279 typename ElemTy = typename llvm::remove_cvref_t<ContainerTy>::value_type,
280 typename ResultTy = std::invoke_result_t<FunctionTy, ElemTy>>
281ListT<ResultTy> makeList(ContainerTy &&container, FunctionTy &&func) {
283 llvm::transform(container, std::back_inserter(v), func);
284 return v;
285}
286
287namespace clause {
288// V5.2: [8.3.1] `assumption` clauses
289template <typename T, typename I, typename E> //
290struct AbsentT {
292 using WrapperTrait = std::true_type;
294};
295
296// V5.2: [15.8.1] `memory-order` clauses
297template <typename T, typename I, typename E> //
298struct AcqRelT {
299 using EmptyTrait = std::true_type;
300};
301
302// V5.2: [15.8.1] `memory-order` clauses
303template <typename T, typename I, typename E> //
304struct AcquireT {
305 using EmptyTrait = std::true_type;
306};
307
308// V5.2: [7.5.2] `adjust_args` clause
309template <typename T, typename I, typename E> //
311 using IncompleteTrait = std::true_type;
312};
313
314// V5.2: [12.5.1] `affinity` clause
315template <typename T, typename I, typename E> //
316struct AffinityT {
319
320 using TupleTrait = std::true_type;
321 std::tuple<OPT(Iterator), LocatorList> t;
322};
323
324// V5.2: [6.3] `align` clause
325template <typename T, typename I, typename E> //
326struct AlignT {
327 using Alignment = E;
328
329 using WrapperTrait = std::true_type;
331};
332
333// V5.2: [5.11] `aligned` clause
334template <typename T, typename I, typename E> //
335struct AlignedT {
336 using Alignment = E;
338
339 using TupleTrait = std::true_type;
340 std::tuple<OPT(Alignment), List> t;
341};
342
343template <typename T, typename I, typename E> //
344struct AllocatorT;
345
346// V5.2: [6.6] `allocate` clause
347template <typename T, typename I, typename E> //
348struct AllocateT {
353
354 using TupleTrait = std::true_type;
358};
359
360// V5.2: [6.4] `allocator` clause
361template <typename T, typename I, typename E> //
363 using Allocator = E;
364 using WrapperTrait = std::true_type;
366};
367
368// V5.2: [7.5.3] `append_args` clause
369template <typename T, typename I, typename E> //
371 using IncompleteTrait = std::true_type;
372};
373
374// V5.2: [8.1] `at` clause
375template <typename T, typename I, typename E> //
376struct AtT {
377 ENUM(ActionTime, Compilation, Execution);
378 using WrapperTrait = std::true_type;
379 ActionTime v;
380};
381
382// V5.2: [8.2.1] `requirement` clauses
383template <typename T, typename I, typename E> //
385 using MemoryOrder = type::MemoryOrder;
386 using WrapperTrait = std::true_type;
387 MemoryOrder v; // Name not provided in spec
388};
389
390// V5.2: [11.7.1] `bind` clause
391template <typename T, typename I, typename E> //
392struct BindT {
393 ENUM(Binding, Teams, Parallel, Thread);
394 using WrapperTrait = std::true_type;
395 Binding v;
396};
397
398// V5.2: [15.8.3] `extended-atomic` clauses
399template <typename T, typename I, typename E> //
400struct CaptureT {
401 using EmptyTrait = std::true_type;
402};
403
404// V5.2: [4.4.3] `collapse` clause
405template <typename T, typename I, typename E> //
406struct CollapseT {
407 using N = E;
408 using WrapperTrait = std::true_type;
410};
411
412// V5.2: [15.8.3] `extended-atomic` clauses
413template <typename T, typename I, typename E> //
414struct CompareT {
415 using EmptyTrait = std::true_type;
416};
417
418// V5.2: [8.3.1] `assumption` clauses
419template <typename T, typename I, typename E> //
420struct ContainsT {
422 using WrapperTrait = std::true_type;
424};
425
426// V5.2: [5.7.1] `copyin` clause
427template <typename T, typename I, typename E> //
428struct CopyinT {
430 using WrapperTrait = std::true_type;
432};
433
434// V5.2: [5.7.2] `copyprivate` clause
435template <typename T, typename I, typename E> //
438 using WrapperTrait = std::true_type;
440};
441
442// V5.2: [5.4.1] `default` clause
443template <typename T, typename I, typename E> //
444struct DefaultT {
445 ENUM(DataSharingAttribute, Firstprivate, None, Private, Shared);
446 using WrapperTrait = std::true_type;
447 DataSharingAttribute v;
448};
449
450// V5.2: [5.8.7] `defaultmap` clause
451template <typename T, typename I, typename E> //
453 ENUM(ImplicitBehavior, Alloc, To, From, Tofrom, Firstprivate, None, Default,
454 Present);
455 ENUM(VariableCategory, Scalar, Aggregate, Pointer, Allocatable);
456 using TupleTrait = std::true_type;
457 std::tuple<ImplicitBehavior, OPT(VariableCategory)> t;
458};
459
460template <typename T, typename I, typename E> //
461struct DoacrossT;
462
463// V5.2: [15.9.5] `depend` clause
464template <typename T, typename I, typename E> //
465struct DependT {
468 using TaskDependenceType = tomp::type::TaskDependenceType;
469
470 struct WithLocators { // Modern form
471 using TupleTrait = std::true_type;
472 // Empty LocatorList means "omp_all_memory".
474 };
475
477 using UnionTrait = std::true_type;
478 std::variant<Doacross, WithLocators> u; // Doacross form is legacy
479};
480
481// V5.2: [3.5] `destroy` clause
482template <typename T, typename I, typename E> //
483struct DestroyT {
485 using WrapperTrait = std::true_type;
486 // DestroyVar can be ommitted in "depobj destroy".
488};
489
490// V5.2: [12.5.2] `detach` clause
491template <typename T, typename I, typename E> //
492struct DetachT {
494 using WrapperTrait = std::true_type;
496};
497
498// V5.2: [13.2] `device` clause
499template <typename T, typename I, typename E> //
500struct DeviceT {
502 ENUM(DeviceModifier, Ancestor, DeviceNum);
503 using TupleTrait = std::true_type;
504 std::tuple<OPT(DeviceModifier), DeviceDescription> t;
505};
506
507// V5.2: [13.1] `device_type` clause
508template <typename T, typename I, typename E> //
510 ENUM(DeviceTypeDescription, Any, Host, Nohost);
511 using WrapperTrait = std::true_type;
512 DeviceTypeDescription v;
513};
514
515// V5.2: [11.6.1] `dist_schedule` clause
516template <typename T, typename I, typename E> //
518 ENUM(Kind, Static);
519 using ChunkSize = E;
520 using TupleTrait = std::true_type;
521 std::tuple<Kind, OPT(ChunkSize)> t;
522};
523
524// V5.2: [15.9.6] `doacross` clause
525template <typename T, typename I, typename E> //
526struct DoacrossT {
528 ENUM(DependenceType, Source, Sink);
529 using TupleTrait = std::true_type;
530 // Empty Vector means "omp_cur_iteration"
531 std::tuple<DependenceType, Vector> t;
532};
533
534// V5.2: [8.2.1] `requirement` clauses
535template <typename T, typename I, typename E> //
537 using EmptyTrait = std::true_type;
538};
539
540// V5.2: [5.8.4] `enter` clause
541template <typename T, typename I, typename E> //
542struct EnterT {
544 using WrapperTrait = std::true_type;
546};
547
548// V5.2: [5.6.2] `exclusive` clause
549template <typename T, typename I, typename E> //
551 using WrapperTrait = std::true_type;
554};
555
556// V5.2: [15.8.3] `extended-atomic` clauses
557template <typename T, typename I, typename E> //
558struct FailT {
559 using MemoryOrder = type::MemoryOrder;
560 using WrapperTrait = std::true_type;
562};
563
564// V5.2: [10.5.1] `filter` clause
565template <typename T, typename I, typename E> //
566struct FilterT {
567 using ThreadNum = E;
568 using WrapperTrait = std::true_type;
570};
571
572// V5.2: [12.3] `final` clause
573template <typename T, typename I, typename E> //
574struct FinalT {
575 using Finalize = E;
576 using WrapperTrait = std::true_type;
578};
579
580// V5.2: [5.4.4] `firstprivate` clause
581template <typename T, typename I, typename E> //
584 using WrapperTrait = std::true_type;
586};
587
588// V5.2: [5.9.2] `from` clause
589template <typename T, typename I, typename E> //
590struct FromT {
592 using Expectation = type::MotionExpectation;
594 // See note at the definition of the MapperT type.
595 using Mappers = ListT<type::MapperT<I, E>>; // Not a spec name
596
597 using TupleTrait = std::true_type;
599};
600
601// V5.2: [9.2.1] `full` clause
602template <typename T, typename I, typename E> //
603struct FullT {
604 using EmptyTrait = std::true_type;
605};
606
607// V5.2: [12.6.1] `grainsize` clause
608template <typename T, typename I, typename E> //
610 ENUM(Prescriptiveness, Strict);
611 using GrainSize = E;
612 using TupleTrait = std::true_type;
613 std::tuple<OPT(Prescriptiveness), GrainSize> t;
614};
615
616// V5.2: [5.4.9] `has_device_addr` clause
617template <typename T, typename I, typename E> //
620 using WrapperTrait = std::true_type;
622};
623
624// V5.2: [15.1.2] `hint` clause
625template <typename T, typename I, typename E> //
626struct HintT {
627 using HintExpr = E;
628 using WrapperTrait = std::true_type;
630};
631
632// V5.2: [8.3.1] Assumption clauses
633template <typename T, typename I, typename E> //
634struct HoldsT {
635 using WrapperTrait = std::true_type;
636 E v; // No argument name in spec 5.2
637};
638
639// V5.2: [3.4] `if` clause
640template <typename T, typename I, typename E> //
641struct IfT {
644 using TupleTrait = std::true_type;
646};
647
648// V5.2: [7.7.1] `branch` clauses
649template <typename T, typename I, typename E> //
650struct InbranchT {
651 using EmptyTrait = std::true_type;
652};
653
654// V5.2: [5.6.1] `exclusive` clause
655template <typename T, typename I, typename E> //
658 using WrapperTrait = std::true_type;
660};
661
662// V5.2: [7.8.3] `indirect` clause
663template <typename T, typename I, typename E> //
664struct IndirectT {
666 using WrapperTrait = std::true_type;
668};
669
670// V5.2: [14.1.2] `init` clause
671template <typename T, typename I, typename E> //
672struct InitT {
676 ENUM(InteropType, Target, Targetsync); // Repeatable
677 using InteropTypes = ListT<InteropType>; // Not a spec name
678
679 using TupleTrait = std::true_type;
681};
682
683// V5.2: [5.5.4] `initializer` clause
684template <typename T, typename I, typename E> //
687 using WrapperTrait = std::true_type;
689};
690
691// V5.2: [5.5.10] `in_reduction` clause
692template <typename T, typename I, typename E> //
695 // See note at the definition of the ReductionIdentifierT type.
696 // The name ReductionIdentifiers is not a spec name.
698 using TupleTrait = std::true_type;
699 std::tuple<ReductionIdentifiers, List> t;
700};
701
702// V5.2: [5.4.7] `is_device_ptr` clause
703template <typename T, typename I, typename E> //
706 using WrapperTrait = std::true_type;
708};
709
710// V5.2: [5.4.5] `lastprivate` clause
711template <typename T, typename I, typename E> //
714 ENUM(LastprivateModifier, Conditional);
715 using TupleTrait = std::true_type;
716 std::tuple<OPT(LastprivateModifier), List> t;
717};
718
719// V5.2: [5.4.6] `linear` clause
720template <typename T, typename I, typename E> //
721struct LinearT {
722 // std::get<type> won't work here due to duplicate types in the tuple.
726 ENUM(LinearModifier, Ref, Val, Uval);
727
728 using TupleTrait = std::true_type;
729 // Step == nullptr means 1.
731 OPT(LinearModifier), List>
733};
734
735// V5.2: [5.8.5] `link` clause
736template <typename T, typename I, typename E> //
737struct LinkT {
739 using WrapperTrait = std::true_type;
741};
742
743// V5.2: [5.8.3] `map` clause
744template <typename T, typename I, typename E> //
745struct MapT {
747 ENUM(MapType, To, From, Tofrom, Alloc, Release, Delete);
748 ENUM(MapTypeModifier, Always, Close, Present, OmpxHold);
749 // See note at the definition of the MapperT type.
750 using Mappers = ListT<type::MapperT<I, E>>; // Not a spec name
752 using MapTypeModifiers = ListT<MapTypeModifier>; // Not a spec name
753
754 using TupleTrait = std::true_type;
755 std::tuple<OPT(MapType), OPT(MapTypeModifiers), OPT(Mappers), OPT(Iterator),
758};
759
760// V5.2: [7.5.1] `match` clause
761template <typename T, typename I, typename E> //
762struct MatchT {
763 using IncompleteTrait = std::true_type;
764};
765
766// V5.2: [12.2] `mergeable` clause
767template <typename T, typename I, typename E> //
769 using EmptyTrait = std::true_type;
770};
771
772// V5.2: [8.5.2] `message` clause
773template <typename T, typename I, typename E> //
774struct MessageT {
775 using MsgString = E;
776 using WrapperTrait = std::true_type;
778};
779
780// V5.2: [7.6.2] `nocontext` clause
781template <typename T, typename I, typename E> //
784 using WrapperTrait = std::true_type;
786};
787
788// V5.2: [15.7] `nowait` clause
789template <typename T, typename I, typename E> //
790struct NogroupT {
791 using EmptyTrait = std::true_type;
792};
793
794// V5.2: [10.4.1] `nontemporal` clause
795template <typename T, typename I, typename E> //
798 using WrapperTrait = std::true_type;
800};
801
802// V5.2: [8.3.1] `assumption` clauses
803template <typename T, typename I, typename E> //
804struct NoOpenmpT {
805 using EmptyTrait = std::true_type;
806};
807
808// V5.2: [8.3.1] `assumption` clauses
809template <typename T, typename I, typename E> //
811 using EmptyTrait = std::true_type;
812};
813
814// V5.2: [8.3.1] `assumption` clauses
815template <typename T, typename I, typename E> //
817 using EmptyTrait = std::true_type;
818};
819
820// V5.2: [7.7.1] `branch` clauses
821template <typename T, typename I, typename E> //
823 using EmptyTrait = std::true_type;
824};
825
826// V5.2: [7.6.1] `novariants` clause
827template <typename T, typename I, typename E> //
830 using WrapperTrait = std::true_type;
832};
833
834// V5.2: [15.6] `nowait` clause
835template <typename T, typename I, typename E> //
836struct NowaitT {
837 using EmptyTrait = std::true_type;
838};
839
840// V5.2: [12.6.2] `num_tasks` clause
841template <typename T, typename I, typename E> //
842struct NumTasksT {
843 using NumTasks = E;
844 ENUM(Prescriptiveness, Strict);
845 using TupleTrait = std::true_type;
846 std::tuple<OPT(Prescriptiveness), NumTasks> t;
847};
848
849// V5.2: [10.2.1] `num_teams` clause
850template <typename T, typename I, typename E> //
851struct NumTeamsT {
852 using TupleTrait = std::true_type;
853 using LowerBound = E;
854 using UpperBound = E;
855 std::tuple<OPT(LowerBound), UpperBound> t;
856};
857
858// V5.2: [10.1.2] `num_threads` clause
859template <typename T, typename I, typename E> //
861 using Nthreads = E;
862 using WrapperTrait = std::true_type;
864};
865
866template <typename T, typename I, typename E> //
868 using EmptyTrait = std::true_type;
869};
870
871template <typename T, typename I, typename E> //
872struct OmpxBareT {
873 using EmptyTrait = std::true_type;
874};
875
876template <typename T, typename I, typename E> //
878 using WrapperTrait = std::true_type;
880};
881
882// V5.2: [10.3] `order` clause
883template <typename T, typename I, typename E> //
884struct OrderT {
885 ENUM(OrderModifier, Reproducible, Unconstrained);
886 ENUM(Ordering, Concurrent);
887 using TupleTrait = std::true_type;
888 std::tuple<OPT(OrderModifier), Ordering> t;
889};
890
891// V5.2: [4.4.4] `ordered` clause
892template <typename T, typename I, typename E> //
893struct OrderedT {
894 using N = E;
895 using WrapperTrait = std::true_type;
896 OPT(N) v;
897};
898
899// V5.2: [7.4.2] `otherwise` clause
900template <typename T, typename I, typename E> //
902 using IncompleteTrait = std::true_type;
903};
904
905// V5.2: [9.2.2] `partial` clause
906template <typename T, typename I, typename E> //
907struct PartialT {
909 using WrapperTrait = std::true_type;
911};
912
913// V5.2: [12.4] `priority` clause
914template <typename T, typename I, typename E> //
915struct PriorityT {
917 using WrapperTrait = std::true_type;
919};
920
921// V5.2: [5.4.3] `private` clause
922template <typename T, typename I, typename E> //
923struct PrivateT {
925 using WrapperTrait = std::true_type;
927};
928
929// V5.2: [10.1.4] `proc_bind` clause
930template <typename T, typename I, typename E> //
931struct ProcBindT {
932 ENUM(AffinityPolicy, Close, Master, Spread, Primary);
933 using WrapperTrait = std::true_type;
934 AffinityPolicy v;
935};
936
937// V5.2: [15.8.2] Atomic clauses
938template <typename T, typename I, typename E> //
939struct ReadT {
940 using EmptyTrait = std::true_type;
941};
942
943// V5.2: [5.5.8] `reduction` clause
944template <typename T, typename I, typename E> //
947 // See note at the definition of the ReductionIdentifierT type.
948 // The name ReductionIdentifiers is not a spec name.
950 ENUM(ReductionModifier, Default, Inscan, Task);
951 using TupleTrait = std::true_type;
952 std::tuple<OPT(ReductionModifier), ReductionIdentifiers, List> t;
953};
954
955// V5.2: [15.8.1] `memory-order` clauses
956template <typename T, typename I, typename E> //
957struct RelaxedT {
958 using EmptyTrait = std::true_type;
959};
960
961// V5.2: [15.8.1] `memory-order` clauses
962template <typename T, typename I, typename E> //
963struct ReleaseT {
964 using EmptyTrait = std::true_type;
965};
966
967// V5.2: [8.2.1] `requirement` clauses
968template <typename T, typename I, typename E> //
970 using EmptyTrait = std::true_type;
971};
972
973// V5.2: [10.4.2] `safelen` clause
974template <typename T, typename I, typename E> //
975struct SafelenT {
976 using Length = E;
977 using WrapperTrait = std::true_type;
979};
980
981// V5.2: [11.5.3] `schedule` clause
982template <typename T, typename I, typename E> //
983struct ScheduleT {
984 ENUM(Kind, Static, Dynamic, Guided, Auto, Runtime);
985 using ChunkSize = E;
986 ENUM(OrderingModifier, Monotonic, Nonmonotonic);
987 ENUM(ChunkModifier, Simd);
988 using TupleTrait = std::true_type;
989 std::tuple<Kind, OPT(OrderingModifier), OPT(ChunkModifier), OPT(ChunkSize)> t;
990};
991
992// V5.2: [15.8.1] Memory-order clauses
993template <typename T, typename I, typename E> //
994struct SeqCstT {
995 using EmptyTrait = std::true_type;
996};
997
998// V5.2: [8.5.1] `severity` clause
999template <typename T, typename I, typename E> //
1001 ENUM(SevLevel, Fatal, Warning);
1002 using WrapperTrait = std::true_type;
1003 SevLevel v;
1004};
1005
1006// V5.2: [5.4.2] `shared` clause
1007template <typename T, typename I, typename E> //
1008struct SharedT {
1010 using WrapperTrait = std::true_type;
1012};
1013
1014// V5.2: [15.10.3] `parallelization-level` clauses
1015template <typename T, typename I, typename E> //
1016struct SimdT {
1017 using EmptyTrait = std::true_type;
1018};
1019
1020// V5.2: [10.4.3] `simdlen` clause
1021template <typename T, typename I, typename E> //
1022struct SimdlenT {
1023 using Length = E;
1024 using WrapperTrait = std::true_type;
1026};
1027
1028// V5.2: [9.1.1] `sizes` clause
1029template <typename T, typename I, typename E> //
1030struct SizesT {
1032 using WrapperTrait = std::true_type;
1034};
1035
1036// V5.2: [5.5.9] `task_reduction` clause
1037template <typename T, typename I, typename E> //
1040 // See note at the definition of the ReductionIdentifierT type.
1041 // The name ReductionIdentifiers is not a spec name.
1043 using TupleTrait = std::true_type;
1044 std::tuple<ReductionIdentifiers, List> t;
1045};
1046
1047// V5.2: [13.3] `thread_limit` clause
1048template <typename T, typename I, typename E> //
1050 using Threadlim = E;
1051 using WrapperTrait = std::true_type;
1053};
1054
1055// V5.2: [15.10.3] `parallelization-level` clauses
1056template <typename T, typename I, typename E> //
1057struct ThreadsT {
1058 using EmptyTrait = std::true_type;
1059};
1060
1061// V5.2: [5.9.1] `to` clause
1062template <typename T, typename I, typename E> //
1063struct ToT {
1065 using Expectation = type::MotionExpectation;
1066 // See note at the definition of the MapperT type.
1067 using Mappers = ListT<type::MapperT<I, E>>; // Not a spec name
1069
1070 using TupleTrait = std::true_type;
1072};
1073
1074// V5.2: [8.2.1] `requirement` clauses
1075template <typename T, typename I, typename E> //
1077 using EmptyTrait = std::true_type;
1078};
1079
1080// V5.2: [8.2.1] `requirement` clauses
1081template <typename T, typename I, typename E> //
1083 using EmptyTrait = std::true_type;
1084};
1085
1086// V5.2: [5.10] `uniform` clause
1087template <typename T, typename I, typename E> //
1088struct UniformT {
1090 using WrapperTrait = std::true_type;
1092};
1093
1094template <typename T, typename I, typename E> //
1095struct UnknownT {
1096 using EmptyTrait = std::true_type;
1097};
1098
1099// V5.2: [12.1] `untied` clause
1100template <typename T, typename I, typename E> //
1101struct UntiedT {
1102 using EmptyTrait = std::true_type;
1103};
1104
1105// Both of the following
1106// V5.2: [15.8.2] `atomic` clauses
1107// V5.2: [15.9.3] `update` clause
1108template <typename T, typename I, typename E> //
1109struct UpdateT {
1110 using TaskDependenceType = tomp::type::TaskDependenceType;
1111 using WrapperTrait = std::true_type;
1113};
1114
1115// V5.2: [14.1.3] `use` clause
1116template <typename T, typename I, typename E> //
1117struct UseT {
1119 using WrapperTrait = std::true_type;
1121};
1122
1123// V5.2: [5.4.10] `use_device_addr` clause
1124template <typename T, typename I, typename E> //
1127 using WrapperTrait = std::true_type;
1129};
1130
1131// V5.2: [5.4.8] `use_device_ptr` clause
1132template <typename T, typename I, typename E> //
1135 using WrapperTrait = std::true_type;
1137};
1138
1139// V5.2: [6.8] `uses_allocators` clause
1140template <typename T, typename I, typename E> //
1142 using MemSpace = E;
1144 using Allocator = E;
1146 std::tuple<OPT(MemSpace), OPT(TraitsArray), Allocator>; // Not a spec name
1147 using Allocators = ListT<AllocatorSpec>; // Not a spec name
1148 using WrapperTrait = std::true_type;
1150};
1151
1152// V5.2: [15.8.3] `extended-atomic` clauses
1153template <typename T, typename I, typename E> //
1154struct WeakT {
1155 using EmptyTrait = std::true_type;
1156};
1157
1158// V5.2: [7.4.1] `when` clause
1159template <typename T, typename I, typename E> //
1160struct WhenT {
1161 using IncompleteTrait = std::true_type;
1162};
1163
1164// V5.2: [15.8.2] Atomic clauses
1165template <typename T, typename I, typename E> //
1166struct WriteT {
1167 using EmptyTrait = std::true_type;
1168};
1169
1170// ---
1171
1172template <typename T, typename I, typename E>
1174 std::variant<OmpxAttributeT<T, I, E>, OmpxBareT<T, I, E>,
1176
1177template <typename T, typename I, typename E>
1178using EmptyClausesT = std::variant<
1188
1189template <typename T, typename I, typename E>
1191 std::variant<AdjustArgsT<T, I, E>, AppendArgsT<T, I, E>, MatchT<T, I, E>,
1193
1194template <typename T, typename I, typename E>
1196 std::variant<AffinityT<T, I, E>, AlignedT<T, I, E>, AllocateT<T, I, E>,
1203
1204template <typename T, typename I, typename E>
1205using UnionClausesT = std::variant<DependT<T, I, E>>;
1206
1207template <typename T, typename I, typename E>
1208using WrapperClausesT = std::variant<
1225
1226template <typename T, typename I, typename E>
1234 >::type;
1235
1236} // namespace clause
1237
1238// The variant wrapper that encapsulates all possible specific clauses.
1239// The `Extras` arguments are additional types representing local extensions
1240// to the clause set, e.g.
1241//
1242// using Clause = ClauseT<Type, Id, Expr,
1243// MyClause1, MyClause2>;
1244//
1245// The member Clause::u will be a variant containing all specific clauses
1246// defined above, plus MyClause1 and MyClause2.
1247template <typename TypeType, typename IdType, typename ExprType,
1248 typename... Extras>
1249struct ClauseT {
1250 using TypeTy = TypeType;
1251 using IdTy = IdType;
1252 using ExprTy = ExprType;
1253
1254 using VariantTy = typename type::Union<
1256 std::variant<Extras...>>::type;
1257
1258 llvm::omp::Clause id; // The numeric id of the clause
1259 using UnionTrait = std::true_type;
1261};
1262
1263} // namespace tomp
1264
1265#undef OPT
1266#undef ENUM
1267
1268#endif // LLVM_FRONTEND_OPENMP_CLAUSET_H
BlockVerifier::State From
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
#define ENUM(Name,...)
Definition: ClauseT.h:61
#define OPT(x)
Definition: ClauseT.h:62
This file defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
@ Default
Definition: DwarfDebug.cpp:87
#define T
uint64_t Thread
Definition: Profile.cpp:48
This file contains some templates that are useful if you are working with the STL at all.
This file defines the SmallVector class.
@ None
static constexpr int Concat[]
constexpr bool is_variant_v
Definition: ClauseT.h:122
OutputIt transform(R &&Range, OutputIt d_first, UnaryFunction F)
Wrapper function around std::transform to apply a function to a range and store the result elsewhere.
Definition: STLExtras.h:1928
typename llvm::remove_cvref< T >::type remove_cvref_t
Implement std::hash so that hash_code can be used in STL containers.
Definition: BitVector.h:858
std::variant< DependT< T, I, E > > UnionClausesT
Definition: ClauseT.h:1205
std::variant< AcqRelT< T, I, E >, AcquireT< T, I, E >, CaptureT< T, I, E >, CompareT< T, I, E >, DynamicAllocatorsT< T, I, E >, FullT< T, I, E >, InbranchT< T, I, E >, MergeableT< T, I, E >, NogroupT< T, I, E >, NoOpenmpRoutinesT< T, I, E >, NoOpenmpT< T, I, E >, NoParallelismT< T, I, E >, NotinbranchT< T, I, E >, NowaitT< T, I, E >, ReadT< T, I, E >, RelaxedT< T, I, E >, ReleaseT< T, I, E >, ReverseOffloadT< T, I, E >, SeqCstT< T, I, E >, SimdT< T, I, E >, ThreadsT< T, I, E >, UnifiedAddressT< T, I, E >, UnifiedSharedMemoryT< T, I, E >, UnknownT< T, I, E >, UntiedT< T, I, E >, UseT< T, I, E >, WeakT< T, I, E >, WriteT< T, I, E > > EmptyClausesT
Definition: ClauseT.h:1187
typename type::Union< EmptyClausesT< T, I, E >, ExtensionClausesT< T, I, E >, IncompleteClausesT< T, I, E >, TupleClausesT< T, I, E >, UnionClausesT< T, I, E >, WrapperClausesT< T, I, E > >::type UnionOfAllClausesT
Definition: ClauseT.h:1234
std::variant< AbsentT< T, I, E >, AlignT< T, I, E >, AllocatorT< T, I, E >, AtomicDefaultMemOrderT< T, I, E >, AtT< T, I, E >, BindT< T, I, E >, CollapseT< T, I, E >, ContainsT< T, I, E >, CopyinT< T, I, E >, CopyprivateT< T, I, E >, DefaultT< T, I, E >, DestroyT< T, I, E >, DetachT< T, I, E >, DeviceTypeT< T, I, E >, EnterT< T, I, E >, ExclusiveT< T, I, E >, FailT< T, I, E >, FilterT< T, I, E >, FinalT< T, I, E >, FirstprivateT< T, I, E >, HasDeviceAddrT< T, I, E >, HintT< T, I, E >, HoldsT< T, I, E >, InclusiveT< T, I, E >, IndirectT< T, I, E >, InitializerT< T, I, E >, IsDevicePtrT< T, I, E >, LinkT< T, I, E >, MessageT< T, I, E >, NocontextT< T, I, E >, NontemporalT< T, I, E >, NovariantsT< T, I, E >, NumTeamsT< T, I, E >, NumThreadsT< T, I, E >, OrderedT< T, I, E >, PartialT< T, I, E >, PriorityT< T, I, E >, PrivateT< T, I, E >, ProcBindT< T, I, E >, SafelenT< T, I, E >, SeverityT< T, I, E >, SharedT< T, I, E >, SimdlenT< T, I, E >, SizesT< T, I, E >, ThreadLimitT< T, I, E >, UniformT< T, I, E >, UpdateT< T, I, E >, UseDeviceAddrT< T, I, E >, UseDevicePtrT< T, I, E >, UsesAllocatorsT< T, I, E > > WrapperClausesT
Definition: ClauseT.h:1224
std::variant< OmpxAttributeT< T, I, E >, OmpxBareT< T, I, E >, OmpxDynCgroupMemT< T, I, E > > ExtensionClausesT
Definition: ClauseT.h:1175
std::variant< AdjustArgsT< T, I, E >, AppendArgsT< T, I, E >, MatchT< T, I, E >, OtherwiseT< T, I, E >, WhenT< T, I, E > > IncompleteClausesT
Definition: ClauseT.h:1192
std::variant< AffinityT< T, I, E >, AlignedT< T, I, E >, AllocateT< T, I, E >, DefaultmapT< T, I, E >, DeviceT< T, I, E >, DistScheduleT< T, I, E >, DoacrossT< T, I, E >, FromT< T, I, E >, GrainsizeT< T, I, E >, IfT< T, I, E >, InitT< T, I, E >, InReductionT< T, I, E >, LastprivateT< T, I, E >, LinearT< T, I, E >, MapT< T, I, E >, NumTasksT< T, I, E >, OrderT< T, I, E >, ReductionT< T, I, E >, ScheduleT< T, I, E >, TaskReductionT< T, I, E >, ToT< T, I, E > > TupleClausesT
Definition: ClauseT.h:1202
llvm::omp::Directive DirectiveName
Definition: ClauseT.h:183
Definition: ClauseT.h:133
ListT< ResultTy > makeList(ContainerTy &&container, FunctionTy &&func)
Definition: ClauseT.h:281
#define EQ(a, b)
Definition: regexec.c:112
static constexpr bool value
Definition: ClauseT.h:115
IdType IdTy
Definition: ClauseT.h:1251
std::true_type UnionTrait
Definition: ClauseT.h:1259
ExprType ExprTy
Definition: ClauseT.h:1252
typename type::Union< clause::UnionOfAllClausesT< TypeType, IdType, ExprType >, std::variant< Extras... > >::type VariantTy
Definition: ClauseT.h:1256
VariantTy u
Definition: ClauseT.h:1260
llvm::omp::Clause id
Definition: ClauseT.h:1258
TypeType TypeTy
Definition: ClauseT.h:1250
std::true_type WrapperTrait
Definition: ClauseT.h:292
std::true_type EmptyTrait
Definition: ClauseT.h:299
std::true_type EmptyTrait
Definition: ClauseT.h:305
std::true_type IncompleteTrait
Definition: ClauseT.h:311
std::tuple< OPT(Iterator), LocatorList > t
Definition: ClauseT.h:321
std::true_type TupleTrait
Definition: ClauseT.h:320
std::true_type WrapperTrait
Definition: ClauseT.h:329
std::tuple< OPT(Alignment), List > t
Definition: ClauseT.h:340
std::true_type TupleTrait
Definition: ClauseT.h:339
std::true_type TupleTrait
Definition: ClauseT.h:354
std::tuple< OPT(AllocatorSimpleModifier), OPT(AllocatorComplexModifier), OPT(AlignModifier), List > t
Definition: ClauseT.h:357
std::true_type WrapperTrait
Definition: ClauseT.h:364
std::true_type IncompleteTrait
Definition: ClauseT.h:371
ActionTime v
Definition: ClauseT.h:379
ENUM(ActionTime, Compilation, Execution)
std::true_type WrapperTrait
Definition: ClauseT.h:378
ENUM(Binding, Teams, Parallel, Thread)
std::true_type WrapperTrait
Definition: ClauseT.h:394
std::true_type EmptyTrait
Definition: ClauseT.h:401
std::true_type WrapperTrait
Definition: ClauseT.h:408
std::true_type EmptyTrait
Definition: ClauseT.h:415
std::true_type WrapperTrait
Definition: ClauseT.h:422
std::true_type WrapperTrait
Definition: ClauseT.h:430
std::true_type WrapperTrait
Definition: ClauseT.h:438
DataSharingAttribute v
Definition: ClauseT.h:447
std::true_type WrapperTrait
Definition: ClauseT.h:446
ENUM(DataSharingAttribute, Firstprivate, None, Private, Shared)
ENUM(VariableCategory, Scalar, Aggregate, Pointer, Allocatable)
ENUM(ImplicitBehavior, Alloc, To, From, Tofrom, Firstprivate, None, Default, Present)
std::tuple< ImplicitBehavior, OPT(VariableCategory)> t
Definition: ClauseT.h:457
std::true_type TupleTrait
Definition: ClauseT.h:456
std::tuple< TaskDependenceType, OPT(Iterator), LocatorList > t
Definition: ClauseT.h:473
std::true_type UnionTrait
Definition: ClauseT.h:477
tomp::type::TaskDependenceType TaskDependenceType
Definition: ClauseT.h:468
std::variant< Doacross, WithLocators > u
Definition: ClauseT.h:478
std::true_type WrapperTrait
Definition: ClauseT.h:485
EventHandle v
Definition: ClauseT.h:495
std::true_type WrapperTrait
Definition: ClauseT.h:494
std::tuple< OPT(DeviceModifier), DeviceDescription > t
Definition: ClauseT.h:504
std::true_type TupleTrait
Definition: ClauseT.h:503
ENUM(DeviceModifier, Ancestor, DeviceNum)
DeviceTypeDescription v
Definition: ClauseT.h:512
std::true_type WrapperTrait
Definition: ClauseT.h:511
ENUM(DeviceTypeDescription, Any, Host, Nohost)
std::tuple< Kind, OPT(ChunkSize)> t
Definition: ClauseT.h:521
std::true_type TupleTrait
Definition: ClauseT.h:520
std::true_type TupleTrait
Definition: ClauseT.h:529
std::tuple< DependenceType, Vector > t
Definition: ClauseT.h:531
ENUM(DependenceType, Source, Sink)
std::true_type WrapperTrait
Definition: ClauseT.h:544
std::true_type WrapperTrait
Definition: ClauseT.h:551
MemoryOrder v
Definition: ClauseT.h:561
std::true_type WrapperTrait
Definition: ClauseT.h:560
type::MemoryOrder MemoryOrder
Definition: ClauseT.h:559
std::true_type WrapperTrait
Definition: ClauseT.h:568
std::true_type WrapperTrait
Definition: ClauseT.h:576
std::true_type WrapperTrait
Definition: ClauseT.h:584
std::true_type TupleTrait
Definition: ClauseT.h:597
std::tuple< OPT(Expectation), OPT(Mappers), OPT(Iterator), LocatorList > t
Definition: ClauseT.h:598
type::MotionExpectation Expectation
Definition: ClauseT.h:592
std::true_type EmptyTrait
Definition: ClauseT.h:604
std::true_type TupleTrait
Definition: ClauseT.h:612
ENUM(Prescriptiveness, Strict)
std::tuple< OPT(Prescriptiveness), GrainSize > t
Definition: ClauseT.h:613
std::true_type WrapperTrait
Definition: ClauseT.h:620
std::true_type WrapperTrait
Definition: ClauseT.h:628
std::true_type WrapperTrait
Definition: ClauseT.h:635
std::tuple< OPT(DirectiveNameModifier), IfExpression > t
Definition: ClauseT.h:645
std::true_type TupleTrait
Definition: ClauseT.h:644
type::DirectiveName DirectiveNameModifier
Definition: ClauseT.h:642
std::tuple< ReductionIdentifiers, List > t
Definition: ClauseT.h:699
std::true_type TupleTrait
Definition: ClauseT.h:698
std::true_type EmptyTrait
Definition: ClauseT.h:651
std::true_type WrapperTrait
Definition: ClauseT.h:658
std::true_type WrapperTrait
Definition: ClauseT.h:666
InvokedByFptr v
Definition: ClauseT.h:667
ListT< InteropType > InteropTypes
Definition: ClauseT.h:677
std::tuple< OPT(InteropPreference), InteropTypes, InteropVar > t
Definition: ClauseT.h:680
ENUM(InteropType, Target, Targetsync)
std::true_type TupleTrait
Definition: ClauseT.h:679
InitializerExpr v
Definition: ClauseT.h:688
std::true_type WrapperTrait
Definition: ClauseT.h:687
std::true_type WrapperTrait
Definition: ClauseT.h:706
std::tuple< OPT(LastprivateModifier), List > t
Definition: ClauseT.h:716
ENUM(LastprivateModifier, Conditional)
std::true_type TupleTrait
Definition: ClauseT.h:715
std::true_type TupleTrait
Definition: ClauseT.h:728
ENUM(LinearModifier, Ref, Val, Uval)
std::tuple< OPT(StepSimpleModifier), OPT(StepComplexModifier), OPT(LinearModifier), List > t
Definition: ClauseT.h:732
std::true_type WrapperTrait
Definition: ClauseT.h:739
ENUM(MapTypeModifier, Always, Close, Present, OmpxHold)
ENUM(MapType, To, From, Tofrom, Alloc, Release, Delete)
std::tuple< OPT(MapType), OPT(MapTypeModifiers), OPT(Mappers), OPT(Iterator), LocatorList > t
Definition: ClauseT.h:757
std::true_type TupleTrait
Definition: ClauseT.h:754
std::true_type IncompleteTrait
Definition: ClauseT.h:763
std::true_type EmptyTrait
Definition: ClauseT.h:769
std::true_type WrapperTrait
Definition: ClauseT.h:776
std::true_type EmptyTrait
Definition: ClauseT.h:805
std::true_type EmptyTrait
Definition: ClauseT.h:817
std::true_type WrapperTrait
Definition: ClauseT.h:784
DoNotUpdateContext v
Definition: ClauseT.h:785
std::true_type EmptyTrait
Definition: ClauseT.h:791
std::true_type WrapperTrait
Definition: ClauseT.h:798
std::true_type EmptyTrait
Definition: ClauseT.h:823
std::true_type WrapperTrait
Definition: ClauseT.h:830
DoNotUseVariant v
Definition: ClauseT.h:831
std::true_type EmptyTrait
Definition: ClauseT.h:837
std::tuple< OPT(Prescriptiveness), NumTasks > t
Definition: ClauseT.h:846
ENUM(Prescriptiveness, Strict)
std::true_type TupleTrait
Definition: ClauseT.h:845
std::true_type TupleTrait
Definition: ClauseT.h:852
std::tuple< OPT(LowerBound), UpperBound > t
Definition: ClauseT.h:855
std::true_type WrapperTrait
Definition: ClauseT.h:862
std::true_type EmptyTrait
Definition: ClauseT.h:868
std::true_type EmptyTrait
Definition: ClauseT.h:873
std::true_type WrapperTrait
Definition: ClauseT.h:878
std::tuple< OPT(OrderModifier), Ordering > t
Definition: ClauseT.h:888
ENUM(OrderModifier, Reproducible, Unconstrained)
std::true_type TupleTrait
Definition: ClauseT.h:887
ENUM(Ordering, Concurrent)
std::true_type WrapperTrait
Definition: ClauseT.h:895
std::true_type IncompleteTrait
Definition: ClauseT.h:902
std::true_type WrapperTrait
Definition: ClauseT.h:909
OPT(UnrollFactor) v
std::true_type WrapperTrait
Definition: ClauseT.h:917
PriorityValue v
Definition: ClauseT.h:918
std::true_type WrapperTrait
Definition: ClauseT.h:925
AffinityPolicy v
Definition: ClauseT.h:934
std::true_type WrapperTrait
Definition: ClauseT.h:933
ENUM(AffinityPolicy, Close, Master, Spread, Primary)
std::true_type EmptyTrait
Definition: ClauseT.h:940
std::true_type TupleTrait
Definition: ClauseT.h:951
std::tuple< OPT(ReductionModifier), ReductionIdentifiers, List > t
Definition: ClauseT.h:952
ENUM(ReductionModifier, Default, Inscan, Task)
ListT< type::ReductionIdentifierT< I, E > > ReductionIdentifiers
Definition: ClauseT.h:949
std::true_type EmptyTrait
Definition: ClauseT.h:958
std::true_type EmptyTrait
Definition: ClauseT.h:964
std::true_type EmptyTrait
Definition: ClauseT.h:970
std::true_type WrapperTrait
Definition: ClauseT.h:977
std::true_type TupleTrait
Definition: ClauseT.h:988
std::tuple< Kind, OPT(OrderingModifier), OPT(ChunkModifier), OPT(ChunkSize)> t
Definition: ClauseT.h:989
ENUM(OrderingModifier, Monotonic, Nonmonotonic)
ENUM(ChunkModifier, Simd)
ENUM(Kind, Static, Dynamic, Guided, Auto, Runtime)
std::true_type EmptyTrait
Definition: ClauseT.h:995
ENUM(SevLevel, Fatal, Warning)
std::true_type WrapperTrait
Definition: ClauseT.h:1002
std::true_type WrapperTrait
Definition: ClauseT.h:1010
std::true_type EmptyTrait
Definition: ClauseT.h:1017
std::true_type WrapperTrait
Definition: ClauseT.h:1024
std::true_type WrapperTrait
Definition: ClauseT.h:1032
std::true_type TupleTrait
Definition: ClauseT.h:1043
std::tuple< ReductionIdentifiers, List > t
Definition: ClauseT.h:1044
std::true_type WrapperTrait
Definition: ClauseT.h:1051
std::true_type EmptyTrait
Definition: ClauseT.h:1058
std::true_type TupleTrait
Definition: ClauseT.h:1070
type::MotionExpectation Expectation
Definition: ClauseT.h:1065
std::tuple< OPT(Expectation), OPT(Mappers), OPT(Iterator), LocatorList > t
Definition: ClauseT.h:1071
std::true_type EmptyTrait
Definition: ClauseT.h:1077
std::true_type WrapperTrait
Definition: ClauseT.h:1090
ParameterList v
Definition: ClauseT.h:1091
std::true_type EmptyTrait
Definition: ClauseT.h:1096
std::true_type EmptyTrait
Definition: ClauseT.h:1102
std::true_type WrapperTrait
Definition: ClauseT.h:1111
OPT(TaskDependenceType) v
tomp::type::TaskDependenceType TaskDependenceType
Definition: ClauseT.h:1110
std::true_type WrapperTrait
Definition: ClauseT.h:1127
std::true_type WrapperTrait
Definition: ClauseT.h:1135
InteropVar v
Definition: ClauseT.h:1120
std::true_type WrapperTrait
Definition: ClauseT.h:1119
std::true_type WrapperTrait
Definition: ClauseT.h:1148
std::tuple< OPT(MemSpace), OPT(TraitsArray), Allocator > AllocatorSpec
Definition: ClauseT.h:1146
std::true_type EmptyTrait
Definition: ClauseT.h:1155
std::true_type IncompleteTrait
Definition: ClauseT.h:1161
std::true_type EmptyTrait
Definition: ClauseT.h:1167
std::true_type UnionTrait
Definition: ClauseT.h:193
std::variant< DefinedOpName, IntrinsicOperator > u
Definition: ClauseT.h:194
ENUM(IntrinsicOperator, Power, Multiply, Divide, Add, Subtract, Concat, LT, LE, EQ, NE, GE, GT, NOT, AND, OR, EQV, NEQV, Min, Max)
std::true_type TupleTrait
Definition: ClauseT.h:209
std::tuple< OPT(TypeType), ObjectT< IdType, ExprType >, RangeT< ExprType > > t
Definition: ClauseT.h:210
std::tuple< DefinedOperatorT< I, E >, E > t
Definition: ClauseT.h:240
std::tuple< ObjectT< I, E >, OPT(Distance)> t
Definition: ClauseT.h:243
std::true_type TupleTrait
Definition: ClauseT.h:242
MapperIdentifier v
Definition: ClauseT.h:226
std::true_type WrapperTrait
Definition: ClauseT.h:225
std::true_type TupleTrait
Definition: ClauseT.h:201
std::tuple< E, E, OPT(E)> t
Definition: ClauseT.h:202
std::variant< DefinedOperatorT< I, E >, ProcedureDesignatorT< I, E > > u
Definition: ClauseT.h:262
typename detail::UnionOfTwo< T, typename Union< Ts... >::type >::type type
Definition: ClauseT.h:148
std::variant<> type
Definition: ClauseT.h:142