//===- StmtOpenACC.h - Classes for OpenACC directives ----------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// /// \file /// This file defines OpenACC AST classes for statement-level contructs. /// //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_AST_STMTOPENACC_H #define LLVM_CLANG_AST_STMTOPENACC_H #include "clang/AST/OpenACCClause.h" #include "clang/AST/Stmt.h" #include "clang/Basic/OpenACCKinds.h" #include "clang/Basic/SourceLocation.h" #include <memory> namespace clang { /// This is the base class for an OpenACC statement-level construct, other /// construct types are expected to inherit from this. class OpenACCConstructStmt : public Stmt { … }; /// This is a base class for any OpenACC statement-level constructs that have an /// associated statement. This class is not intended to be instantiated, but is /// a convenient place to hold the associated statement. class OpenACCAssociatedStmtConstruct : public OpenACCConstructStmt { … }; class OpenACCLoopConstruct; /// This class represents a compute construct, representing a 'Kind' of /// `parallel', 'serial', or 'kernel'. These constructs are associated with a /// 'structured block', defined as: /// /// in C or C++, an executable statement, possibly compound, with a single /// entry at the top and a single exit at the bottom /// /// At the moment there is no real motivation to have a different AST node for /// those three, as they are semantically identical, and have only minor /// differences in the permitted list of clauses, which can be differentiated by /// the 'Kind'. class OpenACCComputeConstruct final : public OpenACCAssociatedStmtConstruct, public llvm::TrailingObjects<OpenACCComputeConstruct, const OpenACCClause *> { … }; /// This class represents a 'loop' construct. The 'loop' construct applies to a /// 'for' loop (or range-for loop), and is optionally associated with a Compute /// Construct. class OpenACCLoopConstruct final : public OpenACCAssociatedStmtConstruct, public llvm::TrailingObjects<OpenACCLoopConstruct, const OpenACCClause *> { … }; } // namespace clang #endif // LLVM_CLANG_AST_STMTOPENACC_H