clang 19.0.0git
OpenACCClause.cpp
Go to the documentation of this file.
1//===---- OpenACCClause.cpp - Classes for OpenACC Clauses ----------------===//
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 file implements the subclasses of the OpenACCClause class declared in
10// OpenACCClause.h
11//
12//===----------------------------------------------------------------------===//
13
16#include "clang/AST/Expr.h"
17
18using namespace clang;
19
24}
29}
39}
42}
47}
50 SourceLocation BeginLoc,
51 SourceLocation LParenLoc,
52 SourceLocation EndLoc) {
53 void *Mem =
54 C.Allocate(sizeof(OpenACCDefaultClause), alignof(OpenACCDefaultClause));
55
56 return new (Mem) OpenACCDefaultClause(K, BeginLoc, LParenLoc, EndLoc);
57}
58
60 SourceLocation BeginLoc,
61 SourceLocation LParenLoc,
62 Expr *ConditionExpr,
63 SourceLocation EndLoc) {
64 void *Mem = C.Allocate(sizeof(OpenACCIfClause), alignof(OpenACCIfClause));
65 return new (Mem) OpenACCIfClause(BeginLoc, LParenLoc, ConditionExpr, EndLoc);
66}
67
69 SourceLocation LParenLoc, Expr *ConditionExpr,
70 SourceLocation EndLoc)
71 : OpenACCClauseWithCondition(OpenACCClauseKind::If, BeginLoc, LParenLoc,
72 ConditionExpr, EndLoc) {
73 assert(ConditionExpr && "if clause requires condition expr");
74 assert((ConditionExpr->isInstantiationDependent() ||
75 ConditionExpr->getType()->isScalarType()) &&
76 "Condition expression type not scalar/dependent");
77}
78
80 SourceLocation BeginLoc,
81 SourceLocation LParenLoc,
82 Expr *ConditionExpr,
83 SourceLocation EndLoc) {
84 void *Mem = C.Allocate(sizeof(OpenACCIfClause), alignof(OpenACCIfClause));
85 return new (Mem)
86 OpenACCSelfClause(BeginLoc, LParenLoc, ConditionExpr, EndLoc);
87}
88
89OpenACCSelfClause::OpenACCSelfClause(SourceLocation BeginLoc,
90 SourceLocation LParenLoc,
91 Expr *ConditionExpr, SourceLocation EndLoc)
93 ConditionExpr, EndLoc) {
94 assert((!ConditionExpr || ConditionExpr->isInstantiationDependent() ||
95 ConditionExpr->getType()->isScalarType()) &&
96 "Condition expression type not scalar/dependent");
97}
98
100 switch (getClauseKind()) {
101 default:
102 assert(false && "Clause children function not implemented");
103 break;
104#define VISIT_CLAUSE(CLAUSE_NAME) \
105 case OpenACCClauseKind::CLAUSE_NAME: \
106 return cast<OpenACC##CLAUSE_NAME##Clause>(this)->children();
107#define CLAUSE_ALIAS(ALIAS_NAME, CLAUSE_NAME) \
108 case OpenACCClauseKind::ALIAS_NAME: \
109 return cast<OpenACC##CLAUSE_NAME##Clause>(this)->children();
110
111#include "clang/Basic/OpenACCClauses.def"
112 }
114}
115
116OpenACCNumWorkersClause::OpenACCNumWorkersClause(SourceLocation BeginLoc,
117 SourceLocation LParenLoc,
118 Expr *IntExpr,
119 SourceLocation EndLoc)
121 LParenLoc, IntExpr, EndLoc) {
122 assert((!IntExpr || IntExpr->isInstantiationDependent() ||
123 IntExpr->getType()->isIntegerType()) &&
124 "Condition expression type not scalar/dependent");
125}
126
129 SourceLocation LParenLoc, Expr *IntExpr,
130 SourceLocation EndLoc) {
131 void *Mem = C.Allocate(sizeof(OpenACCNumWorkersClause),
132 alignof(OpenACCNumWorkersClause));
133 return new (Mem)
134 OpenACCNumWorkersClause(BeginLoc, LParenLoc, IntExpr, EndLoc);
135}
136
137OpenACCVectorLengthClause::OpenACCVectorLengthClause(SourceLocation BeginLoc,
138 SourceLocation LParenLoc,
139 Expr *IntExpr,
140 SourceLocation EndLoc)
142 LParenLoc, IntExpr, EndLoc) {
143 assert((!IntExpr || IntExpr->isInstantiationDependent() ||
144 IntExpr->getType()->isIntegerType()) &&
145 "Condition expression type not scalar/dependent");
146}
147
150 SourceLocation LParenLoc, Expr *IntExpr,
151 SourceLocation EndLoc) {
152 void *Mem = C.Allocate(sizeof(OpenACCVectorLengthClause),
154 return new (Mem)
155 OpenACCVectorLengthClause(BeginLoc, LParenLoc, IntExpr, EndLoc);
156}
157
158OpenACCAsyncClause::OpenACCAsyncClause(SourceLocation BeginLoc,
159 SourceLocation LParenLoc, Expr *IntExpr,
160 SourceLocation EndLoc)
162 LParenLoc, IntExpr, EndLoc) {
163 assert((!IntExpr || IntExpr->isInstantiationDependent() ||
164 IntExpr->getType()->isIntegerType()) &&
165 "Condition expression type not scalar/dependent");
166}
167
169 SourceLocation BeginLoc,
170 SourceLocation LParenLoc,
171 Expr *IntExpr,
172 SourceLocation EndLoc) {
173 void *Mem =
174 C.Allocate(sizeof(OpenACCAsyncClause), alignof(OpenACCAsyncClause));
175 return new (Mem) OpenACCAsyncClause(BeginLoc, LParenLoc, IntExpr, EndLoc);
176}
177
179 const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc,
180 Expr *DevNumExpr, SourceLocation QueuesLoc, ArrayRef<Expr *> QueueIdExprs,
181 SourceLocation EndLoc) {
182 // Allocates enough room in trailing storage for all the int-exprs, plus a
183 // placeholder for the devnum.
184 void *Mem = C.Allocate(
185 OpenACCWaitClause::totalSizeToAlloc<Expr *>(QueueIdExprs.size() + 1));
186 return new (Mem) OpenACCWaitClause(BeginLoc, LParenLoc, DevNumExpr, QueuesLoc,
187 QueueIdExprs, EndLoc);
188}
189
191 SourceLocation BeginLoc,
192 SourceLocation LParenLoc,
193 ArrayRef<Expr *> IntExprs,
194 SourceLocation EndLoc) {
195 void *Mem = C.Allocate(
196 OpenACCNumGangsClause::totalSizeToAlloc<Expr *>(IntExprs.size()));
197 return new (Mem) OpenACCNumGangsClause(BeginLoc, LParenLoc, IntExprs, EndLoc);
198}
199
201 SourceLocation BeginLoc,
202 SourceLocation LParenLoc,
203 ArrayRef<Expr *> VarList,
204 SourceLocation EndLoc) {
205 void *Mem = C.Allocate(
206 OpenACCPrivateClause::totalSizeToAlloc<Expr *>(VarList.size()));
207 return new (Mem) OpenACCPrivateClause(BeginLoc, LParenLoc, VarList, EndLoc);
208}
209
211 const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc,
212 ArrayRef<Expr *> VarList, SourceLocation EndLoc) {
213 void *Mem = C.Allocate(
214 OpenACCFirstPrivateClause::totalSizeToAlloc<Expr *>(VarList.size()));
215 return new (Mem)
216 OpenACCFirstPrivateClause(BeginLoc, LParenLoc, VarList, EndLoc);
217}
218
220 SourceLocation BeginLoc,
221 SourceLocation LParenLoc,
222 ArrayRef<Expr *> VarList,
223 SourceLocation EndLoc) {
224 void *Mem =
225 C.Allocate(OpenACCAttachClause::totalSizeToAlloc<Expr *>(VarList.size()));
226 return new (Mem) OpenACCAttachClause(BeginLoc, LParenLoc, VarList, EndLoc);
227}
228
230 SourceLocation BeginLoc,
231 SourceLocation LParenLoc,
232 ArrayRef<Expr *> VarList,
233 SourceLocation EndLoc) {
234 void *Mem = C.Allocate(
235 OpenACCDevicePtrClause::totalSizeToAlloc<Expr *>(VarList.size()));
236 return new (Mem) OpenACCDevicePtrClause(BeginLoc, LParenLoc, VarList, EndLoc);
237}
238
240 SourceLocation BeginLoc,
241 SourceLocation LParenLoc,
242 ArrayRef<Expr *> VarList,
243 SourceLocation EndLoc) {
244 void *Mem = C.Allocate(
245 OpenACCNoCreateClause::totalSizeToAlloc<Expr *>(VarList.size()));
246 return new (Mem) OpenACCNoCreateClause(BeginLoc, LParenLoc, VarList, EndLoc);
247}
248
250 SourceLocation BeginLoc,
251 SourceLocation LParenLoc,
252 ArrayRef<Expr *> VarList,
253 SourceLocation EndLoc) {
254 void *Mem = C.Allocate(
255 OpenACCPresentClause::totalSizeToAlloc<Expr *>(VarList.size()));
256 return new (Mem) OpenACCPresentClause(BeginLoc, LParenLoc, VarList, EndLoc);
257}
258
261 SourceLocation BeginLoc, SourceLocation LParenLoc,
262 ArrayRef<Expr *> VarList, SourceLocation EndLoc) {
263 void *Mem =
264 C.Allocate(OpenACCCopyClause::totalSizeToAlloc<Expr *>(VarList.size()));
265 return new (Mem)
266 OpenACCCopyClause(Spelling, BeginLoc, LParenLoc, VarList, EndLoc);
267}
268
271 SourceLocation BeginLoc, SourceLocation LParenLoc,
272 bool IsReadOnly, ArrayRef<Expr *> VarList,
273 SourceLocation EndLoc) {
274 void *Mem =
275 C.Allocate(OpenACCCopyInClause::totalSizeToAlloc<Expr *>(VarList.size()));
276 return new (Mem) OpenACCCopyInClause(Spelling, BeginLoc, LParenLoc,
277 IsReadOnly, VarList, EndLoc);
278}
279
282 SourceLocation BeginLoc, SourceLocation LParenLoc,
283 bool IsZero, ArrayRef<Expr *> VarList,
284 SourceLocation EndLoc) {
285 void *Mem = C.Allocate(
286 OpenACCCopyOutClause::totalSizeToAlloc<Expr *>(VarList.size()));
287 return new (Mem) OpenACCCopyOutClause(Spelling, BeginLoc, LParenLoc, IsZero,
288 VarList, EndLoc);
289}
290
293 SourceLocation BeginLoc, SourceLocation LParenLoc,
294 bool IsZero, ArrayRef<Expr *> VarList,
295 SourceLocation EndLoc) {
296 void *Mem =
297 C.Allocate(OpenACCCreateClause::totalSizeToAlloc<Expr *>(VarList.size()));
298 return new (Mem) OpenACCCreateClause(Spelling, BeginLoc, LParenLoc, IsZero,
299 VarList, EndLoc);
300}
301
303 const ASTContext &C, OpenACCClauseKind K, SourceLocation BeginLoc,
305 SourceLocation EndLoc) {
306 void *Mem =
307 C.Allocate(OpenACCDeviceTypeClause::totalSizeToAlloc<DeviceTypeArgument>(
308 Archs.size()));
309 return new (Mem)
310 OpenACCDeviceTypeClause(K, BeginLoc, LParenLoc, Archs, EndLoc);
311}
312
313//===----------------------------------------------------------------------===//
314// OpenACC clauses printing methods
315//===----------------------------------------------------------------------===//
316
317void OpenACCClausePrinter::printExpr(const Expr *E) {
318 E->printPretty(OS, nullptr, Policy, 0);
319}
320
321void OpenACCClausePrinter::VisitDefaultClause(const OpenACCDefaultClause &C) {
322 OS << "default(" << C.getDefaultClauseKind() << ")";
323}
324
325void OpenACCClausePrinter::VisitIfClause(const OpenACCIfClause &C) {
326 OS << "if(";
327 printExpr(C.getConditionExpr());
328 OS << ")";
329}
330
331void OpenACCClausePrinter::VisitSelfClause(const OpenACCSelfClause &C) {
332 OS << "self";
333 if (const Expr *CondExpr = C.getConditionExpr()) {
334 OS << "(";
335 printExpr(CondExpr);
336 OS << ")";
337 }
338}
339
340void OpenACCClausePrinter::VisitNumGangsClause(const OpenACCNumGangsClause &C) {
341 OS << "num_gangs(";
342 llvm::interleaveComma(C.getIntExprs(), OS,
343 [&](const Expr *E) { printExpr(E); });
344 OS << ")";
345}
346
347void OpenACCClausePrinter::VisitNumWorkersClause(
348 const OpenACCNumWorkersClause &C) {
349 OS << "num_workers(";
350 printExpr(C.getIntExpr());
351 OS << ")";
352}
353
354void OpenACCClausePrinter::VisitVectorLengthClause(
356 OS << "vector_length(";
357 printExpr(C.getIntExpr());
358 OS << ")";
359}
360
361void OpenACCClausePrinter::VisitAsyncClause(const OpenACCAsyncClause &C) {
362 OS << "async";
363 if (C.hasIntExpr()) {
364 OS << "(";
365 printExpr(C.getIntExpr());
366 OS << ")";
367 }
368}
369
370void OpenACCClausePrinter::VisitPrivateClause(const OpenACCPrivateClause &C) {
371 OS << "private(";
372 llvm::interleaveComma(C.getVarList(), OS,
373 [&](const Expr *E) { printExpr(E); });
374 OS << ")";
375}
376
377void OpenACCClausePrinter::VisitFirstPrivateClause(
379 OS << "firstprivate(";
380 llvm::interleaveComma(C.getVarList(), OS,
381 [&](const Expr *E) { printExpr(E); });
382 OS << ")";
383}
384
385void OpenACCClausePrinter::VisitAttachClause(const OpenACCAttachClause &C) {
386 OS << "attach(";
387 llvm::interleaveComma(C.getVarList(), OS,
388 [&](const Expr *E) { printExpr(E); });
389 OS << ")";
390}
391
392void OpenACCClausePrinter::VisitDevicePtrClause(
393 const OpenACCDevicePtrClause &C) {
394 OS << "deviceptr(";
395 llvm::interleaveComma(C.getVarList(), OS,
396 [&](const Expr *E) { printExpr(E); });
397 OS << ")";
398}
399
400void OpenACCClausePrinter::VisitNoCreateClause(const OpenACCNoCreateClause &C) {
401 OS << "no_create(";
402 llvm::interleaveComma(C.getVarList(), OS,
403 [&](const Expr *E) { printExpr(E); });
404 OS << ")";
405}
406
407void OpenACCClausePrinter::VisitPresentClause(const OpenACCPresentClause &C) {
408 OS << "present(";
409 llvm::interleaveComma(C.getVarList(), OS,
410 [&](const Expr *E) { printExpr(E); });
411 OS << ")";
412}
413
414void OpenACCClausePrinter::VisitCopyClause(const OpenACCCopyClause &C) {
415 OS << C.getClauseKind() << '(';
416 llvm::interleaveComma(C.getVarList(), OS,
417 [&](const Expr *E) { printExpr(E); });
418 OS << ")";
419}
420
421void OpenACCClausePrinter::VisitCopyInClause(const OpenACCCopyInClause &C) {
422 OS << C.getClauseKind() << '(';
423 if (C.isReadOnly())
424 OS << "readonly: ";
425 llvm::interleaveComma(C.getVarList(), OS,
426 [&](const Expr *E) { printExpr(E); });
427 OS << ")";
428}
429
430void OpenACCClausePrinter::VisitCopyOutClause(const OpenACCCopyOutClause &C) {
431 OS << C.getClauseKind() << '(';
432 if (C.isZero())
433 OS << "zero: ";
434 llvm::interleaveComma(C.getVarList(), OS,
435 [&](const Expr *E) { printExpr(E); });
436 OS << ")";
437}
438
439void OpenACCClausePrinter::VisitCreateClause(const OpenACCCreateClause &C) {
440 OS << C.getClauseKind() << '(';
441 if (C.isZero())
442 OS << "zero: ";
443 llvm::interleaveComma(C.getVarList(), OS,
444 [&](const Expr *E) { printExpr(E); });
445 OS << ")";
446}
447
448void OpenACCClausePrinter::VisitWaitClause(const OpenACCWaitClause &C) {
449 OS << "wait";
450 if (!C.getLParenLoc().isInvalid()) {
451 OS << "(";
452 if (C.hasDevNumExpr()) {
453 OS << "devnum: ";
454 printExpr(C.getDevNumExpr());
455 OS << " : ";
456 }
457
458 if (C.hasQueuesTag())
459 OS << "queues: ";
460
461 llvm::interleaveComma(C.getQueueIdExprs(), OS,
462 [&](const Expr *E) { printExpr(E); });
463 OS << ")";
464 }
465}
466
467void OpenACCClausePrinter::VisitDeviceTypeClause(
468 const OpenACCDeviceTypeClause &C) {
469 OS << C.getClauseKind();
470 OS << "(";
471 llvm::interleaveComma(C.getArchitectures(), OS,
472 [&](const DeviceTypeArgument &Arch) {
473 if (Arch.first == nullptr)
474 OS << "*";
475 else
476 OS << Arch.first->getName();
477 });
478 OS << ")";
479}
Defines the clang::ASTContext interface.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition: ASTContext.h:182
This represents one expression.
Definition: Expr.h:110
bool isInstantiationDependent() const
Whether this expression is instantiation-dependent, meaning that it depends in some way on.
Definition: Expr.h:221
QualType getType() const
Definition: Expr.h:142
static bool classof(const OpenACCClause *C)
static OpenACCAsyncClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCAttachClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static bool classof(const OpenACCClause *C)
Represents one of the handful of classes that has an optional/required 'condition' expression as an a...
static bool classof(const OpenACCClause *C)
static bool classof(const OpenACCClause *C)
static bool classof(const OpenACCClause *C)
Represents one of a handful of clauses that have a single integer expression.
static bool classof(const OpenACCClause *C)
static bool classof(const OpenACCClause *C)
This is the base type for all OpenACC Clauses.
Definition: OpenACCClause.h:24
child_range children()
StmtIterator child_iterator
Definition: OpenACCClause.h:43
OpenACCClauseKind getClauseKind() const
Definition: OpenACCClause.h:37
llvm::iterator_range< child_iterator > child_range
Definition: OpenACCClause.h:45
static OpenACCCopyClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static bool classof(const OpenACCClause *C)
static bool classof(const OpenACCClause *C)
static OpenACCCopyInClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, bool IsReadOnly, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static bool classof(const OpenACCClause *C)
static OpenACCCopyOutClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, bool IsZero, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static bool classof(const OpenACCClause *C)
static OpenACCCreateClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, bool IsZero, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
A 'default' clause, has the optional 'none' or 'present' argument.
static OpenACCDefaultClause * Create(const ASTContext &C, OpenACCDefaultClauseKind K, SourceLocation BeginLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
static OpenACCDevicePtrClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static bool classof(const OpenACCClause *C)
A 'device_type' or 'dtype' clause, takes a list of either an 'asterisk' or an identifier.
Definition: OpenACCClause.h:86
static OpenACCDeviceTypeClause * Create(const ASTContext &C, OpenACCClauseKind K, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< DeviceTypeArgument > Archs, SourceLocation EndLoc)
static bool classof(const OpenACCClause *C)
static OpenACCFirstPrivateClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static bool classof(const OpenACCClause *C)
An 'if' clause, which has a required condition expression.
OpenACCIfClause(SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *ConditionExpr, SourceLocation EndLoc)
static OpenACCIfClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *ConditionExpr, SourceLocation EndLoc)
static bool classof(const OpenACCClause *C)
static bool classof(const OpenACCClause *C)
static OpenACCNoCreateClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCNumGangsClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > IntExprs, SourceLocation EndLoc)
static bool classof(const OpenACCClause *C)
static OpenACCNumWorkersClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static bool classof(const OpenACCClause *C)
static bool classof(const OpenACCClause *C)
static OpenACCPresentClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static bool classof(const OpenACCClause *C)
static OpenACCPrivateClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
A 'self' clause, which has an optional condition expression.
static bool classof(const OpenACCClause *C)
static OpenACCSelfClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *ConditionExpr, SourceLocation EndLoc)
static OpenACCVectorLengthClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static bool classof(const OpenACCClause *C)
static OpenACCWaitClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *DevNumExpr, SourceLocation QueuesLoc, ArrayRef< Expr * > QueueIdExprs, SourceLocation EndLoc)
static bool classof(const OpenACCClause *C)
Encodes a location in the source.
void printPretty(raw_ostream &OS, PrinterHelper *Helper, const PrintingPolicy &Policy, unsigned Indentation=0, StringRef NewlineSymbol="\n", const ASTContext *Context=nullptr) const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
Definition: Type.h:7945
bool isScalarType() const
Definition: Type.h:8004
The JSON file list parser is used to communicate input to InstallAPI.
OpenACCClauseKind
Represents the kind of an OpenACC clause.
Definition: OpenACCKinds.h:164
@ VectorLength
'vector_length' clause, allowed on 'parallel', 'kernels', 'parallel loop', and 'kernels loop' constru...
@ Async
'async' clause, allowed on Compute, Data, 'update', 'wait', and Combined constructs.
@ If
'if' clause, allowed on all the Compute Constructs, Data Constructs, Executable Constructs,...
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
@ NumWorkers
'num_workers' clause, allowed on 'parallel', 'kernels', parallel loop', and 'kernels loop' constructs...
OpenACCDefaultClauseKind
Definition: OpenACCKinds.h:462
std::pair< IdentifierInfo *, SourceLocation > DeviceTypeArgument
Definition: OpenACCClause.h:80