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 void CheckNotInSameOrSubLevelLoopConstruct();
118 void CheckLoopLevelClauseValue(llvm::StringRef clauseName);
119 void CheckLoopLevelClauseKernelsConflicts();
120 void CheckRoutineCallInLoop(
const Symbol &);
124 void CheckMultipleOccurrenceInDeclare(
125 const parser::AccObjectList &, llvm::acc::Clause);
126 void CheckMultipleOccurrenceInDeclare(
128 llvm::StringRef getClauseName(llvm::acc::Clause clause)
override;
129 llvm::StringRef getDirectiveName(llvm::acc::Directive directive)
override;
131 llvm::SmallDenseMap<Symbol *, llvm::acc::Clause> declareSymbols;
132 unsigned loopNestLevel = 0;
Definition semantics.h:71
Definition parse-tree.h:5920
Definition parse-tree.h:5896
Definition parse-tree.h:5912
Definition parse-tree.h:5904
Definition parse-tree.h:5852
Definition parse-tree.h:5837
Definition parse-tree.h:5768
Definition parse-tree.h:2059
Definition parse-tree.h:3357
Definition parse-tree.h:2379
Definition parse-tree.h:3345
Definition parse-tree.h:3377
Definition parse-tree.h:3019
Definition parse-tree.h:5927
Definition parse-tree.h:5934
Definition parse-tree.h:5863
Definition parse-tree.h:5956
Definition parse-tree.h:5984
Definition parse-tree.h:5975
Definition parse-tree.h:5857
Definition parse-tree.h:5989
Definition parse-tree.h:5939
Definition parse-tree.h:5869
Definition parse-tree.h:3403
Definition parse-tree.h:3387
Definition parse-tree.h:1909