13#ifndef LLVM_CLANG_AST_STMTOPENACC_H
14#define LLVM_CLANG_AST_STMTOPENACC_H
20#include "llvm/ADT/STLExtras.h"
47 :
Stmt(SC),
Kind(K),
Range(Start, End), DirectiveLoc(DirectiveLoc) {}
52 assert(Clauses.empty() &&
"Cannot change clause list");
60 return S->getStmtClass() >= firstOpenACCConstructStmtConstant &&
61 S->getStmtClass() <= lastOpenACCConstructStmtConstant;
85 Stmt *AssociatedStmt =
nullptr;
93 AssociatedStmt(AssocStmt) {}
109 return child_range(&AssociatedStmt, &AssociatedStmt + 1);
131 private llvm::TrailingObjects<OpenACCComputeConstruct,
132 const OpenACCClause *> {
136 friend TrailingObjects;
145 std::uninitialized_value_construct_n(getTrailingObjects(), NumClauses);
152 Stmt *StructuredBlock)
154 DirectiveLoc, End, StructuredBlock) {
156 "Only parallel, serial, and kernels constructs should be "
157 "represented by this type");
160 llvm::uninitialized_copy(Clauses, getTrailingObjects());
169 return T->getStmtClass() == OpenACCComputeConstructClass;
173 unsigned NumClauses);
189 private llvm::TrailingObjects<OpenACCLoopConstruct,
190 const OpenACCClause *> {
202 friend TrailingObjects;
212 return T->getStmtClass() == OpenACCLoopConstructClass;
216 unsigned NumClauses);
238 return ParentComputeConstructKind;
246 private llvm::TrailingObjects<OpenACCCombinedConstruct,
247 const OpenACCClause *> {
248 friend TrailingObjects;
254 std::uninitialized_value_construct_n(getTrailingObjects(), NumClauses);
261 Stmt *StructuredBlock)
263 DirectiveLoc, End, StructuredBlock) {
265 "Only parallel loop, serial loop, and kernels loop constructs "
266 "should be represented by this type");
268 llvm::uninitialized_copy(Clauses, getTrailingObjects());
275 return T->getStmtClass() == OpenACCCombinedConstructClass;
279 unsigned NumClauses);
294 private llvm::TrailingObjects<OpenACCDataConstruct,
295 const OpenACCClause *> {
296 friend TrailingObjects;
302 std::uninitialized_value_construct_n(getTrailingObjects(), NumClauses);
309 Stmt *StructuredBlock)
312 DirectiveLoc, End, StructuredBlock) {
313 llvm::uninitialized_copy(Clauses, getTrailingObjects());
320 return T->getStmtClass() == OpenACCDataConstructClass;
324 unsigned NumClauses);
329 Stmt *StructuredBlock);
338 private llvm::TrailingObjects<OpenACCEnterDataConstruct,
339 const OpenACCClause *> {
340 friend TrailingObjects;
345 std::uninitialized_value_construct_n(getTrailingObjects(), NumClauses);
354 llvm::uninitialized_copy(Clauses, getTrailingObjects());
360 return T->getStmtClass() == OpenACCEnterDataConstructClass;
363 unsigned NumClauses);
371 private llvm::TrailingObjects<OpenACCExitDataConstruct,
372 const OpenACCClause *> {
373 friend TrailingObjects;
378 std::uninitialized_value_construct_n(getTrailingObjects(), NumClauses);
387 llvm::uninitialized_copy(Clauses, getTrailingObjects());
393 return T->getStmtClass() == OpenACCExitDataConstructClass;
396 unsigned NumClauses);
405 private llvm::TrailingObjects<OpenACCHostDataConstruct,
406 const OpenACCClause *> {
407 friend TrailingObjects;
413 std::uninitialized_value_construct_n(getTrailingObjects(), NumClauses);
419 Stmt *StructuredBlock)
422 DirectiveLoc, End, StructuredBlock) {
423 llvm::uninitialized_copy(Clauses, getTrailingObjects());
430 return T->getStmtClass() == OpenACCHostDataConstructClass;
433 unsigned NumClauses);
437 Stmt *StructuredBlock);
448 private llvm::TrailingObjects<OpenACCWaitConstruct, Expr *,
454 friend TrailingObjects;
465 unsigned NumExprs = 0;
472 assert(NumExprs >= 1 &&
473 "NumExprs should always be >= 1 because the 'devnum' "
474 "expr is represented by a null if necessary");
475 std::uninitialized_value_construct_n(getExprPtr(), NumExprs);
476 std::uninitialized_value_construct_n(getTrailingObjects<OpenACCClause *>(),
479 getTrailingObjects<OpenACCClause *>()),
491 LParenLoc(LParenLoc), RParenLoc(RParenLoc), QueuesLoc(QueuesLoc),
492 NumExprs(QueueIdExprs.size() + 1) {
493 assert(NumExprs >= 1 &&
494 "NumExprs should always be >= 1 because the 'devnum' "
495 "expr is represented by a null if necessary");
497 llvm::uninitialized_copy(
ArrayRef(DevNumExpr), getExprPtr());
498 llvm::uninitialized_copy(QueueIdExprs, getExprPtr() + 1);
499 std::uninitialized_copy(
const_cast<OpenACCClause **
>(Clauses.begin()),
501 getTrailingObjects<OpenACCClause *>());
503 getTrailingObjects<OpenACCClause *>()),
507 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
return NumExprs; }
508 size_t numTrailingObjects(OverloadToken<const OpenACCClause *>)
const {
512 Expr **getExprPtr()
const {
513 return const_cast<Expr**
>(getTrailingObjects<Expr *>());
516 ArrayRef<Expr *> getExprs()
const {
return {getExprPtr(), NumExprs}; }
518 ArrayRef<Expr *> getExprs() {
return {getExprPtr(), NumExprs}; }
522 return T->getStmtClass() == OpenACCWaitConstructClass;
551 reinterpret_cast<Stmt *
const *
>(getExprPtr());
558 private llvm::TrailingObjects<OpenACCCacheConstruct, Expr *> {
559 friend TrailingObjects;
567 unsigned NumVars = 0;
574 std::uninitialized_value_construct_n(getTrailingObjects(), NumVars);
583 ParensLoc(LParenLoc, RParenLoc), ReadOnlyLoc(ReadOnlyLoc),
584 NumVars(VarList.size()) {
586 llvm::uninitialized_copy(VarList, getTrailingObjects());
595 return T->getStmtClass() == OpenACCCacheConstructClass;
612 Stmt **
Begin =
reinterpret_cast<Stmt **
>(getTrailingObjects());
617 Stmt *
const *
Begin =
reinterpret_cast<Stmt *
const *
>(getTrailingObjects());
625 private llvm::TrailingObjects<OpenACCInitConstruct,
626 const OpenACCClause *> {
627 friend TrailingObjects;
632 std::uninitialized_value_construct_n(getTrailingObjects(), NumClauses);
641 llvm::uninitialized_copy(Clauses, getTrailingObjects());
647 return T->getStmtClass() == OpenACCInitConstructClass;
650 unsigned NumClauses);
660 private llvm::TrailingObjects<OpenACCShutdownConstruct,
661 const OpenACCClause *> {
662 friend TrailingObjects;
667 std::uninitialized_value_construct_n(getTrailingObjects(), NumClauses);
676 llvm::uninitialized_copy(Clauses, getTrailingObjects());
682 return T->getStmtClass() == OpenACCShutdownConstructClass;
685 unsigned NumClauses);
694 private llvm::TrailingObjects<OpenACCSetConstruct,
695 const OpenACCClause *> {
696 friend TrailingObjects;
701 std::uninitialized_value_construct_n(getTrailingObjects(), NumClauses);
711 llvm::uninitialized_copy(Clauses, getTrailingObjects());
717 return T->getStmtClass() == OpenACCSetConstructClass;
720 unsigned NumClauses);
729 private llvm::TrailingObjects<OpenACCUpdateConstruct,
730 const OpenACCClause *> {
731 friend TrailingObjects;
736 std::uninitialized_value_construct_n(getTrailingObjects(), NumClauses);
746 llvm::uninitialized_copy(Clauses, getTrailingObjects());
752 return T->getStmtClass() == OpenACCUpdateConstructClass;
755 unsigned NumClauses);
765 private llvm::TrailingObjects<OpenACCAtomicConstruct,
766 const OpenACCClause *> {
769 friend TrailingObjects;
777 std::uninitialized_value_construct_n(getTrailingObjects(), NumClauses);
784 Stmt *AssociatedStmt)
787 DirectiveLoc, End, AssociatedStmt),
790 llvm::uninitialized_copy(Clauses, getTrailingObjects());
795 void setAssociatedStmt(Stmt *S) {
801 return T->getStmtClass() == OpenACCAtomicConstructClass;
805 unsigned NumClauses);
enum clang::sema::@1840::IndirectLocalPathEntry::EntryKind Kind
Defines some OpenACC-specific enums and functions.
Defines the clang::SourceLocation class and associated facilities.
TypePropertyCache< Private > Cache
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
This represents one expression.
This is a base class for any OpenACC statement-level constructs that have an associated statement.
void setAssociatedStmt(Stmt *S)
Stmt * getAssociatedStmt()
const_child_range children() const
const Stmt * getAssociatedStmt() const
OpenACCAssociatedStmtConstruct(StmtClass SC, OpenACCDirectiveKind K, SourceLocation Start, SourceLocation DirectiveLoc, SourceLocation End, Stmt *AssocStmt)
static bool classof(const Stmt *T)
const Stmt * getAssociatedStmt() const
Stmt * getAssociatedStmt()
static bool classof(const Stmt *T)
static OpenACCAtomicConstruct * CreateEmpty(const ASTContext &C, unsigned NumClauses)
OpenACCAtomicKind getAtomicKind() const
ArrayRef< Expr * > getVarList() const
static bool classof(const Stmt *T)
MutableArrayRef< Expr * > getVarList()
SourceLocation getRParenLoc() const
SourceLocation getReadOnlyLoc() const
static OpenACCCacheConstruct * CreateEmpty(const ASTContext &C, unsigned NumVars)
SourceLocation getLParenLoc() const
const_child_range children() const
This is the base type for all OpenACC Clauses.
static OpenACCCombinedConstruct * CreateEmpty(const ASTContext &C, unsigned NumClauses)
static bool classof(const Stmt *T)
const Stmt * getLoop() const
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
static OpenACCComputeConstruct * CreateEmpty(const ASTContext &C, unsigned NumClauses)
static bool classof(const Stmt *T)
Stmt * getStructuredBlock()
const Stmt * getStructuredBlock() const
This is the base class for an OpenACC statement-level construct, other construct types are expected t...
SourceLocation getEndLoc() const
SourceLocation getBeginLoc() const
OpenACCDirectiveKind getDirectiveKind() const
void setClauseList(MutableArrayRef< const OpenACCClause * > NewClauses)
ArrayRef< const OpenACCClause * > clauses() const
const_child_range children() const
SourceLocation getDirectiveLoc() const
static bool classof(const Stmt *S)
OpenACCConstructStmt(StmtClass SC, OpenACCDirectiveKind K, SourceLocation Start, SourceLocation DirectiveLoc, SourceLocation End)
const Stmt * getStructuredBlock() const
static OpenACCDataConstruct * CreateEmpty(const ASTContext &C, unsigned NumClauses)
static bool classof(const Stmt *T)
Stmt * getStructuredBlock()
static bool classof(const Stmt *T)
static OpenACCEnterDataConstruct * CreateEmpty(const ASTContext &C, unsigned NumClauses)
static bool classof(const Stmt *T)
static OpenACCExitDataConstruct * CreateEmpty(const ASTContext &C, unsigned NumClauses)
static OpenACCHostDataConstruct * CreateEmpty(const ASTContext &C, unsigned NumClauses)
Stmt * getStructuredBlock()
static bool classof(const Stmt *T)
const Stmt * getStructuredBlock() const
static bool classof(const Stmt *T)
static OpenACCInitConstruct * CreateEmpty(const ASTContext &C, unsigned NumClauses)
This class represents a 'loop' construct.
static OpenACCLoopConstruct * CreateEmpty(const ASTContext &C, unsigned NumClauses)
OpenACCDirectiveKind getParentComputeConstructKind() const
const Stmt * getLoop() const
bool isOrphanedLoopConstruct() const
OpenACC 3.3 2.9: An orphaned loop construct is a loop construct that is not lexically enclosed within...
static bool classof(const Stmt *T)
static OpenACCSetConstruct * CreateEmpty(const ASTContext &C, unsigned NumClauses)
static bool classof(const Stmt *T)
static OpenACCShutdownConstruct * CreateEmpty(const ASTContext &C, unsigned NumClauses)
static bool classof(const Stmt *T)
static bool classof(const Stmt *T)
static OpenACCUpdateConstruct * CreateEmpty(const ASTContext &C, unsigned NumClauses)
static bool classof(const Stmt *T)
SourceLocation getRParenLoc() const
bool hasDevNumExpr() const
static OpenACCWaitConstruct * CreateEmpty(const ASTContext &C, unsigned NumExprs, unsigned NumClauses)
ArrayRef< Expr * > getQueueIdExprs()
SourceLocation getQueuesLoc() const
const_child_range children() const
bool hasQueuesTag() const
SourceLocation getLParenLoc() const
Expr * getDevNumExpr() const
ArrayRef< Expr * > getQueueIdExprs() const
A class that does preorder or postorder depth-first traversal on the entire Clang AST and visits each...
Encodes a location in the source.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
Stmt - This represents one statement.
StmtIterator child_iterator
Child Iterators: All subclasses must implement 'children' to permit easy iteration over the substatem...
llvm::iterator_range< child_iterator > child_range
llvm::iterator_range< const_child_iterator > const_child_range
The JSON file list parser is used to communicate input to InstallAPI.
bool isOpenACCComputeDirectiveKind(OpenACCDirectiveKind K)
bool isOpenACCCombinedDirectiveKind(OpenACCDirectiveKind K)
@ Create
'create' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
const FunctionProtoType * T