14#ifndef FORTRAN_SEMANTICS_CHECK_ACC_STRUCTURE_H_
15#define FORTRAN_SEMANTICS_CHECK_ACC_STRUCTURE_H_
17#include "check-directive-structure.h"
18#include "flang/Common/enum-set.h"
19#include "flang/Parser/parse-tree.h"
20#include "flang/Semantics/semantics.h"
21#include "llvm/ADT/DenseMap.h"
22#include "llvm/Frontend/OpenACC/ACC.h.inc"
30 llvm::acc::Directive_enumSize>;
35#define GEN_FLANG_DIRECTIVE_CLAUSE_SETS
36#include "llvm/Frontend/OpenACC/ACC.inc"
38namespace Fortran::semantics {
41void IterateOverMembers(
42 const AccClauseSet &set, std::function<
void(llvm::acc::Clause)> func);
44class AccStructureChecker
45 :
public DirectiveStructureChecker<llvm::acc::Directive, llvm::acc::Clause,
46 parser::AccClause, AccClauseSet> {
49 : DirectiveStructureChecker(context,
50#define GEN_FLANG_DIRECTIVE_CLAUSE_MAP
51#include
"llvm/Frontend/OpenACC/ACC.inc"
93#define GEN_FLANG_CLAUSE_CHECK_ENTER
94#include "llvm/Frontend/OpenACC/ACC.inc"
100 const SomeExpr &updateVar,
const SomeExpr *captureVar);
102 const SomeExpr *updateVar,
const SomeExpr &captureVar);
104 const SomeExpr &updateVar,
const SomeExpr *captureVar);
105 void CheckAtomicUpdateVariable(
107 void CheckAtomicCaptureVariable(
110 bool CheckAllowedModifier(llvm::acc::Clause clause);
111 bool IsComputeConstruct(llvm::acc::Directive directive)
const;
112 bool IsLoopConstruct(llvm::acc::Directive directive)
const;
113 std::optional<llvm::acc::Directive> getParentComputeConstruct()
const;
114 bool IsInsideComputeConstruct()
const;
115 bool IsInsideKernelsConstruct()
const;
116 void CheckNotInComputeConstruct();
117 std::optional<std::int64_t> getGangDimensionSize(
118 DirectiveContext &dirContext);
119 void CheckNotInSameOrSubLevelLoopConstruct();
120 void CheckRoutineCallInLoop(
const Symbol &);
121 void CheckMultipleOccurrenceInDeclare(
122 const parser::AccObjectList &, llvm::acc::Clause);
123 void CheckMultipleOccurrenceInDeclare(
125 llvm::StringRef getClauseName(llvm::acc::Clause clause)
override;
126 llvm::StringRef getDirectiveName(llvm::acc::Directive directive)
override;
128 llvm::SmallDenseMap<Symbol *, llvm::acc::Clause> declareSymbols;
129 unsigned loopNestLevel = 0;
Definition semantics.h:67
Definition parse-tree.h:5808
Definition parse-tree.h:5784
Definition parse-tree.h:5800
Definition parse-tree.h:5792
Definition parse-tree.h:5740
Definition parse-tree.h:5725
Definition parse-tree.h:5656
Definition parse-tree.h:2047
Definition parse-tree.h:3345
Definition parse-tree.h:2367
Definition parse-tree.h:3333
Definition parse-tree.h:3365
Definition parse-tree.h:3007
Definition parse-tree.h:5815
Definition parse-tree.h:5822
Definition parse-tree.h:5751
Definition parse-tree.h:5844
Definition parse-tree.h:5872
Definition parse-tree.h:5863
Definition parse-tree.h:5745
Definition parse-tree.h:5877
Definition parse-tree.h:5827
Definition parse-tree.h:5757
Definition parse-tree.h:3391
Definition parse-tree.h:3375
Definition parse-tree.h:1897