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;
158 void Enter(
const parser::OmpContextSelector &);
159 void Leave(
const parser::OmpContextSelector &);
161#define GEN_FLANG_CLAUSE_CHECK_ENTER
162#include "llvm/Frontend/OpenMP/OMP.inc"
165 bool CheckAllowedClause(llvmOmpClause clause);
166 void CheckVariableListItem(
const SymbolSourceMap &symbols);
167 void CheckDirectiveSpelling(
170 void AnalyzeObjects(
const parser::OmpObjectList &objects);
171 void CheckMultipleOccurrence(semantics::UnorderedSymbolSet &listVars,
173 const std::string &clauseName);
174 void CheckMultListItems();
175 void CheckStructureComponent(
176 const parser::OmpObjectList &objects, llvm::omp::Clause clauseId);
177 bool HasInvalidWorksharingNesting(
179 bool IsCloselyNestedRegion(
const OmpDirectiveSet &set);
180 bool IsNestedInDirective(llvm::omp::Directive directive);
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 &);
232 void CheckThreadprivateOrDeclareTargetVar(
const parser::OmpObjectList &);
233 void CheckSymbolName(
235 void CheckSymbolNames(
237 void CheckIntentInPointer(SymbolSourceMap &,
const llvm::omp::Clause);
238 void CheckProcedurePointer(SymbolSourceMap &,
const llvm::omp::Clause);
239 void CheckCrayPointee(
const parser::OmpObjectList &objectList,
240 llvm::StringRef clause,
bool suggestToUseCrayPointer =
true);
241 void GetSymbolsInObjectList(
const parser::OmpObjectList &, SymbolSourceMap &);
242 void CheckDefinableObjects(SymbolSourceMap &,
const llvm::omp::Clause);
243 void CheckCopyingPolymorphicAllocatable(
244 SymbolSourceMap &,
const llvm::omp::Clause);
245 void CheckPrivateSymbolsInOuterCxt(
246 SymbolSourceMap &, DirectivesClauseTriple &,
const llvm::omp::Clause);
249 void CheckIsLoopIvPartOfClause(
250 llvmOmpClause clause,
const parser::OmpObjectList &ompObjectList);
251 bool CheckTargetBlockOnlyTeams(
const parser::Block &);
260 template <
typename T,
typename D>
bool IsOperatorValid(
const T &,
const D &);
265 void CheckAtomicType(
267 void CheckAtomicVariable(
275 void CheckAtomicReadAssignment(
277 void CheckAtomicWriteAssignment(
279 std::optional<evaluate::Assignment> CheckAtomicUpdateAssignment(
281 std::pair<bool, bool> CheckAtomicUpdateAssignmentRhs(
const SomeExpr &atom,
283 void CheckAtomicConditionalUpdateAssignment(
const SomeExpr &cond,
286 void CheckAtomicConditionalUpdateStmt(
294 void CheckAtomicConditionalUpdateCapture(
304 void CheckTargetUpdate();
306 void CheckDependenceType(
const parser::OmpDependenceType::Value &x);
307 void CheckTaskDependenceType(
const parser::OmpTaskDependenceType::Value &x);
308 std::optional<llvm::omp::Directive> GetCancelType(
310 const std::optional<parser::OmpClauseList> &maybeClauses);
311 void CheckCancellationNest(
314 const parser::OmpObjectList &ompObjectList,
319 void CheckReductionObjects(
320 const parser::OmpObjectList &objects, llvm::omp::Clause clauseId);
323 void CheckReductionObjectTypes(
const parser::OmpObjectList &objects,
328 void ChecksOnOrderedAsBlock();
331 void ChecksOnOrderedAsStandalone();
332 void CheckOrderedDependClause(std::optional<std::int64_t> orderedValue);
333 void CheckReductionArraySection(
334 const parser::OmpObjectList &ompObjectList, llvm::omp::Clause clauseId);
336 const parser::Name &name,
const llvm::omp::Clause clause);
337 void CheckSharedBindingInOuterContext(
338 const parser::OmpObjectList &ompObjectList);
342 const parser::OmpObjectList &ompObjectList);
343 void CheckPredefinedAllocatorRestriction(
345 bool isPredefinedAllocator{
false};
347 void CheckAllowedRequiresClause(llvmOmpClause clause);
348 bool deviceConstructFound_{
false};
354 void EnterDirectiveNest(
const int index) { directiveNest_[index]++; }
355 void ExitDirectiveNest(
const int index) { directiveNest_[index]--; }
356 int GetDirectiveNest(
const int index) {
return directiveNest_[index]; }
358 inline void ErrIfLHSAndRHSSymbolsMatch(
360 inline void ErrIfNonScalarAssignmentStmt(
362 enum directiveNestType :
int {
364 TargetBlockOnlyTeams,
369 LastType = MetadirectiveNest,
371 int directiveNest_[LastType + 1] = {0};
374 SymbolSourceMap deferredNonVariables_;
378 std::vector<LoopConstruct> loopStack_;