1//===-- OMP.td - OpenMP directive definition file ----------*- tablegen -*-===//
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//
9// This is the definition file for OpenMP directives and clauses.
10//
11//===----------------------------------------------------------------------===//
12
13include "llvm/Frontend/Directive/DirectiveBase.td"
14
15//===----------------------------------------------------------------------===//
16// Definition of general OpenMP information
17//===----------------------------------------------------------------------===//
18
19def OpenMP : DirectiveLanguage {
20  let name = "OpenMP";
21  let cppNamespace = "omp"; // final namespace will be llvm::omp
22  let directivePrefix = "OMPD_";
23  let clausePrefix = "OMPC_";
24  let makeEnumAvailableInNamespace = true;
25  let enableBitmaskEnumInNamespace = true;
26  let clauseEnumSetClass = "OmpClauseSet";
27  let flangClauseBaseClass = "OmpClause";
28}
29
30//===----------------------------------------------------------------------===//
31// Definition of OpenMP clauses
32//===----------------------------------------------------------------------===//
33
34def OMPC_Allocator : Clause<"allocator"> {
35  let clangClass = "OMPAllocatorClause";
36  let flangClass = "ScalarIntExpr";
37}
38def OMPC_If : Clause<"if"> {
39  let clangClass = "OMPIfClause";
40  let flangClass = "OmpIfClause";
41}
42def OMPC_Final : Clause<"final"> {
43  let clangClass = "OMPFinalClause";
44  let flangClass = "ScalarLogicalExpr";
45}
46def OMPC_NumThreads : Clause<"num_threads"> {
47  let clangClass = "OMPNumThreadsClause";
48  let flangClass = "ScalarIntExpr";
49}
50def OMPC_SafeLen : Clause<"safelen"> {
51  let clangClass = "OMPSafelenClause";
52  let flangClass = "ScalarIntConstantExpr";
53}
54def OMPC_SimdLen : Clause<"simdlen"> {
55  let clangClass = "OMPSimdlenClause";
56  let flangClass = "ScalarIntConstantExpr";
57}
58def OMPC_Collapse : Clause<"collapse"> {
59  let clangClass = "OMPCollapseClause";
60  let flangClass = "ScalarIntConstantExpr";
61}
62def OMPC_Default : Clause<"default"> {
63  let clangClass = "OMPDefaultClause";
64  let flangClass = "OmpDefaultClause";
65}
66def OMPC_Private : Clause<"private"> {
67  let clangClass = "OMPPrivateClause";
68  let flangClass = "OmpObjectList";
69}
70def OMPC_Sizes: Clause<"sizes"> {
71  let clangClass = "OMPSizesClause";
72  let flangClass = "ScalarIntExpr";
73  let isValueList = true;
74  }
75def OMPC_Full: Clause<"full"> {
76  let clangClass = "OMPFullClause";
77}
78def OMPC_Partial: Clause<"partial"> {
79  let clangClass = "OMPPartialClause";
80  let flangClass = "ScalarIntConstantExpr";
81  let isValueOptional = true;
82 }
83def OMPC_FirstPrivate : Clause<"firstprivate"> {
84  let clangClass = "OMPFirstprivateClause";
85  let flangClass = "OmpObjectList";
86}
87def OMPC_LastPrivate : Clause<"lastprivate"> {
88  let clangClass = "OMPLastprivateClause";
89  let flangClass = "OmpObjectList";
90}
91def OMPC_Shared : Clause<"shared"> {
92  let clangClass = "OMPSharedClause";
93  let flangClass = "OmpObjectList";
94}
95def OMPC_Reduction : Clause<"reduction"> {
96  let clangClass = "OMPReductionClause";
97  let flangClass = "OmpReductionClause";
98}
99def OMPC_Linear : Clause<"linear"> {
100  let clangClass = "OMPLinearClause";
101  let flangClass = "OmpLinearClause";
102}
103def OMPC_Aligned : Clause<"aligned"> {
104  let clangClass = "OMPAlignedClause";
105  let flangClass = "OmpAlignedClause";
106}
107def OMPC_Copyin : Clause<"copyin"> {
108  let clangClass = "OMPCopyinClause";
109  let flangClass = "OmpObjectList";
110}
111def OMPC_CopyPrivate : Clause<"copyprivate"> {
112  let clangClass = "OMPCopyprivateClause";
113  let flangClass = "OmpObjectList";
114}
115def OMP_PROC_BIND_master : ClauseVal<"master",2,1> {}
116def OMP_PROC_BIND_close : ClauseVal<"close",3,1> {}
117def OMP_PROC_BIND_spread : ClauseVal<"spread",4,1> {}
118def OMP_PROC_BIND_primary : ClauseVal<"primary",5,1> {}
119def OMP_PROC_BIND_default : ClauseVal<"default",6,0> {}
120def OMP_PROC_BIND_unknown : ClauseVal<"unknown",7,0> { let isDefault = true; }
121def OMPC_ProcBind : Clause<"proc_bind"> {
122  let clangClass = "OMPProcBindClause";
123  let flangClass = "OmpProcBindClause";
124  let enumClauseValue = "ProcBindKind";
125  let allowedClauseValues = [
126    OMP_PROC_BIND_primary,
127    OMP_PROC_BIND_master,
128    OMP_PROC_BIND_close,
129    OMP_PROC_BIND_spread,
130    OMP_PROC_BIND_default,
131    OMP_PROC_BIND_unknown
132  ];
133}
134
135def OMP_SCHEDULE_Static : ClauseVal<"static", 2, 1> {}
136def OMP_SCHEDULE_Dynamic : ClauseVal<"dynamic", 3, 1> {}
137def OMP_SCHEDULE_Guided : ClauseVal<"guided", 4, 1> {}
138def OMP_SCHEDULE_Auto : ClauseVal<"auto", 5, 1> {}
139def OMP_SCHEDULE_Runtime : ClauseVal<"runtime", 6, 1> {}
140def OMP_SCHEDULE_Default : ClauseVal<"default", 7, 0> { let isDefault = 1; }
141
142def OMPC_Schedule : Clause<"schedule"> {
143  let clangClass = "OMPScheduleClause";
144  let flangClass = "OmpScheduleClause";
145  let enumClauseValue = "ScheduleKind";
146  let allowedClauseValues = [
147    OMP_SCHEDULE_Static,
148    OMP_SCHEDULE_Dynamic,
149    OMP_SCHEDULE_Guided,
150    OMP_SCHEDULE_Auto,
151    OMP_SCHEDULE_Runtime,
152    OMP_SCHEDULE_Default
153  ];
154}
155
156def OMP_MEMORY_ORDER_SeqCst : ClauseVal<"seq_cst", 1, 1> {}
157def OMP_MEMORY_ORDER_AcqRel : ClauseVal<"acq_rel", 2, 1> {}
158def OMP_MEMORY_ORDER_Acquire : ClauseVal<"acquire", 3, 1> {}
159def OMP_MEMORY_ORDER_Release : ClauseVal<"release", 4, 1> {}
160def OMP_MEMORY_ORDER_Relaxed : ClauseVal<"relaxed", 5, 1> {}
161def OMP_MEMORY_ORDER_Default : ClauseVal<"default", 6, 0> {
162  let isDefault = 1;
163}
164def OMPC_MemoryOrder : Clause<"memory_order"> {
165  let enumClauseValue = "MemoryOrderKind";
166  let allowedClauseValues = [
167    OMP_MEMORY_ORDER_SeqCst,
168    OMP_MEMORY_ORDER_AcqRel,
169    OMP_MEMORY_ORDER_Acquire,
170    OMP_MEMORY_ORDER_Release,
171    OMP_MEMORY_ORDER_Relaxed,
172    OMP_MEMORY_ORDER_Default
173  ];
174}
175
176def OMP_CANCELLATION_CONSTRUCT_Parallel : ClauseVal<"parallel", 1, 1> {}
177def OMP_CANCELLATION_CONSTRUCT_Loop : ClauseVal<"loop", 2, 1> {}
178def OMP_CANCELLATION_CONSTRUCT_Sections : ClauseVal<"sections", 3, 1> {}
179def OMP_CANCELLATION_CONSTRUCT_Taskgroup : ClauseVal<"taskgroup", 4, 1> {}
180def OMP_CANCELLATION_CONSTRUCT_None : ClauseVal<"none", 5, 0> {
181  let isDefault = 1;
182}
183
184def OMPC_CancellationConstructType : Clause<"cancellation_construct_type"> {
185  let enumClauseValue = "CancellationConstructType";
186  let allowedClauseValues = [
187    OMP_CANCELLATION_CONSTRUCT_Parallel,
188    OMP_CANCELLATION_CONSTRUCT_Loop,
189    OMP_CANCELLATION_CONSTRUCT_Sections,
190    OMP_CANCELLATION_CONSTRUCT_Taskgroup,
191    OMP_CANCELLATION_CONSTRUCT_None
192  ];
193}
194
195def OMPC_Ordered : Clause<"ordered"> {
196  let clangClass = "OMPOrderedClause";
197  let flangClass = "ScalarIntConstantExpr";
198  let isValueOptional = true;
199}
200def OMPC_NoWait : Clause<"nowait"> {
201  let clangClass = "OMPNowaitClause";
202}
203def OMPC_Untied : Clause<"untied"> { let clangClass = "OMPUntiedClause"; }
204def OMPC_Mergeable : Clause<"mergeable"> {
205  let clangClass = "OMPMergeableClause";
206}
207def OMPC_Read : Clause<"read"> { let clangClass = "OMPReadClause"; }
208def OMPC_Write : Clause<"write"> { let clangClass = "OMPWriteClause"; }
209def OMPC_Update : Clause<"update"> { let clangClass = "OMPUpdateClause"; }
210def OMPC_Capture : Clause<"capture"> { let clangClass = "OMPCaptureClause"; }
211def OMPC_Compare : Clause<"compare"> { let clangClass = "OMPCompareClause"; }
212def OMPC_Fail : Clause<"fail"> { let clangClass = "OMPFailClause"; }
213def OMPC_SeqCst : Clause<"seq_cst"> { let clangClass = "OMPSeqCstClause"; }
214def OMPC_AcqRel : Clause<"acq_rel"> { let clangClass = "OMPAcqRelClause"; }
215def OMPC_Acquire : Clause<"acquire"> { let clangClass = "OMPAcquireClause"; }
216def OMPC_Release : Clause<"release"> { let clangClass = "OMPReleaseClause"; }
217def OMPC_Relaxed : Clause<"relaxed"> { let clangClass = "OMPRelaxedClause"; }
218def OMPC_Depend : Clause<"depend"> {
219  let clangClass = "OMPDependClause";
220  let flangClass = "OmpDependClause";
221}
222def OMPC_Device : Clause<"device"> {
223  let clangClass = "OMPDeviceClause";
224  let flangClass = "OmpDeviceClause";
225}
226def OMPC_DeviceType : Clause<"device_type"> {
227  let flangClass = "OmpDeviceTypeClause";
228}
229def OMPC_Threads : Clause<"threads"> { let clangClass = "OMPThreadsClause"; }
230def OMPC_Simd : Clause<"simd"> { let clangClass = "OMPSIMDClause"; }
231def OMPC_Map : Clause<"map"> {
232  let clangClass = "OMPMapClause";
233  let flangClass = "OmpMapClause";
234}
235def OMPC_NumTeams : Clause<"num_teams"> {
236  let clangClass = "OMPNumTeamsClause";
237  let flangClass = "ScalarIntExpr";
238}
239def OMPC_ThreadLimit : Clause<"thread_limit"> {
240  let clangClass = "OMPThreadLimitClause";
241  let flangClass = "ScalarIntExpr";
242}
243def OMPC_Priority : Clause<"priority"> {
244  let clangClass = "OMPPriorityClause";
245  let flangClass = "ScalarIntExpr";
246}
247
248def OMP_GRAINSIZE_Strict : ClauseVal<"strict", 1, 1> {}
249def OMP_GRAINSIZE_Unknown : ClauseVal<"unkonwn", 2, 0> { let isDefault = 1; }
250
251def OMPC_GrainSize : Clause<"grainsize"> {
252  let clangClass = "OMPGrainsizeClause";
253  let flangClass = "ScalarIntExpr";
254  let enumClauseValue = "GrainsizeType";
255  let allowedClauseValues = [
256    OMP_GRAINSIZE_Strict,
257    OMP_GRAINSIZE_Unknown
258  ];
259}
260def OMPC_NoGroup : Clause<"nogroup"> {
261  let clangClass = "OMPNogroupClause";
262}
263
264def OMP_NUMTASKS_Strict : ClauseVal<"strict", 1, 1> {}
265def OMP_NUMTASKS_Unknown : ClauseVal<"unkonwn", 2, 0> { let isDefault = 1; }
266
267def OMPC_NumTasks : Clause<"num_tasks"> {
268  let clangClass = "OMPNumTasksClause";
269  let flangClass = "ScalarIntExpr";
270  let enumClauseValue = "NumTasksType";
271  let allowedClauseValues = [
272    OMP_NUMTASKS_Strict,
273    OMP_NUMTASKS_Unknown
274  ];
275}
276def OMPC_Hint : Clause<"hint"> {
277  let clangClass = "OMPHintClause";
278  let flangClass = "ConstantExpr";
279}
280def OMPC_DistSchedule : Clause<"dist_schedule"> {
281  let clangClass = "OMPDistScheduleClause";
282  let flangClass = "ScalarIntExpr";
283  let isValueOptional = true;
284}
285def OMPC_DefaultMap : Clause<"defaultmap"> {
286  let clangClass = "OMPDefaultmapClause";
287  let flangClass = "OmpDefaultmapClause";
288}
289def OMPC_To : Clause<"to"> {
290  let clangClass = "OMPToClause";
291  let flangClass = "OmpObjectList";
292}
293def OMPC_Enter : Clause<"enter"> {
294  let flangClass = "OmpObjectList";
295}
296def OMPC_From : Clause<"from"> {
297  let clangClass = "OMPFromClause";
298  let flangClass = "OmpObjectList";
299}
300def OMPC_UseDevicePtr : Clause<"use_device_ptr"> {
301  let clangClass = "OMPUseDevicePtrClause";
302  let flangClass = "OmpObjectList";
303}
304def OMPC_IsDevicePtr : Clause<"is_device_ptr"> {
305  let clangClass = "OMPIsDevicePtrClause";
306  let flangClass = "OmpObjectList";
307}
308def OMPC_HasDeviceAddr : Clause<"has_device_addr"> {
309  let clangClass = "OMPHasDeviceAddrClause";
310  let flangClass = "OmpObjectList";
311}
312def OMPC_TaskReduction : Clause<"task_reduction"> {
313  let clangClass = "OMPTaskReductionClause";
314  let flangClass = "OmpReductionClause";
315}
316def OMPC_InReduction : Clause<"in_reduction"> {
317  let clangClass = "OMPInReductionClause";
318  let flangClass = "OmpInReductionClause";
319}
320def OMPC_UnifiedAddress : Clause<"unified_address"> {
321  let clangClass = "OMPUnifiedAddressClause";
322}
323def OMPC_UnifiedSharedMemory : Clause<"unified_shared_memory"> {
324  let clangClass = "OMPUnifiedSharedMemoryClause";
325}
326def OMPC_ReverseOffload : Clause<"reverse_offload"> {
327  let clangClass = "OMPReverseOffloadClause";
328}
329def OMPC_DynamicAllocators : Clause<"dynamic_allocators"> {
330  let clangClass = "OMPDynamicAllocatorsClause";
331}
332def OMPC_AtomicDefaultMemOrder : Clause<"atomic_default_mem_order"> {
333  let clangClass = "OMPAtomicDefaultMemOrderClause";
334  let flangClass = "OmpAtomicDefaultMemOrderClause";
335}
336def OMPC_At : Clause<"at"> {
337  let clangClass = "OMPAtClause";
338}
339def OMPC_Severity : Clause<"severity"> {
340  let clangClass = "OMPSeverityClause";
341}
342def OMPC_Message : Clause<"message"> {
343  let clangClass = "OMPMessageClause";
344}
345def OMPC_Allocate : Clause<"allocate"> {
346  let clangClass = "OMPAllocateClause";
347  let flangClass = "OmpAllocateClause";
348}
349def OMPC_NonTemporal : Clause<"nontemporal"> {
350  let clangClass = "OMPNontemporalClause";
351  let flangClass = "Name";
352  let isValueList = true;
353}
354
355def OMP_ORDER_concurrent : ClauseVal<"concurrent",1,1> {}
356def OMP_ORDER_unknown : ClauseVal<"unknown",2,0> { let isDefault = 1; }
357def OMPC_Order : Clause<"order"> {
358  let clangClass = "OMPOrderClause";
359  let flangClass = "OmpOrderClause";
360  let enumClauseValue = "OrderKind";
361  let allowedClauseValues = [
362    OMP_ORDER_unknown,
363    OMP_ORDER_concurrent
364  ];
365}
366def OMPC_Init : Clause<"init"> {
367  let clangClass = "OMPInitClause";
368}
369def OMPC_Use : Clause<"use"> {
370  let clangClass = "OMPUseClause";
371}
372def OMPC_Destroy : Clause<"destroy"> {
373  let clangClass = "OMPDestroyClause";
374}
375def OMPC_Novariants : Clause<"novariants"> {
376  let clangClass = "OMPNovariantsClause";
377  let flangClass = "ScalarLogicalExpr";
378}
379def OMPC_Nocontext : Clause<"nocontext"> {
380  let clangClass = "OMPNocontextClause";
381  let flangClass = "ScalarLogicalExpr";
382}
383def OMPC_Detach : Clause<"detach"> {
384  let clangClass = "OMPDetachClause";
385}
386def OMPC_Inclusive : Clause<"inclusive"> {
387  let clangClass = "OMPInclusiveClause";
388}
389def OMPC_Exclusive : Clause<"exclusive"> {
390  let clangClass = "OMPExclusiveClause";
391}
392def OMPC_UsesAllocators : Clause<"uses_allocators"> {
393  let clangClass = "OMPUsesAllocatorsClause";
394}
395def OMPC_Affinity : Clause<"affinity"> {
396  let clangClass = "OMPAffinityClause";
397}
398def OMPC_UseDeviceAddr : Clause<"use_device_addr"> {
399  let clangClass = "OMPUseDeviceAddrClause";
400  let flangClass = "OmpObjectList";
401}
402def OMPC_Uniform : Clause<"uniform"> {
403  let flangClass = "Name";
404  let isValueList = true;
405}
406def OMPC_Match : Clause<"match"> {}
407def OMPC_AdjustArgs : Clause<"adjust_args"> { }
408def OMPC_AppendArgs : Clause<"append_args"> { }
409def OMPC_Depobj : Clause<"depobj"> {
410  let clangClass = "OMPDepobjClause";
411  let isImplicit = true;
412}
413def OMPC_Flush : Clause<"flush"> {
414  let clangClass = "OMPFlushClause";
415  let isImplicit = true;
416}
417def OMPC_ThreadPrivate : Clause<"threadprivate"> {
418  let alternativeName = "threadprivate or thread local";
419  let isImplicit = true;
420}
421def OMPC_Unknown : Clause<"unknown"> {
422  let isImplicit = true;
423  let isDefault = true;
424}
425def OMPC_Link : Clause<"link"> {
426  let flangClass = "OmpObjectList";
427}
428def OMPC_Indirect : Clause<"indirect"> {}
429def OMPC_Inbranch : Clause<"inbranch"> {}
430def OMPC_Notinbranch : Clause<"notinbranch"> {}
431def OMPC_Filter : Clause<"filter"> {
432  let clangClass = "OMPFilterClause";
433  let flangClass = "ScalarIntExpr";
434}
435def OMPC_Align : Clause<"align"> {
436  let clangClass = "OMPAlignClause";
437}
438def OMPC_When: Clause<"when"> {}
439
440def OMPC_Bind : Clause<"bind"> {
441  let clangClass = "OMPBindClause";
442}
443
444def OMPC_OMPX_DynCGroupMem : Clause<"ompx_dyn_cgroup_mem"> {
445  let clangClass = "OMPXDynCGroupMemClause";
446  let flangClass = "ScalarIntExpr";
447}
448
449def OMPC_Doacross : Clause<"doacross"> {
450  let clangClass = "OMPDoacrossClause";
451}
452
453def OMPC_OMPX_Attribute : Clause<"ompx_attribute"> {
454  let clangClass = "OMPXAttributeClause";
455}
456
457def OMPC_OMX_Bare : Clause<"ompx_bare"> {
458  let clangClass = "OMPXBareClause";
459}
460
461//===----------------------------------------------------------------------===//
462// Definition of OpenMP directives
463//===----------------------------------------------------------------------===//
464
465def OMP_ThreadPrivate : Directive<"threadprivate"> {}
466def OMP_Parallel : Directive<"parallel"> {
467  let allowedClauses = [
468    VersionedClause<OMPC_Private>,
469    VersionedClause<OMPC_FirstPrivate>,
470    VersionedClause<OMPC_Shared>,
471    VersionedClause<OMPC_Reduction>,
472    VersionedClause<OMPC_Copyin>,
473    VersionedClause<OMPC_Allocate>,
474    VersionedClause<OMPC_OMPX_Attribute>,
475  ];
476  let allowedOnceClauses = [
477    VersionedClause<OMPC_Default>,
478    VersionedClause<OMPC_If>,
479    VersionedClause<OMPC_NumThreads>,
480    VersionedClause<OMPC_ProcBind>,
481  ];
482}
483def OMP_Task : Directive<"task"> {
484  let allowedClauses = [
485    VersionedClause<OMPC_Private>,
486    VersionedClause<OMPC_FirstPrivate>,
487    VersionedClause<OMPC_Shared>,
488    VersionedClause<OMPC_Untied>,
489    VersionedClause<OMPC_Mergeable>,
490    VersionedClause<OMPC_Depend>,
491    VersionedClause<OMPC_InReduction>,
492    VersionedClause<OMPC_Allocate>,
493    VersionedClause<OMPC_Detach, 50>,
494    VersionedClause<OMPC_Affinity, 50>
495  ];
496  let allowedOnceClauses = [
497    VersionedClause<OMPC_Default>,
498    VersionedClause<OMPC_If>,
499    VersionedClause<OMPC_Final>,
500    VersionedClause<OMPC_Priority>
501  ];
502}
503def OMP_Simd : Directive<"simd"> {
504  let allowedClauses = [
505    VersionedClause<OMPC_Private>,
506    VersionedClause<OMPC_LastPrivate>,
507    VersionedClause<OMPC_Linear>,
508    VersionedClause<OMPC_Aligned>,
509    VersionedClause<OMPC_Reduction>,
510    VersionedClause<OMPC_Allocate>,
511    VersionedClause<OMPC_NonTemporal, 50>,
512  ];
513  let allowedOnceClauses = [
514    VersionedClause<OMPC_Collapse>,
515    VersionedClause<OMPC_SafeLen>,
516    VersionedClause<OMPC_SimdLen>,
517    VersionedClause<OMPC_If, 50>,
518    VersionedClause<OMPC_Order, 50>
519  ];
520}
521def OMP_Tile : Directive<"tile"> {
522  let allowedOnceClauses = [
523    VersionedClause<OMPC_Sizes, 51>,
524  ];
525}
526def OMP_Unroll : Directive<"unroll"> {
527  let allowedOnceClauses = [
528    VersionedClause<OMPC_Full, 51>,
529    VersionedClause<OMPC_Partial, 51>,
530  ];
531}
532def OMP_For : Directive<"for"> {
533  let allowedClauses = [
534    VersionedClause<OMPC_Private>,
535    VersionedClause<OMPC_LastPrivate>,
536    VersionedClause<OMPC_FirstPrivate>,
537    VersionedClause<OMPC_Reduction>,
538    VersionedClause<OMPC_Collapse>,
539    VersionedClause<OMPC_Schedule>,
540    VersionedClause<OMPC_Ordered>,
541    VersionedClause<OMPC_NoWait>,
542    VersionedClause<OMPC_Linear>,
543    VersionedClause<OMPC_Allocate>,
544    VersionedClause<OMPC_Order, 50>
545  ];
546}
547def OMP_Do : Directive<"do"> {
548  let allowedClauses = [
549    VersionedClause<OMPC_Private>,
550    VersionedClause<OMPC_FirstPrivate>,
551    VersionedClause<OMPC_LastPrivate>,
552    VersionedClause<OMPC_Linear>,
553    VersionedClause<OMPC_Reduction>
554  ];
555  let allowedOnceClauses = [
556    VersionedClause<OMPC_Schedule>,
557    VersionedClause<OMPC_Collapse>,
558    VersionedClause<OMPC_Ordered>,
559    VersionedClause<OMPC_NoWait>,
560    VersionedClause<OMPC_Order, 50>
561  ];
562}
563def OMP_Sections : Directive<"sections"> {
564  let allowedClauses = [
565    VersionedClause<OMPC_Private>,
566    VersionedClause<OMPC_LastPrivate>,
567    VersionedClause<OMPC_FirstPrivate>,
568    VersionedClause<OMPC_Reduction>,
569    VersionedClause<OMPC_NoWait>,
570    VersionedClause<OMPC_Allocate>
571  ];
572}
573def OMP_Section : Directive<"section"> {}
574def OMP_Single : Directive<"single"> {
575  let allowedClauses = [
576    VersionedClause<OMPC_Private>,
577    VersionedClause<OMPC_FirstPrivate>,
578    VersionedClause<OMPC_CopyPrivate>,
579    VersionedClause<OMPC_NoWait>,
580    VersionedClause<OMPC_Allocate>
581  ];
582}
583def OMP_Master : Directive<"master"> {}
584def OMP_Critical : Directive<"critical"> {
585  let allowedClauses = [
586    VersionedClause<OMPC_Hint>
587  ];
588}
589def OMP_TaskYield : Directive<"taskyield"> {}
590def OMP_Barrier : Directive<"barrier"> {}
591def OMP_Error : Directive<"error"> {
592  let allowedClauses = [
593    VersionedClause<OMPC_At, 51>,
594    VersionedClause<OMPC_Severity, 51>,
595    VersionedClause<OMPC_Message, 51>
596  ];
597}
598def OMP_TaskWait : Directive<"taskwait"> {
599  let allowedClauses = [
600    VersionedClause<OMPC_Depend, 50>,
601    VersionedClause<OMPC_NoWait, 51>
602  ];
603}
604def OMP_TaskGroup : Directive<"taskgroup"> {
605  let allowedClauses = [
606    VersionedClause<OMPC_TaskReduction, 50>,
607    VersionedClause<OMPC_Allocate, 50>
608  ];
609}
610def OMP_Flush : Directive<"flush"> {
611  let allowedOnceClauses = [
612    VersionedClause<OMPC_AcqRel, 50>,
613    VersionedClause<OMPC_Acquire, 50>,
614    VersionedClause<OMPC_Release, 50>,
615    // TODO This should ne `none` instead. Comment carried over from
616    // OMPKinds.def.
617    VersionedClause<OMPC_Flush>
618  ];
619}
620def OMP_Ordered : Directive<"ordered"> {
621  let allowedClauses = [
622    VersionedClause<OMPC_Depend>,
623    VersionedClause<OMPC_Doacross, 52>
624  ];
625  let allowedOnceClauses = [
626    VersionedClause<OMPC_Threads>,
627    VersionedClause<OMPC_Simd>
628  ];
629}
630def OMP_Atomic : Directive<"atomic"> {
631  let allowedClauses = [
632    VersionedClause<OMPC_Read>,
633    VersionedClause<OMPC_Write>,
634    VersionedClause<OMPC_Update>,
635    VersionedClause<OMPC_Capture>,
636    VersionedClause<OMPC_Compare, 51>
637  ];
638  let allowedOnceClauses = [
639    VersionedClause<OMPC_SeqCst>,
640    VersionedClause<OMPC_AcqRel, 50>,
641    VersionedClause<OMPC_Acquire, 50>,
642    VersionedClause<OMPC_Release, 50>,
643    VersionedClause<OMPC_Relaxed, 50>,
644    VersionedClause<OMPC_Hint, 50>,
645    VersionedClause<OMPC_Fail, 51>
646  ];
647}
648def OMP_Target : Directive<"target"> {
649  let allowedClauses = [
650    VersionedClause<OMPC_Map>,
651    VersionedClause<OMPC_Private>,
652    VersionedClause<OMPC_Depend>,
653    VersionedClause<OMPC_FirstPrivate>,
654    VersionedClause<OMPC_IsDevicePtr>,
655    VersionedClause<OMPC_HasDeviceAddr, 51>,
656    VersionedClause<OMPC_Reduction>,
657    VersionedClause<OMPC_InReduction, 50>,
658    VersionedClause<OMPC_Allocate>,
659    VersionedClause<OMPC_UsesAllocators, 50>,
660    VersionedClause<OMPC_OMPX_Attribute>,
661  ];
662  let allowedOnceClauses = [
663    VersionedClause<OMPC_If>,
664    VersionedClause<OMPC_Device>,
665    VersionedClause<OMPC_ThreadLimit, 51>,
666    VersionedClause<OMPC_DefaultMap>,
667    VersionedClause<OMPC_NoWait>,
668    VersionedClause<OMPC_OMPX_DynCGroupMem>,
669  ];
670}
671def OMP_Teams : Directive<"teams"> {
672  let allowedClauses = [
673    VersionedClause<OMPC_Private>,
674    VersionedClause<OMPC_FirstPrivate>,
675    VersionedClause<OMPC_Shared>,
676    VersionedClause<OMPC_Reduction>,
677    VersionedClause<OMPC_Allocate>,
678    VersionedClause<OMPC_OMPX_Attribute>,
679  ];
680  let allowedOnceClauses = [
681    VersionedClause<OMPC_Default>,
682    VersionedClause<OMPC_If, 52>,
683    VersionedClause<OMPC_NumTeams>,
684    VersionedClause<OMPC_ThreadLimit>
685  ];
686}
687def OMP_Cancel : Directive<"cancel"> {
688  let allowedOnceClauses = [
689    VersionedClause<OMPC_If>
690  ];
691}
692def OMP_Requires : Directive<"requires"> {
693  let allowedOnceClauses = [
694    VersionedClause<OMPC_UnifiedAddress>,
695    VersionedClause<OMPC_UnifiedSharedMemory>,
696    // OpenMP 5.2 Spec: If an implementation is not supporting a requirement
697    // (reverse offload in this case) then it should give compile-time error
698    // termination.
699    // Seeting supported version for reverse_offload to a distant future version
700    // 9.9 so that its partial support can be tested in the meantime.
701    //
702    // TODO: Correct this supprted version number whenever complete
703    // implementation of reverse_offload is available.
704    VersionedClause<OMPC_ReverseOffload, 99>,
705    VersionedClause<OMPC_DynamicAllocators>,
706    VersionedClause<OMPC_AtomicDefaultMemOrder>
707  ];
708}
709def OMP_Nothing : Directive<"nothing"> {}
710def OMP_TargetData : Directive<"target data"> {
711  let allowedClauses = [
712    VersionedClause<OMPC_UseDevicePtr>,
713    VersionedClause<OMPC_UseDeviceAddr, 50>
714  ];
715  let allowedOnceClauses = [
716    VersionedClause<OMPC_Device>,
717    VersionedClause<OMPC_If>
718  ];
719  let requiredClauses = [
720    VersionedClause<OMPC_Map>
721  ];
722}
723def OMP_TargetEnterData : Directive<"target enter data"> {
724  let allowedClauses = [
725    VersionedClause<OMPC_Depend>
726  ];
727  let allowedOnceClauses = [
728    VersionedClause<OMPC_If>,
729    VersionedClause<OMPC_Device>,
730    VersionedClause<OMPC_NoWait>
731  ];
732  let requiredClauses = [
733    VersionedClause<OMPC_Map>
734  ];
735}
736def OMP_TargetExitData : Directive<"target exit data"> {
737  let allowedClauses = [
738    VersionedClause<OMPC_Depend>
739  ];
740  let allowedOnceClauses = [
741    VersionedClause<OMPC_Device>,
742    VersionedClause<OMPC_If>,
743    VersionedClause<OMPC_NoWait>
744  ];
745  let requiredClauses = [
746    VersionedClause<OMPC_Map>
747  ];
748}
749def OMP_TargetParallel : Directive<"target parallel"> {
750  let allowedClauses = [
751    VersionedClause<OMPC_If>,
752    VersionedClause<OMPC_Map>,
753    VersionedClause<OMPC_NoWait>,
754    VersionedClause<OMPC_Depend>,
755    VersionedClause<OMPC_Private>,
756    VersionedClause<OMPC_FirstPrivate>,
757    VersionedClause<OMPC_Default>,
758    VersionedClause<OMPC_Shared>,
759    VersionedClause<OMPC_Reduction>,
760    VersionedClause<OMPC_IsDevicePtr>,
761    VersionedClause<OMPC_HasDeviceAddr, 51>,
762    VersionedClause<OMPC_Allocate>,
763    VersionedClause<OMPC_UsesAllocators, 50>,
764    VersionedClause<OMPC_OMPX_Attribute>,
765  ];
766  let allowedOnceClauses = [
767    VersionedClause<OMPC_DefaultMap>,
768    VersionedClause<OMPC_Device>,
769    VersionedClause<OMPC_NumThreads>,
770    VersionedClause<OMPC_ProcBind>,
771    VersionedClause<OMPC_OMPX_DynCGroupMem>,
772    VersionedClause<OMPC_ThreadLimit, 51>,
773  ];
774}
775def OMP_TargetParallelFor : Directive<"target parallel for"> {
776  let allowedClauses = [
777    VersionedClause<OMPC_If>,
778    VersionedClause<OMPC_Device>,
779    VersionedClause<OMPC_Map>,
780    VersionedClause<OMPC_Private>,
781    VersionedClause<OMPC_FirstPrivate>,
782    VersionedClause<OMPC_LastPrivate>,
783    VersionedClause<OMPC_NoWait>,
784    VersionedClause<OMPC_Depend>,
785    VersionedClause<OMPC_DefaultMap>,
786    VersionedClause<OMPC_NumThreads>,
787    VersionedClause<OMPC_Default>,
788    VersionedClause<OMPC_ProcBind>,
789    VersionedClause<OMPC_Shared>,
790    VersionedClause<OMPC_Reduction>,
791    VersionedClause<OMPC_Collapse>,
792    VersionedClause<OMPC_Schedule>,
793    VersionedClause<OMPC_Ordered>,
794    VersionedClause<OMPC_Linear>,
795    VersionedClause<OMPC_IsDevicePtr>,
796    VersionedClause<OMPC_HasDeviceAddr, 51>,
797    VersionedClause<OMPC_Allocate>,
798    VersionedClause<OMPC_Order, 50>,
799    VersionedClause<OMPC_UsesAllocators, 50>,
800    VersionedClause<OMPC_OMPX_Attribute>,
801  ];
802  let allowedOnceClauses = [
803    VersionedClause<OMPC_OMPX_DynCGroupMem>,
804    VersionedClause<OMPC_ThreadLimit, 51>,
805  ];
806}
807def OMP_TargetParallelDo : Directive<"target parallel do"> {
808  let allowedClauses = [
809    VersionedClause<OMPC_If>,
810    VersionedClause<OMPC_Map>,
811    VersionedClause<OMPC_Private>,
812    VersionedClause<OMPC_FirstPrivate>,
813    VersionedClause<OMPC_LastPrivate>,
814    VersionedClause<OMPC_Depend>,
815    VersionedClause<OMPC_Shared>,
816    VersionedClause<OMPC_Reduction>,
817    VersionedClause<OMPC_Linear>,
818    VersionedClause<OMPC_IsDevicePtr>,
819    VersionedClause<OMPC_HasDeviceAddr, 51>,
820    VersionedClause<OMPC_Allocator>,
821    VersionedClause<OMPC_UsesAllocators>,
822    VersionedClause<OMPC_Default>,
823    VersionedClause<OMPC_Copyin>
824  ];
825  let allowedOnceClauses = [
826    VersionedClause<OMPC_NumThreads>,
827    VersionedClause<OMPC_ProcBind>,
828    VersionedClause<OMPC_Device>,
829    VersionedClause<OMPC_DefaultMap>,
830    VersionedClause<OMPC_Schedule>,
831    VersionedClause<OMPC_Collapse>,
832    VersionedClause<OMPC_Ordered>,
833    VersionedClause<OMPC_NoWait>,
834    VersionedClause<OMPC_Order, 50>
835  ];
836}
837def OMP_TargetUpdate : Directive<"target update"> {
838  let allowedClauses = [
839    VersionedClause<OMPC_To>,
840    VersionedClause<OMPC_From>,
841    VersionedClause<OMPC_Depend>
842  ];
843  let allowedOnceClauses = [
844    VersionedClause<OMPC_Device>,
845    VersionedClause<OMPC_If>,
846    VersionedClause<OMPC_NoWait>
847  ];
848}
849def OMP_ParallelFor : Directive<"parallel for"> {
850  let allowedClauses = [
851    VersionedClause<OMPC_If>,
852    VersionedClause<OMPC_NumThreads>,
853    VersionedClause<OMPC_Default>,
854    VersionedClause<OMPC_ProcBind>,
855    VersionedClause<OMPC_Private>,
856    VersionedClause<OMPC_FirstPrivate>,
857    VersionedClause<OMPC_Shared>,
858    VersionedClause<OMPC_Reduction>,
859    VersionedClause<OMPC_Copyin>,
860    VersionedClause<OMPC_LastPrivate>,
861    VersionedClause<OMPC_Collapse>,
862    VersionedClause<OMPC_Schedule>,
863    VersionedClause<OMPC_Ordered>,
864    VersionedClause<OMPC_Linear>,
865    VersionedClause<OMPC_Allocate>,
866    VersionedClause<OMPC_Order, 50>,
867    VersionedClause<OMPC_OMPX_Attribute>,
868  ];
869}
870def OMP_ParallelDo : Directive<"parallel do"> {
871  let allowedClauses = [
872    VersionedClause<OMPC_Default>,
873    VersionedClause<OMPC_Private>,
874    VersionedClause<OMPC_FirstPrivate>,
875    VersionedClause<OMPC_Shared>,
876    VersionedClause<OMPC_Reduction>,
877    VersionedClause<OMPC_Copyin>,
878    VersionedClause<OMPC_LastPrivate>,
879    VersionedClause<OMPC_Linear>
880  ];
881  let allowedOnceClauses = [
882    VersionedClause<OMPC_If>,
883    VersionedClause<OMPC_NumThreads>,
884    VersionedClause<OMPC_ProcBind>,
885    VersionedClause<OMPC_Schedule>,
886    VersionedClause<OMPC_Ordered>,
887    VersionedClause<OMPC_Collapse>,
888    VersionedClause<OMPC_Order, 50>
889  ];
890}
891def OMP_ParallelForSimd : Directive<"parallel for simd"> {
892  let allowedClauses = [
893    VersionedClause<OMPC_If>,
894    VersionedClause<OMPC_NumThreads>,
895    VersionedClause<OMPC_Default>,
896    VersionedClause<OMPC_ProcBind>,
897    VersionedClause<OMPC_Private>,
898    VersionedClause<OMPC_FirstPrivate>,
899    VersionedClause<OMPC_Shared>,
900    VersionedClause<OMPC_Reduction>,
901    VersionedClause<OMPC_Copyin>,
902    VersionedClause<OMPC_LastPrivate>,
903    VersionedClause<OMPC_Collapse>,
904    VersionedClause<OMPC_Schedule>,
905    VersionedClause<OMPC_SafeLen>,
906    VersionedClause<OMPC_SimdLen>,
907    VersionedClause<OMPC_Linear>,
908    VersionedClause<OMPC_Aligned>,
909    VersionedClause<OMPC_Ordered>,
910    VersionedClause<OMPC_Allocate>,
911    VersionedClause<OMPC_NonTemporal, 50>,
912    VersionedClause<OMPC_Order, 50>,
913    VersionedClause<OMPC_OMPX_Attribute>,
914  ];
915}
916def OMP_ParallelDoSimd : Directive<"parallel do simd"> {
917  let allowedClauses = [
918    VersionedClause<OMPC_If>,
919    VersionedClause<OMPC_Default>,
920    VersionedClause<OMPC_Private>,
921    VersionedClause<OMPC_FirstPrivate>,
922    VersionedClause<OMPC_Shared>,
923    VersionedClause<OMPC_Reduction>,
924    VersionedClause<OMPC_Copyin>,
925    VersionedClause<OMPC_LastPrivate>,
926    VersionedClause<OMPC_Linear>,
927    VersionedClause<OMPC_Aligned>,
928    VersionedClause<OMPC_Allocate>,
929    VersionedClause<OMPC_NonTemporal>,
930  ];
931  let allowedOnceClauses = [
932    VersionedClause<OMPC_NumThreads>,
933    VersionedClause<OMPC_ProcBind>,
934    VersionedClause<OMPC_Schedule>,
935    VersionedClause<OMPC_Ordered>,
936    VersionedClause<OMPC_Collapse>,
937    VersionedClause<OMPC_SafeLen>,
938    VersionedClause<OMPC_SimdLen>,
939    VersionedClause<OMPC_Order, 50>
940  ];
941}
942def OMP_ParallelMaster : Directive<"parallel master"> {
943  let allowedClauses = [
944    VersionedClause<OMPC_If>,
945    VersionedClause<OMPC_NumThreads>,
946    VersionedClause<OMPC_Default>,
947    VersionedClause<OMPC_Private>,
948    VersionedClause<OMPC_FirstPrivate>,
949    VersionedClause<OMPC_Shared>,
950    VersionedClause<OMPC_Copyin>,
951    VersionedClause<OMPC_Reduction>,
952    VersionedClause<OMPC_ProcBind>,
953    VersionedClause<OMPC_Allocate>,
954    VersionedClause<OMPC_OMPX_Attribute>,
955  ];
956}
957def OMP_ParallelMasked : Directive<"parallel masked"> {
958  let allowedClauses = [
959    VersionedClause<OMPC_If>,
960    VersionedClause<OMPC_NumThreads>,
961    VersionedClause<OMPC_Default>,
962    VersionedClause<OMPC_Private>,
963    VersionedClause<OMPC_FirstPrivate>,
964    VersionedClause<OMPC_Shared>,
965    VersionedClause<OMPC_Copyin>,
966    VersionedClause<OMPC_Reduction>,
967    VersionedClause<OMPC_ProcBind>,
968    VersionedClause<OMPC_Allocate>,
969    VersionedClause<OMPC_Filter>,
970    VersionedClause<OMPC_OMPX_Attribute>,
971  ];
972}
973def OMP_ParallelSections : Directive<"parallel sections"> {
974  let allowedClauses = [
975    VersionedClause<OMPC_Default>,
976    VersionedClause<OMPC_ProcBind>,
977    VersionedClause<OMPC_Private>,
978    VersionedClause<OMPC_FirstPrivate>,
979    VersionedClause<OMPC_Shared>,
980    VersionedClause<OMPC_Reduction>,
981    VersionedClause<OMPC_Copyin>,
982    VersionedClause<OMPC_LastPrivate>,
983    VersionedClause<OMPC_Allocate>,
984    VersionedClause<OMPC_OMPX_Attribute>,
985  ];
986  let allowedOnceClauses = [
987    VersionedClause<OMPC_If>,
988    VersionedClause<OMPC_NumThreads>
989  ];
990}
991def OMP_ForSimd : Directive<"for simd"> {
992  let allowedClauses = [
993    VersionedClause<OMPC_Private>,
994    VersionedClause<OMPC_FirstPrivate>,
995    VersionedClause<OMPC_LastPrivate>,
996    VersionedClause<OMPC_Reduction>,
997    VersionedClause<OMPC_Schedule>,
998    VersionedClause<OMPC_Collapse>,
999    VersionedClause<OMPC_NoWait>,
1000    VersionedClause<OMPC_SafeLen>,
1001    VersionedClause<OMPC_SimdLen>,
1002    VersionedClause<OMPC_Linear>,
1003    VersionedClause<OMPC_Aligned>,
1004    VersionedClause<OMPC_Ordered>,
1005    VersionedClause<OMPC_Allocate>,
1006    VersionedClause<OMPC_If, 50>,
1007    VersionedClause<OMPC_NonTemporal, 50>,
1008    VersionedClause<OMPC_Order, 50>
1009  ];
1010}
1011def OMP_DoSimd : Directive<"do simd"> {
1012  let allowedClauses = [
1013    VersionedClause<OMPC_Aligned>,
1014    VersionedClause<OMPC_Private>,
1015    VersionedClause<OMPC_FirstPrivate>,
1016    VersionedClause<OMPC_LastPrivate>,
1017    VersionedClause<OMPC_Linear>,
1018    VersionedClause<OMPC_Reduction>
1019  ];
1020  let allowedOnceClauses = [
1021    VersionedClause<OMPC_If>,
1022    VersionedClause<OMPC_Schedule>,
1023    VersionedClause<OMPC_Collapse>,
1024    VersionedClause<OMPC_Ordered>,
1025    VersionedClause<OMPC_SafeLen>,
1026    VersionedClause<OMPC_SimdLen>,
1027    VersionedClause<OMPC_NoWait>,
1028    VersionedClause<OMPC_Order, 50>
1029  ];
1030}
1031def OMP_CancellationPoint : Directive<"cancellation point"> {}
1032def OMP_DeclareReduction : Directive<"declare reduction"> {}
1033def OMP_DeclareMapper : Directive<"declare mapper"> {
1034  let allowedClauses = [
1035    VersionedClause<OMPC_Map>
1036  ];
1037}
1038def OMP_DeclareSimd : Directive<"declare simd"> {
1039  let allowedClauses = [
1040    VersionedClause<OMPC_Linear>,
1041    VersionedClause<OMPC_Aligned>,
1042    VersionedClause<OMPC_Uniform>
1043  ];
1044  let allowedOnceClauses = [
1045    VersionedClause<OMPC_SimdLen>
1046  ];
1047  let allowedExclusiveClauses = [
1048    VersionedClause<OMPC_Inbranch>,
1049    VersionedClause<OMPC_Notinbranch>
1050  ];
1051}
1052def OMP_TaskLoop : Directive<"taskloop"> {
1053  let allowedClauses = [
1054    VersionedClause<OMPC_Shared>,
1055    VersionedClause<OMPC_Private>,
1056    VersionedClause<OMPC_FirstPrivate>,
1057    VersionedClause<OMPC_LastPrivate>,
1058    VersionedClause<OMPC_Untied>,
1059    VersionedClause<OMPC_Mergeable>,
1060    VersionedClause<OMPC_NoGroup>,
1061    VersionedClause<OMPC_Reduction>,
1062    VersionedClause<OMPC_InReduction>,
1063    VersionedClause<OMPC_Allocate>
1064  ];
1065  let allowedOnceClauses = [
1066    VersionedClause<OMPC_Default>,
1067    VersionedClause<OMPC_If>,
1068    VersionedClause<OMPC_Collapse>,
1069    VersionedClause<OMPC_Final>,
1070    VersionedClause<OMPC_Priority>,
1071  ];
1072  let allowedExclusiveClauses = [
1073    VersionedClause<OMPC_GrainSize>,
1074    VersionedClause<OMPC_NumTasks>
1075  ];
1076}
1077def OMP_TaskLoopSimd : Directive<"taskloop simd"> {
1078  let allowedClauses = [
1079    VersionedClause<OMPC_If>,
1080    VersionedClause<OMPC_Aligned>,
1081    VersionedClause<OMPC_Allocate>,
1082    VersionedClause<OMPC_Default>,
1083    VersionedClause<OMPC_FirstPrivate>,
1084    VersionedClause<OMPC_InReduction>,
1085    VersionedClause<OMPC_LastPrivate>,
1086    VersionedClause<OMPC_Linear>,
1087    VersionedClause<OMPC_Mergeable>,
1088    VersionedClause<OMPC_NoGroup>,
1089    VersionedClause<OMPC_NonTemporal, 50>,
1090    VersionedClause<OMPC_Private>,
1091    VersionedClause<OMPC_Reduction>,
1092    VersionedClause<OMPC_Shared>,
1093    VersionedClause<OMPC_Untied>
1094  ];
1095  let allowedOnceClauses = [
1096    VersionedClause<OMPC_Collapse>,
1097    VersionedClause<OMPC_SafeLen>,
1098    VersionedClause<OMPC_SimdLen>,
1099    VersionedClause<OMPC_Final>,
1100    VersionedClause<OMPC_Priority>,
1101    VersionedClause<OMPC_Order, 50>
1102  ];
1103  let allowedExclusiveClauses = [
1104    VersionedClause<OMPC_GrainSize>,
1105    VersionedClause<OMPC_NumTasks>
1106  ];
1107}
1108def OMP_Distribute : Directive<"distribute"> {
1109  let allowedClauses = [
1110    VersionedClause<OMPC_Private>,
1111    VersionedClause<OMPC_FirstPrivate>,
1112    VersionedClause<OMPC_LastPrivate>,
1113    VersionedClause<OMPC_Allocate>
1114  ];
1115  let allowedOnceClauses = [
1116    VersionedClause<OMPC_Collapse>,
1117    VersionedClause<OMPC_DistSchedule>
1118  ];
1119}
1120def OMP_BeginDeclareTarget : Directive<"begin declare target"> {
1121  let allowedClauses = [
1122    VersionedClause<OMPC_To>,
1123    VersionedClause<OMPC_Link>,
1124    VersionedClause<OMPC_DeviceType>,
1125    VersionedClause<OMPC_Indirect>
1126  ];
1127}
1128def OMP_DeclareTarget : Directive<"declare target"> {
1129  let allowedClauses = [
1130    VersionedClause<OMPC_To>,
1131    VersionedClause<OMPC_Link>,
1132    VersionedClause<OMPC_Indirect>,
1133    VersionedClause<OMPC_Enter, 52>
1134  ];
1135  let allowedOnceClauses = [
1136    VersionedClause<OMPC_DeviceType, 50>
1137  ];
1138}
1139def OMP_EndDeclareTarget : Directive<"end declare target"> {}
1140def OMP_DistributeParallelFor : Directive<"distribute parallel for"> {
1141  let allowedClauses = [
1142    VersionedClause<OMPC_FirstPrivate>,
1143    VersionedClause<OMPC_LastPrivate>,
1144    VersionedClause<OMPC_Collapse>,
1145    VersionedClause<OMPC_DistSchedule>,
1146    VersionedClause<OMPC_If>,
1147    VersionedClause<OMPC_NumThreads>,
1148    VersionedClause<OMPC_Default>,
1149    VersionedClause<OMPC_ProcBind>,
1150    VersionedClause<OMPC_Private>,
1151    VersionedClause<OMPC_Shared>,
1152    VersionedClause<OMPC_Reduction>,
1153    VersionedClause<OMPC_Copyin>,
1154    VersionedClause<OMPC_Schedule>,
1155    VersionedClause<OMPC_Allocate>,
1156    VersionedClause<OMPC_Order, 50>,
1157    VersionedClause<OMPC_OMPX_Attribute>,
1158  ];
1159}
1160def OMP_DistributeParallelDo : Directive<"distribute parallel do"> {
1161  let allowedClauses = [
1162    VersionedClause<OMPC_Private>,
1163    VersionedClause<OMPC_FirstPrivate>,
1164    VersionedClause<OMPC_LastPrivate>,
1165    VersionedClause<OMPC_Allocate>,
1166    VersionedClause<OMPC_Default>,
1167    VersionedClause<OMPC_Shared>,
1168    VersionedClause<OMPC_Reduction>,
1169    VersionedClause<OMPC_Copyin>,
1170    VersionedClause<OMPC_Linear>
1171  ];
1172  let allowedOnceClauses = [
1173    VersionedClause<OMPC_Collapse>,
1174    VersionedClause<OMPC_DistSchedule>,
1175    VersionedClause<OMPC_If>,
1176    VersionedClause<OMPC_NumThreads>,
1177    VersionedClause<OMPC_ProcBind>,
1178    VersionedClause<OMPC_Schedule>,
1179    VersionedClause<OMPC_Ordered>,
1180    VersionedClause<OMPC_Order, 50>
1181  ];
1182}
1183def OMP_DistributeParallelForSimd : Directive<"distribute parallel for simd"> {
1184  let allowedClauses = [
1185    VersionedClause<OMPC_FirstPrivate>,
1186    VersionedClause<OMPC_LastPrivate>,
1187    VersionedClause<OMPC_Collapse>,
1188    VersionedClause<OMPC_DistSchedule>,
1189    VersionedClause<OMPC_If>,
1190    VersionedClause<OMPC_NumThreads>,
1191    VersionedClause<OMPC_Default>,
1192    VersionedClause<OMPC_ProcBind>,
1193    VersionedClause<OMPC_Private>,
1194    VersionedClause<OMPC_Shared>,
1195    VersionedClause<OMPC_Reduction>,
1196    VersionedClause<OMPC_Copyin>,
1197    VersionedClause<OMPC_Schedule>,
1198    VersionedClause<OMPC_Linear>,
1199    VersionedClause<OMPC_Aligned>,
1200    VersionedClause<OMPC_SafeLen>,
1201    VersionedClause<OMPC_SimdLen>,
1202    VersionedClause<OMPC_Allocate>,
1203    VersionedClause<OMPC_NonTemporal, 50>,
1204    VersionedClause<OMPC_Order, 50>,
1205    VersionedClause<OMPC_OMPX_Attribute>,
1206  ];
1207}
1208def OMP_DistributeParallelDoSimd : Directive<"distribute parallel do simd"> {
1209  let allowedClauses = [
1210    VersionedClause<OMPC_FirstPrivate>,
1211    VersionedClause<OMPC_LastPrivate>,
1212    VersionedClause<OMPC_Collapse>,
1213    VersionedClause<OMPC_DistSchedule>,
1214    VersionedClause<OMPC_If>,
1215    VersionedClause<OMPC_NumThreads>,
1216    VersionedClause<OMPC_Default>,
1217    VersionedClause<OMPC_ProcBind>,
1218    VersionedClause<OMPC_Private>,
1219    VersionedClause<OMPC_Shared>,
1220    VersionedClause<OMPC_Reduction>,
1221    VersionedClause<OMPC_Copyin>,
1222    VersionedClause<OMPC_Schedule>,
1223    VersionedClause<OMPC_Linear>,
1224    VersionedClause<OMPC_Aligned>,
1225    VersionedClause<OMPC_SafeLen>,
1226    VersionedClause<OMPC_SimdLen>,
1227    VersionedClause<OMPC_Allocate>,
1228    VersionedClause<OMPC_NonTemporal>,
1229    VersionedClause<OMPC_Order, 50>
1230  ];
1231}
1232def OMP_DistributeSimd : Directive<"distribute simd"> {
1233  let allowedClauses = [
1234    VersionedClause<OMPC_Aligned>,
1235    VersionedClause<OMPC_Allocate>,
1236    VersionedClause<OMPC_Copyin>,
1237    VersionedClause<OMPC_Default>,
1238    VersionedClause<OMPC_Linear>,
1239    VersionedClause<OMPC_FirstPrivate>,
1240    VersionedClause<OMPC_LastPrivate>,
1241    VersionedClause<OMPC_NonTemporal, 50>,
1242    VersionedClause<OMPC_Private>,
1243    VersionedClause<OMPC_Reduction>
1244  ];
1245  let allowedOnceClauses = [
1246    VersionedClause<OMPC_Collapse>,
1247    VersionedClause<OMPC_DistSchedule>,
1248    VersionedClause<OMPC_If, 50>,
1249    VersionedClause<OMPC_NumThreads>,
1250    VersionedClause<OMPC_Ordered>,
1251    VersionedClause<OMPC_ProcBind>,
1252    VersionedClause<OMPC_Schedule>,
1253    VersionedClause<OMPC_SafeLen>,
1254    VersionedClause<OMPC_SimdLen>,
1255    VersionedClause<OMPC_Order, 50>
1256  ];
1257}
1258
1259def OMP_TargetParallelForSimd : Directive<"target parallel for simd"> {
1260  let allowedClauses = [
1261    VersionedClause<OMPC_If>,
1262    VersionedClause<OMPC_Device>,
1263    VersionedClause<OMPC_Map>,
1264    VersionedClause<OMPC_Private>,
1265    VersionedClause<OMPC_FirstPrivate>,
1266    VersionedClause<OMPC_LastPrivate>,
1267    VersionedClause<OMPC_NoWait>,
1268    VersionedClause<OMPC_Depend>,
1269    VersionedClause<OMPC_DefaultMap>,
1270    VersionedClause<OMPC_NumThreads>,
1271    VersionedClause<OMPC_Default>,
1272    VersionedClause<OMPC_ProcBind>,
1273    VersionedClause<OMPC_Shared>,
1274    VersionedClause<OMPC_Reduction>,
1275    VersionedClause<OMPC_Collapse>,
1276    VersionedClause<OMPC_Schedule>,
1277    VersionedClause<OMPC_Ordered>,
1278    VersionedClause<OMPC_Linear>,
1279    VersionedClause<OMPC_SafeLen>,
1280    VersionedClause<OMPC_SimdLen>,
1281    VersionedClause<OMPC_Aligned>,
1282    VersionedClause<OMPC_IsDevicePtr>,
1283    VersionedClause<OMPC_HasDeviceAddr, 51>,
1284    VersionedClause<OMPC_Allocate>,
1285    VersionedClause<OMPC_NonTemporal, 50>,
1286    VersionedClause<OMPC_Order, 50>,
1287    VersionedClause<OMPC_UsesAllocators, 50>,
1288    VersionedClause<OMPC_OMPX_Attribute>,
1289  ];
1290  let allowedOnceClauses = [
1291    VersionedClause<OMPC_OMPX_DynCGroupMem>,
1292    VersionedClause<OMPC_ThreadLimit, 51>,
1293  ];
1294}
1295def OMP_TargetParallelDoSimd : Directive<"target parallel do simd"> {
1296  let allowedClauses = [
1297    VersionedClause<OMPC_If>,
1298    VersionedClause<OMPC_Device>,
1299    VersionedClause<OMPC_Map>,
1300    VersionedClause<OMPC_Private>,
1301    VersionedClause<OMPC_FirstPrivate>,
1302    VersionedClause<OMPC_LastPrivate>,
1303    VersionedClause<OMPC_NoWait>,
1304    VersionedClause<OMPC_Depend>,
1305    VersionedClause<OMPC_DefaultMap>,
1306    VersionedClause<OMPC_NumThreads>,
1307    VersionedClause<OMPC_Default>,
1308    VersionedClause<OMPC_ProcBind>,
1309    VersionedClause<OMPC_Shared>,
1310    VersionedClause<OMPC_Reduction>,
1311    VersionedClause<OMPC_Collapse>,
1312    VersionedClause<OMPC_Schedule>,
1313    VersionedClause<OMPC_Ordered>,
1314    VersionedClause<OMPC_Linear>,
1315    VersionedClause<OMPC_SafeLen>,
1316    VersionedClause<OMPC_SimdLen>,
1317    VersionedClause<OMPC_Aligned>,
1318    VersionedClause<OMPC_IsDevicePtr>,
1319    VersionedClause<OMPC_HasDeviceAddr, 51>,
1320    VersionedClause<OMPC_Allocate>,
1321    VersionedClause<OMPC_NonTemporal>,
1322    VersionedClause<OMPC_Order, 50>,
1323    VersionedClause<OMPC_UsesAllocators>
1324  ];
1325}
1326def OMP_TargetSimd : Directive<"target simd"> {
1327  let allowedClauses = [
1328    VersionedClause<OMPC_If>,
1329    VersionedClause<OMPC_Aligned>,
1330    VersionedClause<OMPC_Allocate>,
1331    VersionedClause<OMPC_Depend>,
1332    VersionedClause<OMPC_FirstPrivate>,
1333    VersionedClause<OMPC_IsDevicePtr>,
1334    VersionedClause<OMPC_HasDeviceAddr, 51>,
1335    VersionedClause<OMPC_LastPrivate>,
1336    VersionedClause<OMPC_Linear>,
1337    VersionedClause<OMPC_Map>,
1338    VersionedClause<OMPC_NonTemporal, 50>,
1339    VersionedClause<OMPC_NoWait>,
1340    VersionedClause<OMPC_Private>,
1341    VersionedClause<OMPC_Reduction>,
1342    VersionedClause<OMPC_Shared>,
1343    VersionedClause<OMPC_UsesAllocators, 50>,
1344    VersionedClause<OMPC_OMPX_Attribute>,
1345  ];
1346  let allowedOnceClauses = [
1347    VersionedClause<OMPC_Collapse>,
1348    VersionedClause<OMPC_SafeLen>,
1349    VersionedClause<OMPC_SimdLen>,
1350    VersionedClause<OMPC_NumThreads>,
1351    VersionedClause<OMPC_ProcBind>,
1352    VersionedClause<OMPC_Device>,
1353    VersionedClause<OMPC_DefaultMap>,
1354    VersionedClause<OMPC_Schedule>,
1355    VersionedClause<OMPC_OMPX_DynCGroupMem>,
1356    VersionedClause<OMPC_Order, 50>,
1357    VersionedClause<OMPC_ThreadLimit, 51>,
1358  ];
1359}
1360def OMP_TeamsDistribute : Directive<"teams distribute"> {
1361  let allowedClauses = [
1362    VersionedClause<OMPC_Default>,
1363    VersionedClause<OMPC_Private>,
1364    VersionedClause<OMPC_FirstPrivate>,
1365    VersionedClause<OMPC_Shared>,
1366    VersionedClause<OMPC_Reduction>,
1367    VersionedClause<OMPC_NumTeams>,
1368    VersionedClause<OMPC_ThreadLimit>,
1369    VersionedClause<OMPC_LastPrivate>,
1370    VersionedClause<OMPC_Collapse>,
1371    VersionedClause<OMPC_DistSchedule>,
1372    VersionedClause<OMPC_Allocate>,
1373    VersionedClause<OMPC_OMPX_Attribute>,
1374  ];
1375  let allowedOnceClauses = [
1376    VersionedClause<OMPC_If>
1377  ];
1378}
1379def OMP_TeamsDistributeSimd : Directive<"teams distribute simd"> {
1380  let allowedClauses = [
1381    VersionedClause<OMPC_If, 50>,
1382    VersionedClause<OMPC_Aligned>,
1383    VersionedClause<OMPC_Allocate>,
1384    VersionedClause<OMPC_FirstPrivate>,
1385    VersionedClause<OMPC_LastPrivate>,
1386    VersionedClause<OMPC_Linear>,
1387    VersionedClause<OMPC_NonTemporal, 50>,
1388    VersionedClause<OMPC_Private>,
1389    VersionedClause<OMPC_Reduction>,
1390    VersionedClause<OMPC_Shared>,
1391    VersionedClause<OMPC_OMPX_Attribute>,
1392  ];
1393  let allowedOnceClauses = [
1394    VersionedClause<OMPC_Collapse>,
1395    VersionedClause<OMPC_Default>,
1396    VersionedClause<OMPC_DistSchedule>,
1397    VersionedClause<OMPC_NumTeams>,
1398    VersionedClause<OMPC_SafeLen>,
1399    VersionedClause<OMPC_SimdLen>,
1400    VersionedClause<OMPC_ThreadLimit>,
1401    VersionedClause<OMPC_Order, 50>
1402  ];
1403}
1404
1405def OMP_TeamsDistributeParallelForSimd :
1406    Directive<"teams distribute parallel for simd"> {
1407  let allowedClauses = [
1408    VersionedClause<OMPC_FirstPrivate>,
1409    VersionedClause<OMPC_LastPrivate>,
1410    VersionedClause<OMPC_Collapse>,
1411    VersionedClause<OMPC_DistSchedule>,
1412    VersionedClause<OMPC_If>,
1413    VersionedClause<OMPC_NumThreads>,
1414    VersionedClause<OMPC_Default>,
1415    VersionedClause<OMPC_ProcBind>,
1416    VersionedClause<OMPC_Private>,
1417    VersionedClause<OMPC_Shared>,
1418    VersionedClause<OMPC_Reduction>,
1419    VersionedClause<OMPC_Schedule>,
1420    VersionedClause<OMPC_Linear>,
1421    VersionedClause<OMPC_Aligned>,
1422    VersionedClause<OMPC_SafeLen>,
1423    VersionedClause<OMPC_SimdLen>,
1424    VersionedClause<OMPC_NumTeams>,
1425    VersionedClause<OMPC_ThreadLimit>,
1426    VersionedClause<OMPC_Allocate>,
1427    VersionedClause<OMPC_NonTemporal, 50>,
1428    VersionedClause<OMPC_Order, 50>,
1429    VersionedClause<OMPC_OMPX_Attribute>,
1430  ];
1431}
1432def OMP_TeamsDistributeParallelDoSimd :
1433    Directive<"teams distribute parallel do simd"> {
1434  let allowedClauses = [
1435    VersionedClause<OMPC_If>,
1436    VersionedClause<OMPC_Private>,
1437    VersionedClause<OMPC_FirstPrivate>,
1438    VersionedClause<OMPC_LastPrivate>,
1439    VersionedClause<OMPC_Allocate>,
1440    VersionedClause<OMPC_Shared>,
1441    VersionedClause<OMPC_Reduction>,
1442    VersionedClause<OMPC_Linear>,
1443    VersionedClause<OMPC_Aligned>,
1444    VersionedClause<OMPC_NonTemporal>
1445  ];
1446  let allowedOnceClauses = [
1447    VersionedClause<OMPC_Default>,
1448    VersionedClause<OMPC_NumTeams>,
1449    VersionedClause<OMPC_ThreadLimit>,
1450    VersionedClause<OMPC_Collapse>,
1451    VersionedClause<OMPC_DistSchedule>,
1452    VersionedClause<OMPC_NumThreads>,
1453    VersionedClause<OMPC_ProcBind>,
1454    VersionedClause<OMPC_Schedule>,
1455    VersionedClause<OMPC_SafeLen>,
1456    VersionedClause<OMPC_SimdLen>,
1457    VersionedClause<OMPC_Order, 50>
1458  ];
1459}
1460def OMP_TeamsDistributeParallelFor :
1461    Directive<"teams distribute parallel for"> {
1462  let allowedClauses = [
1463    VersionedClause<OMPC_FirstPrivate>,
1464    VersionedClause<OMPC_LastPrivate>,
1465    VersionedClause<OMPC_Collapse>,
1466    VersionedClause<OMPC_DistSchedule>,
1467    VersionedClause<OMPC_If>,
1468    VersionedClause<OMPC_NumThreads>,
1469    VersionedClause<OMPC_Default>,
1470    VersionedClause<OMPC_ProcBind>,
1471    VersionedClause<OMPC_Private>,
1472    VersionedClause<OMPC_Shared>,
1473    VersionedClause<OMPC_Reduction>,
1474    VersionedClause<OMPC_Schedule>,
1475    VersionedClause<OMPC_NumTeams>,
1476    VersionedClause<OMPC_ThreadLimit>,
1477    VersionedClause<OMPC_Copyin>,
1478    VersionedClause<OMPC_Allocate>,
1479    VersionedClause<OMPC_Order, 50>,
1480    VersionedClause<OMPC_OMPX_Attribute>,
1481  ];
1482}
1483def OMP_TeamsDistributeParallelDo :
1484    Directive<"teams distribute parallel do"> {
1485  let allowedClauses = [
1486    VersionedClause<OMPC_If>,
1487    VersionedClause<OMPC_Private>,
1488    VersionedClause<OMPC_FirstPrivate>,
1489    VersionedClause<OMPC_LastPrivate>,
1490    VersionedClause<OMPC_Shared>,
1491    VersionedClause<OMPC_Reduction>,
1492    VersionedClause<OMPC_Allocate>,
1493    VersionedClause<OMPC_Copyin>,
1494    VersionedClause<OMPC_Linear>
1495  ];
1496let allowedOnceClauses = [
1497    VersionedClause<OMPC_NumTeams>,
1498    VersionedClause<OMPC_ThreadLimit>,
1499    VersionedClause<OMPC_Default>,
1500    VersionedClause<OMPC_Collapse>,
1501    VersionedClause<OMPC_DistSchedule>,
1502    VersionedClause<OMPC_Ordered>,
1503    VersionedClause<OMPC_NumThreads>,
1504    VersionedClause<OMPC_ProcBind>,
1505    VersionedClause<OMPC_Schedule>,
1506    VersionedClause<OMPC_Order, 50>
1507  ];
1508}
1509def OMP_TargetTeams : Directive<"target teams"> {
1510  let allowedClauses = [
1511    VersionedClause<OMPC_If>,
1512    VersionedClause<OMPC_Map>,
1513    VersionedClause<OMPC_Private>,
1514    VersionedClause<OMPC_Depend>,
1515    VersionedClause<OMPC_FirstPrivate>,
1516    VersionedClause<OMPC_IsDevicePtr>,
1517    VersionedClause<OMPC_HasDeviceAddr, 51>,
1518    VersionedClause<OMPC_Reduction>,
1519    VersionedClause<OMPC_Allocate>,
1520    VersionedClause<OMPC_UsesAllocators, 50>,
1521    VersionedClause<OMPC_Shared>,
1522    VersionedClause<OMPC_OMPX_Attribute>,
1523  ];
1524
1525  let allowedOnceClauses = [
1526    VersionedClause<OMPC_Device>,
1527    VersionedClause<OMPC_NoWait>,
1528    VersionedClause<OMPC_DefaultMap>,
1529    VersionedClause<OMPC_Default>,
1530    VersionedClause<OMPC_NumTeams>,
1531    VersionedClause<OMPC_ThreadLimit>,
1532    VersionedClause<OMPC_OMPX_DynCGroupMem>,
1533    VersionedClause<OMPC_OMX_Bare>,
1534  ];
1535}
1536def OMP_TargetTeamsDistribute : Directive<"target teams distribute"> {
1537  let allowedClauses = [
1538    VersionedClause<OMPC_If>,
1539    VersionedClause<OMPC_Map>,
1540    VersionedClause<OMPC_Private>,
1541    VersionedClause<OMPC_Depend>,
1542    VersionedClause<OMPC_FirstPrivate>,
1543    VersionedClause<OMPC_IsDevicePtr>,
1544    VersionedClause<OMPC_HasDeviceAddr, 51>,
1545    VersionedClause<OMPC_Reduction>,
1546    VersionedClause<OMPC_Allocate>,
1547    VersionedClause<OMPC_UsesAllocators, 50>,
1548    VersionedClause<OMPC_Shared>,
1549    VersionedClause<OMPC_LastPrivate>,
1550    VersionedClause<OMPC_OMPX_Attribute>,
1551  ];
1552  let allowedOnceClauses = [
1553    VersionedClause<OMPC_Device>,
1554    VersionedClause<OMPC_NoWait>,
1555    VersionedClause<OMPC_DefaultMap>,
1556    VersionedClause<OMPC_Default>,
1557    VersionedClause<OMPC_NumTeams>,
1558    VersionedClause<OMPC_ThreadLimit>,
1559    VersionedClause<OMPC_Collapse>,
1560    VersionedClause<OMPC_DistSchedule>,
1561    VersionedClause<OMPC_OMPX_DynCGroupMem>,
1562  ];
1563}
1564
1565def OMP_TargetTeamsDistributeParallelFor :
1566    Directive<"target teams distribute parallel for"> {
1567  let allowedClauses = [
1568    VersionedClause<OMPC_If>,
1569    VersionedClause<OMPC_Device>,
1570    VersionedClause<OMPC_Map>,
1571    VersionedClause<OMPC_Private>,
1572    VersionedClause<OMPC_NoWait>,
1573    VersionedClause<OMPC_Depend>,
1574    VersionedClause<OMPC_DefaultMap>,
1575    VersionedClause<OMPC_FirstPrivate>,
1576    VersionedClause<OMPC_IsDevicePtr>,
1577    VersionedClause<OMPC_HasDeviceAddr, 51>,
1578    VersionedClause<OMPC_Default>,
1579    VersionedClause<OMPC_Shared>,
1580    VersionedClause<OMPC_Reduction>,
1581    VersionedClause<OMPC_NumTeams>,
1582    VersionedClause<OMPC_ThreadLimit>,
1583    VersionedClause<OMPC_LastPrivate>,
1584    VersionedClause<OMPC_Collapse>,
1585    VersionedClause<OMPC_DistSchedule>,
1586    VersionedClause<OMPC_NumThreads>,
1587    VersionedClause<OMPC_ProcBind>,
1588    VersionedClause<OMPC_Schedule>,
1589    VersionedClause<OMPC_Allocate>,
1590    VersionedClause<OMPC_Order, 50>,
1591    VersionedClause<OMPC_UsesAllocators, 50>,
1592    VersionedClause<OMPC_OMPX_Attribute>,
1593  ];
1594  let allowedOnceClauses = [
1595    VersionedClause<OMPC_OMPX_DynCGroupMem>,
1596  ];
1597}
1598def OMP_TargetTeamsDistributeParallelDo :
1599    Directive<"target teams distribute parallel do"> {
1600  let allowedClauses = [
1601    VersionedClause<OMPC_If>,
1602    VersionedClause<OMPC_Map>,
1603    VersionedClause<OMPC_Private>,
1604    VersionedClause<OMPC_Depend>,
1605    VersionedClause<OMPC_FirstPrivate>,
1606    VersionedClause<OMPC_IsDevicePtr>,
1607    VersionedClause<OMPC_HasDeviceAddr, 51>,
1608    VersionedClause<OMPC_Reduction>,
1609    VersionedClause<OMPC_Allocate>,
1610    VersionedClause<OMPC_UsesAllocators>,
1611    VersionedClause<OMPC_Shared>,
1612    VersionedClause<OMPC_LastPrivate>,
1613    VersionedClause<OMPC_Copyin>,
1614    VersionedClause<OMPC_Linear>,
1615    VersionedClause<OMPC_Ordered>,
1616  ];
1617  let allowedOnceClauses = [
1618    VersionedClause<OMPC_Device>,
1619    VersionedClause<OMPC_DefaultMap>,
1620    VersionedClause<OMPC_NoWait>,
1621    VersionedClause<OMPC_Default>,
1622    VersionedClause<OMPC_NumTeams>,
1623    VersionedClause<OMPC_ThreadLimit>,
1624    VersionedClause<OMPC_Collapse>,
1625    VersionedClause<OMPC_DistSchedule>,
1626    VersionedClause<OMPC_NumThreads>,
1627    VersionedClause<OMPC_ProcBind>,
1628    VersionedClause<OMPC_Schedule>,
1629    VersionedClause<OMPC_Order, 50>
1630  ];
1631}
1632def OMP_TargetTeamsDistributeParallelForSimd :
1633    Directive<"target teams distribute parallel for simd"> {
1634  let allowedClauses = [
1635    VersionedClause<OMPC_If>,
1636    VersionedClause<OMPC_Device>,
1637    VersionedClause<OMPC_Map>,
1638    VersionedClause<OMPC_Private>,
1639    VersionedClause<OMPC_NoWait>,
1640    VersionedClause<OMPC_Depend>,
1641    VersionedClause<OMPC_DefaultMap>,
1642    VersionedClause<OMPC_FirstPrivate>,
1643    VersionedClause<OMPC_IsDevicePtr>,
1644    VersionedClause<OMPC_HasDeviceAddr, 51>,
1645    VersionedClause<OMPC_Default>,
1646    VersionedClause<OMPC_Shared>,
1647    VersionedClause<OMPC_Reduction>,
1648    VersionedClause<OMPC_NumTeams>,
1649    VersionedClause<OMPC_ThreadLimit>,
1650    VersionedClause<OMPC_LastPrivate>,
1651    VersionedClause<OMPC_Collapse>,
1652    VersionedClause<OMPC_DistSchedule>,
1653    VersionedClause<OMPC_NumThreads>,
1654    VersionedClause<OMPC_ProcBind>,
1655    VersionedClause<OMPC_Schedule>,
1656    VersionedClause<OMPC_Linear>,
1657    VersionedClause<OMPC_Aligned>,
1658    VersionedClause<OMPC_SafeLen>,
1659    VersionedClause<OMPC_SimdLen>,
1660    VersionedClause<OMPC_Allocate>,
1661    VersionedClause<OMPC_NonTemporal, 50>,
1662    VersionedClause<OMPC_Order, 50>,
1663    VersionedClause<OMPC_UsesAllocators, 50>,
1664    VersionedClause<OMPC_OMPX_Attribute>,
1665  ];
1666  let allowedOnceClauses = [
1667    VersionedClause<OMPC_OMPX_DynCGroupMem>,
1668  ];
1669}
1670def OMP_TargetTeamsDistributeParallelDoSimd :
1671    Directive<"target teams distribute parallel do simd"> {
1672  let allowedClauses = [
1673    VersionedClause<OMPC_If>,
1674    VersionedClause<OMPC_Map>,
1675    VersionedClause<OMPC_Private>,
1676    VersionedClause<OMPC_Depend>,
1677    VersionedClause<OMPC_FirstPrivate>,
1678    VersionedClause<OMPC_IsDevicePtr>,
1679    VersionedClause<OMPC_HasDeviceAddr, 51>,
1680    VersionedClause<OMPC_Reduction>,
1681    VersionedClause<OMPC_Allocate>,
1682    VersionedClause<OMPC_UsesAllocators>,
1683    VersionedClause<OMPC_Shared>,
1684    VersionedClause<OMPC_LastPrivate>,
1685    VersionedClause<OMPC_Copyin>,
1686    VersionedClause<OMPC_Linear>,
1687    VersionedClause<OMPC_Ordered>,
1688    VersionedClause<OMPC_Aligned>,
1689    VersionedClause<OMPC_NonTemporal>
1690  ];
1691  let allowedOnceClauses = [
1692    VersionedClause<OMPC_Device>,
1693    VersionedClause<OMPC_NoWait>,
1694    VersionedClause<OMPC_DefaultMap>,
1695    VersionedClause<OMPC_Default>,
1696    VersionedClause<OMPC_NumTeams>,
1697    VersionedClause<OMPC_ThreadLimit>,
1698    VersionedClause<OMPC_Collapse>,
1699    VersionedClause<OMPC_DistSchedule>,
1700    VersionedClause<OMPC_NumThreads>,
1701    VersionedClause<OMPC_ProcBind>,
1702    VersionedClause<OMPC_Schedule>,
1703    VersionedClause<OMPC_SafeLen>,
1704    VersionedClause<OMPC_SimdLen>,
1705    VersionedClause<OMPC_Order, 50>
1706  ];
1707}
1708def OMP_TargetTeamsDistributeSimd :
1709    Directive<"target teams distribute simd"> {
1710  let allowedClauses = [
1711    VersionedClause<OMPC_Aligned>,
1712    VersionedClause<OMPC_Allocate>,
1713    VersionedClause<OMPC_Depend>,
1714    VersionedClause<OMPC_FirstPrivate>,
1715    VersionedClause<OMPC_If>,
1716    VersionedClause<OMPC_IsDevicePtr>,
1717    VersionedClause<OMPC_HasDeviceAddr, 51>,
1718    VersionedClause<OMPC_LastPrivate>,
1719    VersionedClause<OMPC_Linear>,
1720    VersionedClause<OMPC_Map>,
1721    VersionedClause<OMPC_NonTemporal, 50>,
1722    VersionedClause<OMPC_Private>,
1723    VersionedClause<OMPC_Reduction>,
1724    VersionedClause<OMPC_Shared>,
1725    VersionedClause<OMPC_UsesAllocators, 50>,
1726    VersionedClause<OMPC_OMPX_Attribute>,
1727  ];
1728  let allowedOnceClauses = [
1729    VersionedClause<OMPC_Device>,
1730    VersionedClause<OMPC_DefaultMap>,
1731    VersionedClause<OMPC_NoWait>,
1732    VersionedClause<OMPC_NumTeams>,
1733    VersionedClause<OMPC_ThreadLimit>,
1734    VersionedClause<OMPC_Collapse>,
1735    VersionedClause<OMPC_DistSchedule>,
1736    VersionedClause<OMPC_SafeLen>,
1737    VersionedClause<OMPC_SimdLen>,
1738    VersionedClause<OMPC_OMPX_DynCGroupMem>,
1739    VersionedClause<OMPC_Order, 50>
1740  ];
1741}
1742def OMP_Allocate : Directive<"allocate"> {
1743  let allowedOnceClauses = [
1744    VersionedClause<OMPC_Allocator>,
1745    VersionedClause<OMPC_Align, 51>
1746  ];
1747}
1748def OMP_Allocators : Directive<"allocators"> {
1749  let allowedClauses = [
1750    VersionedClause<OMPC_Allocate>
1751  ];
1752}
1753def OMP_DeclareVariant : Directive<"declare variant"> {
1754  let allowedClauses = [
1755    VersionedClause<OMPC_Match>
1756  ];
1757  let allowedExclusiveClauses = [
1758    VersionedClause<OMPC_AdjustArgs, 51>,
1759    VersionedClause<OMPC_AppendArgs, 51>
1760  ];
1761}
1762def OMP_MasterTaskloop : Directive<"master taskloop"> {
1763  let allowedClauses = [
1764    VersionedClause<OMPC_If>,
1765    VersionedClause<OMPC_Shared>,
1766    VersionedClause<OMPC_Private>,
1767    VersionedClause<OMPC_FirstPrivate>,
1768    VersionedClause<OMPC_LastPrivate>,
1769    VersionedClause<OMPC_Default>,
1770    VersionedClause<OMPC_Collapse>,
1771    VersionedClause<OMPC_Final>,
1772    VersionedClause<OMPC_Untied>,
1773    VersionedClause<OMPC_Mergeable>,
1774    VersionedClause<OMPC_Priority>,
1775    VersionedClause<OMPC_GrainSize>,
1776    VersionedClause<OMPC_NoGroup>,
1777    VersionedClause<OMPC_NumTasks>,
1778    VersionedClause<OMPC_Reduction>,
1779    VersionedClause<OMPC_InReduction>,
1780    VersionedClause<OMPC_Allocate>
1781  ];
1782}
1783def OMP_MaskedTaskloop : Directive<"masked taskloop"> {
1784  let allowedClauses = [
1785    VersionedClause<OMPC_If>,
1786    VersionedClause<OMPC_Shared>,
1787    VersionedClause<OMPC_Private>,
1788    VersionedClause<OMPC_FirstPrivate>,
1789    VersionedClause<OMPC_LastPrivate>,
1790    VersionedClause<OMPC_Default>,
1791    VersionedClause<OMPC_Collapse>,
1792    VersionedClause<OMPC_Final>,
1793    VersionedClause<OMPC_Untied>,
1794    VersionedClause<OMPC_Mergeable>,
1795    VersionedClause<OMPC_Priority>,
1796    VersionedClause<OMPC_GrainSize>,
1797    VersionedClause<OMPC_NoGroup>,
1798    VersionedClause<OMPC_NumTasks>,
1799    VersionedClause<OMPC_Reduction>,
1800    VersionedClause<OMPC_InReduction>,
1801    VersionedClause<OMPC_Allocate>,
1802    VersionedClause<OMPC_Filter>
1803  ];
1804}
1805def OMP_ParallelMasterTaskloop :
1806    Directive<"parallel master taskloop"> {
1807  let allowedClauses = [
1808    VersionedClause<OMPC_If>,
1809    VersionedClause<OMPC_Shared>,
1810    VersionedClause<OMPC_Private>,
1811    VersionedClause<OMPC_FirstPrivate>,
1812    VersionedClause<OMPC_LastPrivate>,
1813    VersionedClause<OMPC_Default>,
1814    VersionedClause<OMPC_Collapse>,
1815    VersionedClause<OMPC_Final>,
1816    VersionedClause<OMPC_Untied>,
1817    VersionedClause<OMPC_Mergeable>,
1818    VersionedClause<OMPC_Priority>,
1819    VersionedClause<OMPC_GrainSize>,
1820    VersionedClause<OMPC_NoGroup>,
1821    VersionedClause<OMPC_NumTasks>,
1822    VersionedClause<OMPC_Reduction>,
1823    VersionedClause<OMPC_Allocate>,
1824    VersionedClause<OMPC_NumThreads>,
1825    VersionedClause<OMPC_ProcBind>,
1826    VersionedClause<OMPC_Copyin>,
1827    VersionedClause<OMPC_OMPX_Attribute>,
1828  ];
1829}
1830def OMP_ParallelMaskedTaskloop :
1831    Directive<"parallel masked taskloop"> {
1832  let allowedClauses = [
1833    VersionedClause<OMPC_If>,
1834    VersionedClause<OMPC_Shared>,
1835    VersionedClause<OMPC_Private>,
1836    VersionedClause<OMPC_FirstPrivate>,
1837    VersionedClause<OMPC_LastPrivate>,
1838    VersionedClause<OMPC_Default>,
1839    VersionedClause<OMPC_Collapse>,
1840    VersionedClause<OMPC_Final>,
1841    VersionedClause<OMPC_Untied>,
1842    VersionedClause<OMPC_Mergeable>,
1843    VersionedClause<OMPC_Priority>,
1844    VersionedClause<OMPC_GrainSize>,
1845    VersionedClause<OMPC_NoGroup>,
1846    VersionedClause<OMPC_NumTasks>,
1847    VersionedClause<OMPC_Reduction>,
1848    VersionedClause<OMPC_Allocate>,
1849    VersionedClause<OMPC_NumThreads>,
1850    VersionedClause<OMPC_ProcBind>,
1851    VersionedClause<OMPC_Copyin>,
1852    VersionedClause<OMPC_Filter>,
1853    VersionedClause<OMPC_OMPX_Attribute>,
1854  ];
1855}
1856def OMP_MasterTaskloopSimd : Directive<"master taskloop simd"> {
1857  let allowedClauses = [
1858    VersionedClause<OMPC_If>,
1859    VersionedClause<OMPC_Shared>,
1860    VersionedClause<OMPC_Private>,
1861    VersionedClause<OMPC_FirstPrivate>,
1862    VersionedClause<OMPC_LastPrivate>,
1863    VersionedClause<OMPC_Default>,
1864    VersionedClause<OMPC_Collapse>,
1865    VersionedClause<OMPC_Final>,
1866    VersionedClause<OMPC_Untied>,
1867    VersionedClause<OMPC_Mergeable>,
1868    VersionedClause<OMPC_Priority>,
1869    VersionedClause<OMPC_Linear>,
1870    VersionedClause<OMPC_Aligned>,
1871    VersionedClause<OMPC_SafeLen>,
1872    VersionedClause<OMPC_SimdLen>,
1873    VersionedClause<OMPC_GrainSize>,
1874    VersionedClause<OMPC_NoGroup>,
1875    VersionedClause<OMPC_NumTasks>,
1876    VersionedClause<OMPC_Reduction>,
1877    VersionedClause<OMPC_InReduction>,
1878    VersionedClause<OMPC_Allocate>,
1879    VersionedClause<OMPC_NonTemporal, 50>,
1880    VersionedClause<OMPC_Order, 50>
1881  ];
1882}
1883def OMP_MaskedTaskloopSimd : Directive<"masked taskloop simd"> {
1884  let allowedClauses = [
1885    VersionedClause<OMPC_If>,
1886    VersionedClause<OMPC_Shared>,
1887    VersionedClause<OMPC_Private>,
1888    VersionedClause<OMPC_FirstPrivate>,
1889    VersionedClause<OMPC_LastPrivate>,
1890    VersionedClause<OMPC_Default>,
1891    VersionedClause<OMPC_Collapse>,
1892    VersionedClause<OMPC_Final>,
1893    VersionedClause<OMPC_Untied>,
1894    VersionedClause<OMPC_Mergeable>,
1895    VersionedClause<OMPC_Priority>,
1896    VersionedClause<OMPC_Linear>,
1897    VersionedClause<OMPC_Aligned>,
1898    VersionedClause<OMPC_SafeLen>,
1899    VersionedClause<OMPC_SimdLen>,
1900    VersionedClause<OMPC_GrainSize>,
1901    VersionedClause<OMPC_NoGroup>,
1902    VersionedClause<OMPC_NumTasks>,
1903    VersionedClause<OMPC_Reduction>,
1904    VersionedClause<OMPC_InReduction>,
1905    VersionedClause<OMPC_Allocate>,
1906    VersionedClause<OMPC_NonTemporal, 50>,
1907    VersionedClause<OMPC_Order, 50>,
1908    VersionedClause<OMPC_Filter>
1909  ];
1910}
1911def OMP_ParallelMasterTaskloopSimd :
1912    Directive<"parallel master taskloop simd"> {
1913  let allowedClauses = [
1914    VersionedClause<OMPC_If>,
1915    VersionedClause<OMPC_Shared>,
1916    VersionedClause<OMPC_Private>,
1917    VersionedClause<OMPC_FirstPrivate>,
1918    VersionedClause<OMPC_LastPrivate>,
1919    VersionedClause<OMPC_Default>,
1920    VersionedClause<OMPC_Collapse>,
1921    VersionedClause<OMPC_Final>,
1922    VersionedClause<OMPC_Untied>,
1923    VersionedClause<OMPC_Mergeable>,
1924    VersionedClause<OMPC_Priority>,
1925    VersionedClause<OMPC_GrainSize>,
1926    VersionedClause<OMPC_NoGroup>,
1927    VersionedClause<OMPC_NumTasks>,
1928    VersionedClause<OMPC_Reduction>,
1929    VersionedClause<OMPC_Allocate>,
1930    VersionedClause<OMPC_NumThreads>,
1931    VersionedClause<OMPC_ProcBind>,
1932    VersionedClause<OMPC_Copyin>,
1933    VersionedClause<OMPC_Linear>,
1934    VersionedClause<OMPC_Aligned>,
1935    VersionedClause<OMPC_SafeLen>,
1936    VersionedClause<OMPC_SimdLen>,
1937    VersionedClause<OMPC_NonTemporal, 50>,
1938    VersionedClause<OMPC_Order, 50>,
1939    VersionedClause<OMPC_OMPX_Attribute>,
1940  ];
1941}
1942def OMP_ParallelMaskedTaskloopSimd :
1943    Directive<"parallel masked taskloop simd"> {
1944  let allowedClauses = [
1945    VersionedClause<OMPC_If>,
1946    VersionedClause<OMPC_Shared>,
1947    VersionedClause<OMPC_Private>,
1948    VersionedClause<OMPC_FirstPrivate>,
1949    VersionedClause<OMPC_LastPrivate>,
1950    VersionedClause<OMPC_Default>,
1951    VersionedClause<OMPC_Collapse>,
1952    VersionedClause<OMPC_Final>,
1953    VersionedClause<OMPC_Untied>,
1954    VersionedClause<OMPC_Mergeable>,
1955    VersionedClause<OMPC_Priority>,
1956    VersionedClause<OMPC_GrainSize>,
1957    VersionedClause<OMPC_NoGroup>,
1958    VersionedClause<OMPC_NumTasks>,
1959    VersionedClause<OMPC_Reduction>,
1960    VersionedClause<OMPC_Allocate>,
1961    VersionedClause<OMPC_NumThreads>,
1962    VersionedClause<OMPC_ProcBind>,
1963    VersionedClause<OMPC_Copyin>,
1964    VersionedClause<OMPC_Linear>,
1965    VersionedClause<OMPC_Aligned>,
1966    VersionedClause<OMPC_SafeLen>,
1967    VersionedClause<OMPC_SimdLen>,
1968    VersionedClause<OMPC_NonTemporal, 50>,
1969    VersionedClause<OMPC_Order, 50>,
1970    VersionedClause<OMPC_Filter>,
1971    VersionedClause<OMPC_OMPX_Attribute>,
1972  ];
1973}
1974def OMP_Depobj : Directive<"depobj"> {
1975  let allowedClauses = [
1976    VersionedClause<OMPC_Depend, 50>,
1977    VersionedClause<OMPC_Destroy, 50>,
1978    VersionedClause<OMPC_Update, 50>,
1979    // TODO This should ne `none` instead. Comment carried over from
1980    // OMPKinds.def.
1981    VersionedClause<OMPC_Depobj, 50>
1982  ];
1983}
1984def OMP_Scan : Directive<"scan"> {
1985  let allowedClauses = [
1986    VersionedClause<OMPC_Inclusive, 50>,
1987    VersionedClause<OMPC_Exclusive, 50>
1988  ];
1989}
1990def OMP_Assumes : Directive<"assumes"> {}
1991def OMP_BeginAssumes : Directive<"begin assumes"> {}
1992def OMP_EndAssumes : Directive<"end assumes"> {}
1993def OMP_BeginDeclareVariant : Directive<"begin declare variant"> {}
1994def OMP_EndDeclareVariant : Directive<"end declare variant"> {}
1995def OMP_scope : Directive<"scope"> {
1996  let allowedClauses = [
1997    VersionedClause<OMPC_Private, 51>,
1998    VersionedClause<OMPC_Reduction, 51>,
1999  ];
2000  let allowedOnceClauses = [
2001    VersionedClause<OMPC_NoWait, 51>
2002  ];
2003}
2004def OMP_ParallelWorkshare : Directive<"parallel workshare"> {
2005  let allowedClauses = [
2006    VersionedClause<OMPC_Allocate>,
2007    VersionedClause<OMPC_Copyin>,
2008    VersionedClause<OMPC_Default>,
2009    VersionedClause<OMPC_FirstPrivate>,
2010    VersionedClause<OMPC_Private>,
2011    VersionedClause<OMPC_Reduction>,
2012    VersionedClause<OMPC_Shared>
2013  ];
2014  let allowedOnceClauses = [
2015    VersionedClause<OMPC_If>,
2016    VersionedClause<OMPC_NumThreads>,
2017    VersionedClause<OMPC_ProcBind>
2018  ];
2019}
2020def OMP_Workshare : Directive<"workshare"> {}
2021def OMP_EndDo : Directive<"end do"> {
2022  let allowedOnceClauses = [
2023    VersionedClause<OMPC_NoWait>
2024  ];
2025}
2026def OMP_EndDoSimd : Directive<"end do simd"> {
2027  let allowedOnceClauses = [
2028    VersionedClause<OMPC_NoWait>
2029  ];
2030}
2031def OMP_EndSections : Directive<"end sections"> {
2032  let allowedOnceClauses = [
2033    VersionedClause<OMPC_NoWait>
2034  ];
2035}
2036def OMP_EndSingle : Directive<"end single"> {
2037  let allowedClauses = [
2038    VersionedClause<OMPC_CopyPrivate>
2039  ];
2040  let allowedOnceClauses = [
2041    VersionedClause<OMPC_NoWait>
2042  ];
2043}
2044def OMP_EndWorkshare : Directive<"end workshare"> {
2045  let allowedClauses = [
2046    VersionedClause<OMPC_NoWait>
2047  ];
2048}
2049def OMP_interop : Directive<"interop"> {
2050  let allowedClauses = [
2051    VersionedClause<OMPC_Device>,
2052    VersionedClause<OMPC_Depend>,
2053    VersionedClause<OMPC_Destroy>,
2054    VersionedClause<OMPC_Init>,
2055    VersionedClause<OMPC_NoWait>,
2056    VersionedClause<OMPC_Use>,
2057  ];
2058}
2059def OMP_dispatch : Directive<"dispatch"> {
2060  let allowedClauses = [
2061    VersionedClause<OMPC_Device>,
2062    VersionedClause<OMPC_IsDevicePtr>,
2063    VersionedClause<OMPC_HasDeviceAddr, 51>,
2064    VersionedClause<OMPC_NoWait>,
2065    VersionedClause<OMPC_Depend>,
2066    VersionedClause<OMPC_Novariants>,
2067    VersionedClause<OMPC_Nocontext>
2068  ];
2069}
2070def OMP_masked : Directive<"masked"> {
2071  let allowedOnceClauses = [
2072    VersionedClause<OMPC_Filter>
2073  ];
2074}
2075def OMP_loop : Directive<"loop"> {
2076  let allowedClauses = [
2077    VersionedClause<OMPC_LastPrivate>,
2078    VersionedClause<OMPC_Private>,
2079    VersionedClause<OMPC_Reduction>,
2080  ];
2081  let allowedOnceClauses = [
2082    VersionedClause<OMPC_Bind, 50>,
2083    VersionedClause<OMPC_Collapse>,
2084    VersionedClause<OMPC_Order, 50>
2085  ];
2086}
2087def OMP_teams_loop : Directive<"teams loop"> {
2088  let allowedClauses = [
2089    VersionedClause<OMPC_Allocate>,
2090    VersionedClause<OMPC_FirstPrivate>,
2091    VersionedClause<OMPC_LastPrivate>,
2092    VersionedClause<OMPC_Private>,
2093    VersionedClause<OMPC_Reduction>,
2094    VersionedClause<OMPC_Shared>,
2095    VersionedClause<OMPC_OMPX_Attribute>,
2096  ];
2097  let allowedOnceClauses = [
2098    VersionedClause<OMPC_Bind, 50>,
2099    VersionedClause<OMPC_Collapse>,
2100    VersionedClause<OMPC_Default>,
2101    VersionedClause<OMPC_NumTeams>,
2102    VersionedClause<OMPC_Order>,
2103    VersionedClause<OMPC_ThreadLimit>,
2104  ];
2105}
2106def OMP_target_teams_loop : Directive<"target teams loop"> {
2107  let allowedClauses = [
2108    VersionedClause<OMPC_If>,
2109    VersionedClause<OMPC_Allocate>,
2110    VersionedClause<OMPC_Depend>,
2111    VersionedClause<OMPC_DefaultMap>,
2112    VersionedClause<OMPC_Device>,
2113    VersionedClause<OMPC_FirstPrivate>,
2114    VersionedClause<OMPC_IsDevicePtr>,
2115    VersionedClause<OMPC_HasDeviceAddr, 51>,
2116    VersionedClause<OMPC_LastPrivate>,
2117    VersionedClause<OMPC_Map>,
2118    VersionedClause<OMPC_Private>,
2119    VersionedClause<OMPC_Reduction>,
2120    VersionedClause<OMPC_Shared>,
2121    VersionedClause<OMPC_UsesAllocators, 50>,
2122    VersionedClause<OMPC_OMPX_Attribute>,
2123  ];
2124  let allowedOnceClauses = [
2125    VersionedClause<OMPC_Bind, 50>,
2126    VersionedClause<OMPC_Collapse>,
2127    VersionedClause<OMPC_Default>,
2128    VersionedClause<OMPC_NoWait>,
2129    VersionedClause<OMPC_NumTeams>,
2130    VersionedClause<OMPC_Order>,
2131    VersionedClause<OMPC_ThreadLimit>,
2132    VersionedClause<OMPC_OMPX_DynCGroupMem>,
2133  ];
2134}
2135def OMP_parallel_loop : Directive<"parallel loop"> {
2136  let allowedClauses = [
2137    VersionedClause<OMPC_Allocate>,
2138    VersionedClause<OMPC_Copyin>,
2139    VersionedClause<OMPC_FirstPrivate>,
2140    VersionedClause<OMPC_LastPrivate>,
2141    VersionedClause<OMPC_Private>,
2142    VersionedClause<OMPC_Reduction>,
2143    VersionedClause<OMPC_Shared>,
2144    VersionedClause<OMPC_OMPX_Attribute>,
2145  ];
2146  let allowedOnceClauses = [
2147    VersionedClause<OMPC_Bind, 50>,
2148    VersionedClause<OMPC_Collapse>,
2149    VersionedClause<OMPC_Default>,
2150    VersionedClause<OMPC_If>,
2151    VersionedClause<OMPC_NumThreads>,
2152    VersionedClause<OMPC_Order>,
2153    VersionedClause<OMPC_ProcBind>,
2154  ];
2155}
2156def OMP_target_parallel_loop : Directive<"target parallel loop"> {
2157  let allowedClauses = [
2158    VersionedClause<OMPC_If>,
2159    VersionedClause<OMPC_Allocate>,
2160    VersionedClause<OMPC_Copyin>,
2161    VersionedClause<OMPC_Depend>,
2162    VersionedClause<OMPC_Device>,
2163    VersionedClause<OMPC_FirstPrivate>,
2164    VersionedClause<OMPC_IsDevicePtr>,
2165    VersionedClause<OMPC_HasDeviceAddr, 51>,
2166    VersionedClause<OMPC_LastPrivate>,
2167    VersionedClause<OMPC_Map>,
2168    VersionedClause<OMPC_Private>,
2169    VersionedClause<OMPC_Reduction>,
2170    VersionedClause<OMPC_Shared>,
2171    VersionedClause<OMPC_UsesAllocators, 50>,
2172    VersionedClause<OMPC_OMPX_Attribute>,
2173  ];
2174  let allowedOnceClauses = [
2175    VersionedClause<OMPC_Bind, 50>,
2176    VersionedClause<OMPC_Collapse>,
2177    VersionedClause<OMPC_Default>,
2178    VersionedClause<OMPC_DefaultMap>,
2179    VersionedClause<OMPC_NoWait>,
2180    VersionedClause<OMPC_NumThreads>,
2181    VersionedClause<OMPC_Order>,
2182    VersionedClause<OMPC_ProcBind>,
2183    VersionedClause<OMPC_OMPX_DynCGroupMem>,
2184    VersionedClause<OMPC_ThreadLimit, 51>,
2185  ];
2186}
2187def OMP_Metadirective : Directive<"metadirective"> {
2188  let allowedClauses = [VersionedClause<OMPC_When>];
2189  let allowedOnceClauses = [VersionedClause<OMPC_Default>];
2190}
2191def OMP_Unknown : Directive<"unknown"> {
2192  let isDefault = true;
2193}
2194