60class OmpStructureChecker
61 :
public DirectiveStructureChecker<llvm::omp::Directive, llvm::omp::Clause,
62 parser::OmpClause, llvm::omp::Clause_enumSize> {
64 using Base = DirectiveStructureChecker<llvm::omp::Directive,
68 : DirectiveStructureChecker(context,
69#define GEN_FLANG_DIRECTIVE_CLAUSE_MAP
70#include
"llvm/Frontend/OpenMP/OMP.inc"
73 using llvmOmpClause =
const llvm::omp::Clause;
159 void Enter(
const parser::OmpContextSelector &);
160 void Leave(
const parser::OmpContextSelector &);
162#define GEN_FLANG_CLAUSE_CHECK_ENTER
163#include "llvm/Frontend/OpenMP/OMP.inc"
166 bool CheckAllowedClause(llvmOmpClause clause);
167 void CheckVariableListItem(
const SymbolSourceMap &symbols);
168 void CheckDirectiveSpelling(
171 void AnalyzeObjects(
const parser::OmpObjectList &objects);
172 void CheckMultipleOccurrence(semantics::UnorderedSymbolSet &listVars,
174 const std::string &clauseName);
175 void CheckMultListItems();
176 void CheckStructureComponent(
177 const parser::OmpObjectList &objects, llvm::omp::Clause clauseId);
178 bool HasInvalidWorksharingNesting(
180 bool IsCloselyNestedRegion(
const OmpDirectiveSet &set);
181 void HasInvalidTeamsNesting(
186 void CheckAllowedMapTypes(
189 const std::list<parser::OmpTraitProperty> &GetTraitPropertyList(
191 std::optional<llvm::omp::Clause> GetClauseFromProperty(
194 void CheckTraitSelectorList(
const std::list<parser::OmpTraitSelector> &);
197 bool VerifyTraitPropertyLists(
199 void CheckTraitSelector(
203 void CheckTraitCondition(
205 void CheckTraitDeviceNum(
207 void CheckTraitRequires(
212 llvm::StringRef getClauseName(llvm::omp::Clause clause)
override;
213 llvm::StringRef getDirectiveName(llvm::omp::Directive directive)
override;
216 typename LessTy,
typename RangeTy,
217 typename IterTy =
decltype(std::declval<RangeTy>().begin())>
218 std::optional<IterTy> FindDuplicate(RangeTy &&);
221 void CheckDependArraySection(
228 const parser::OmpObjectList &objList, llvm::StringRef clause =
"");
230 void CheckThreadprivateOrDeclareTargetVar(
const parser::Name &);
231 void CheckThreadprivateOrDeclareTargetVar(
const parser::OmpObjectList &);
232 void CheckSymbolNames(
234 void CheckIntentInPointer(SymbolSourceMap &,
const llvm::omp::Clause);
235 void CheckProcedurePointer(SymbolSourceMap &,
const llvm::omp::Clause);
236 void CheckCrayPointee(
const parser::OmpObjectList &objectList,
237 llvm::StringRef clause,
bool suggestToUseCrayPointer =
true);
238 void GetSymbolsInObjectList(
const parser::OmpObjectList &, SymbolSourceMap &);
239 void CheckDefinableObjects(SymbolSourceMap &,
const llvm::omp::Clause);
240 void CheckCopyingPolymorphicAllocatable(
241 SymbolSourceMap &,
const llvm::omp::Clause);
242 void CheckPrivateSymbolsInOuterCxt(
243 SymbolSourceMap &, DirectivesClauseTriple &,
const llvm::omp::Clause);
246 void CheckIsLoopIvPartOfClause(
247 llvmOmpClause clause,
const parser::OmpObjectList &ompObjectList);
248 bool CheckTargetBlockOnlyTeams(
const parser::Block &);
257 template <
typename T,
typename D>
bool IsOperatorValid(
const T &,
const D &);
262 void CheckAtomicType(
264 void CheckAtomicVariable(
272 void CheckAtomicReadAssignment(
274 void CheckAtomicWriteAssignment(
276 std::optional<evaluate::Assignment> CheckAtomicUpdateAssignment(
278 std::pair<bool, bool> CheckAtomicUpdateAssignmentRhs(
const SomeExpr &atom,
280 void CheckAtomicConditionalUpdateAssignment(
const SomeExpr &cond,
283 void CheckAtomicConditionalUpdateStmt(
291 void CheckAtomicConditionalUpdateCapture(
301 void CheckTargetUpdate();
302 void CheckDependenceType(
const parser::OmpDependenceType::Value &x);
303 void CheckTaskDependenceType(
const parser::OmpTaskDependenceType::Value &x);
304 std::optional<llvm::omp::Directive> GetCancelType(
306 const std::optional<parser::OmpClauseList> &maybeClauses);
307 void CheckCancellationNest(
310 void CheckReductionObjects(
311 const parser::OmpObjectList &objects, llvm::omp::Clause clauseId);
314 void CheckReductionObjectTypes(
const parser::OmpObjectList &objects,
319 void ChecksOnOrderedAsBlock();
322 void ChecksOnOrderedAsStandalone();
323 void CheckOrderedDependClause(std::optional<std::int64_t> orderedValue);
324 void CheckReductionArraySection(
325 const parser::OmpObjectList &ompObjectList, llvm::omp::Clause clauseId);
327 const parser::Name &name,
const llvm::omp::Clause clause);
328 void CheckSharedBindingInOuterContext(
329 const parser::OmpObjectList &ompObjectList);
333 const parser::OmpObjectList &ompObjectList);
334 void CheckPredefinedAllocatorRestriction(
336 bool isPredefinedAllocator{
false};
338 void CheckAllowedRequiresClause(llvmOmpClause clause);
339 bool deviceConstructFound_{
false};
345 void EnterDirectiveNest(
const int index) { directiveNest_[index]++; }
346 void ExitDirectiveNest(
const int index) { directiveNest_[index]--; }
347 int GetDirectiveNest(
const int index) {
return directiveNest_[index]; }
349 inline void ErrIfLHSAndRHSSymbolsMatch(
351 inline void ErrIfNonScalarAssignmentStmt(
353 enum directiveNestType :
int {
355 TargetBlockOnlyTeams,
360 LastType = MetadirectiveNest,
362 int directiveNest_[LastType + 1] = {0};
365 SymbolSourceMap deferredNonVariables_;
369 std::vector<LoopConstruct> loopStack_;