FLANG
check-omp-structure.h
1//===-- lib/Semantics/check-omp-structure.h ---------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9// OpenMP structure validity check list
10// 1. invalid clauses on directive
11// 2. invalid repeated clauses on directive
12// 3. TODO: invalid nesting of regions
13
14#ifndef FORTRAN_SEMANTICS_CHECK_OMP_STRUCTURE_H_
15#define FORTRAN_SEMANTICS_CHECK_OMP_STRUCTURE_H_
16
17#include "check-directive-structure.h"
18#include "flang/Common/enum-set.h"
19#include "flang/Parser/parse-tree.h"
20#include "flang/Semantics/openmp-directive-sets.h"
21#include "flang/Semantics/semantics.h"
22
23using OmpClauseSet =
25
26#define GEN_FLANG_DIRECTIVE_CLAUSE_SETS
27#include "llvm/Frontend/OpenMP/OMP.inc"
28
29namespace llvm {
30namespace omp {
31static OmpClauseSet privateSet{
32 Clause::OMPC_private, Clause::OMPC_firstprivate, Clause::OMPC_lastprivate};
33static OmpClauseSet privateReductionSet{
34 OmpClauseSet{Clause::OMPC_reduction} | privateSet};
35} // namespace omp
36} // namespace llvm
37
38namespace Fortran::semantics {
39struct AnalyzedCondStmt;
40
41namespace omp {
42struct LoopSequence;
43}
44
45// Mapping from 'Symbol' to 'Source' to keep track of the variables
46// used in multiple clauses
47using SymbolSourceMap = std::multimap<const Symbol *, parser::CharBlock>;
48// Multimap to check the triple <current_dir, enclosing_dir, enclosing_clause>
49using DirectivesClauseTriple = std::multimap<llvm::omp::Directive,
50 std::pair<llvm::omp::Directive, const OmpClauseSet>>;
51
52using OmpStructureCheckerBase = DirectiveStructureChecker<llvm::omp::Directive,
53 llvm::omp::Clause, parser::OmpClause, llvm::omp::Clause_enumSize>;
54
55class OmpStructureChecker : public OmpStructureCheckerBase {
56public:
57 using Base = OmpStructureCheckerBase;
58
59 OmpStructureChecker(SemanticsContext &context);
60
61 void Enter(const parser::ProgramUnit &);
62 void Enter(const parser::MainProgram &);
63 void Leave(const parser::MainProgram &);
64 void Enter(const parser::BlockData &);
65 void Leave(const parser::BlockData &);
66 void Enter(const parser::Module &);
67 void Leave(const parser::Module &);
68 void Enter(const parser::Submodule &);
69 void Leave(const parser::Submodule &);
70 void Enter(const parser::SubroutineStmt &);
71 void Enter(const parser::EndSubroutineStmt &);
72 void Enter(const parser::FunctionStmt &);
73 void Enter(const parser::EndFunctionStmt &);
74 void Enter(const parser::MpSubprogramStmt &);
75 void Enter(const parser::EndMpSubprogramStmt &);
76 void Enter(const parser::BlockConstruct &);
77 void Leave(const parser::BlockConstruct &);
78 void Enter(const parser::InternalSubprogram &);
79 void Enter(const parser::ModuleSubprogram &);
80
81 void Enter(const parser::SpecificationPart &);
82 void Leave(const parser::SpecificationPart &);
83 void Enter(const parser::ExecutionPart &);
84 void Leave(const parser::ExecutionPart &);
85
86 void Enter(const parser::OpenMPConstruct &);
87 void Leave(const parser::OpenMPConstruct &);
88 void Enter(const parser::OpenMPDeclarativeConstruct &);
89 void Leave(const parser::OpenMPDeclarativeConstruct &);
90
91 void Enter(const parser::OpenMPMisplacedEndDirective &);
92 void Leave(const parser::OpenMPMisplacedEndDirective &);
93 void Enter(const parser::OpenMPInvalidDirective &);
94 void Leave(const parser::OpenMPInvalidDirective &);
95
96 void Enter(const parser::OpenMPLoopConstruct &);
97 void Leave(const parser::OpenMPLoopConstruct &);
98
99 void Enter(const parser::OmpAssumeDirective &);
100 void Leave(const parser::OmpAssumeDirective &);
101 void Enter(const parser::OmpAssumesDirective &);
102 void Leave(const parser::OmpAssumesDirective &);
103 void Enter(const parser::OpenMPInteropConstruct &);
104 void Leave(const parser::OpenMPInteropConstruct &);
105 void Enter(const parser::OmpBlockConstruct &);
106 void Leave(const parser::OmpBlockConstruct &);
107 void Enter(const parser::OmpBeginDirective &);
108 void Leave(const parser::OmpBeginDirective &);
109 void Enter(const parser::OmpEndDirective &);
110 void Leave(const parser::OmpEndDirective &);
111
112 void Enter(const parser::OpenMPSectionsConstruct &);
113 void Leave(const parser::OpenMPSectionsConstruct &);
114 void Enter(const parser::OmpEndSectionsDirective &);
115 void Leave(const parser::OmpEndSectionsDirective &);
116
117 void Enter(const parser::OmpDeclareVariantDirective &);
118 void Leave(const parser::OmpDeclareVariantDirective &);
119 void Enter(const parser::OmpDeclareSimdDirective &);
120 void Leave(const parser::OmpDeclareSimdDirective &);
121 void Enter(const parser::OmpAllocateDirective &);
122 void Leave(const parser::OmpAllocateDirective &);
123 void Enter(const parser::OmpDeclareMapperDirective &);
124 void Leave(const parser::OmpDeclareMapperDirective &);
125 void Enter(const parser::OmpDeclareReductionDirective &);
126 void Leave(const parser::OmpDeclareReductionDirective &);
127 void Enter(const parser::OmpDeclareTargetDirective &);
128 void Leave(const parser::OmpDeclareTargetDirective &);
129 void Enter(const parser::OpenMPDepobjConstruct &);
130 void Leave(const parser::OpenMPDepobjConstruct &);
131 void Enter(const parser::OpenMPDispatchConstruct &);
132 void Leave(const parser::OpenMPDispatchConstruct &);
133 void Enter(const parser::OmpErrorDirective &);
134 void Leave(const parser::OmpErrorDirective &);
135 void Enter(const parser::OmpNothingDirective &);
136 void Leave(const parser::OmpNothingDirective &);
137 void Enter(const parser::OpenMPAllocatorsConstruct &);
138 void Leave(const parser::OpenMPAllocatorsConstruct &);
139 void Enter(const parser::OmpRequiresDirective &);
140 void Leave(const parser::OmpRequiresDirective &);
141 void Enter(const parser::OmpGroupprivateDirective &);
142 void Leave(const parser::OmpGroupprivateDirective &);
143 void Enter(const parser::OmpThreadprivateDirective &);
144 void Leave(const parser::OmpThreadprivateDirective &);
145
146 void Enter(const parser::OpenMPSimpleStandaloneConstruct &);
147 void Leave(const parser::OpenMPSimpleStandaloneConstruct &);
148 void Enter(const parser::OpenMPFlushConstruct &);
149 void Leave(const parser::OpenMPFlushConstruct &);
150 void Enter(const parser::OpenMPCancelConstruct &);
151 void Leave(const parser::OpenMPCancelConstruct &);
154 void Enter(const parser::OpenMPCriticalConstruct &);
155 void Leave(const parser::OpenMPCriticalConstruct &);
156 void Enter(const parser::OpenMPAtomicConstruct &);
157 void Leave(const parser::OpenMPAtomicConstruct &);
158
159 void Leave(const parser::OmpClauseList &);
160 void Enter(const parser::OmpClause &);
161
162 void Enter(const parser::DoConstruct &);
163 void Leave(const parser::DoConstruct &);
164
165 void Enter(const parser::OmpDirectiveSpecification &);
166 void Leave(const parser::OmpDirectiveSpecification &);
167
168 void Enter(const parser::OmpMetadirectiveDirective &);
169 void Leave(const parser::OmpMetadirectiveDirective &);
172
173 void Enter(const parser::OmpContextSelector &);
174 void Leave(const parser::OmpContextSelector &);
175
176 template <typename A> void Enter(const parser::Statement<A> &);
177 void Leave(const parser::GotoStmt &);
178 void Leave(const parser::ComputedGotoStmt &);
179 void Leave(const parser::ArithmeticIfStmt &);
180 void Leave(const parser::AssignedGotoStmt &);
181 void Leave(const parser::AltReturnSpec &);
182 void Leave(const parser::ErrLabel &);
183 void Leave(const parser::EndLabel &);
184 void Leave(const parser::EorLabel &);
185
186#define GEN_FLANG_CLAUSE_CHECK_ENTER
187#include "llvm/Frontend/OpenMP/OMP.inc"
188
189private:
190 using LoopOrConstruct = std::variant<const parser::DoConstruct *,
192
193 // Most of these functions are defined in check-omp-structure.cpp, but
194 // some groups have their own files.
195
196 // check-omp-atomic.cpp
197 void CheckStorageOverlap(const evaluate::Expr<evaluate::SomeType> &,
199 void ErrorShouldBeVariable(const MaybeExpr &expr, parser::CharBlock source);
200 void CheckAtomicType(SymbolRef sym, parser::CharBlock source,
201 std::string_view name, bool checkTypeOnPointer = true);
202 void CheckAtomicVariable(const evaluate::Expr<evaluate::SomeType> &,
203 parser::CharBlock, bool checkTypeOnPointer = true);
204 std::pair<const parser::ExecutionPartConstruct *,
206 CheckUpdateCapture(const parser::ExecutionPartConstruct *ec1,
208 void CheckAtomicCaptureAssignment(const evaluate::Assignment &capture,
209 const SomeExpr &atom, parser::CharBlock source);
210 void CheckAtomicReadAssignment(
211 const evaluate::Assignment &read, parser::CharBlock source);
212 void CheckAtomicWriteAssignment(
213 const evaluate::Assignment &write, parser::CharBlock source);
214 std::optional<evaluate::Assignment> CheckAtomicUpdateAssignment(
215 const evaluate::Assignment &update, parser::CharBlock source);
216 std::pair<bool, bool> CheckAtomicUpdateAssignmentRhs(const SomeExpr &atom,
217 const SomeExpr &rhs, parser::CharBlock source, bool suppressDiagnostics);
218 void CheckAtomicConditionalUpdateAssignment(const SomeExpr &cond,
219 parser::CharBlock condSource, const evaluate::Assignment &assign,
220 parser::CharBlock assignSource);
221 void CheckAtomicConditionalUpdateStmt(
222 const AnalyzedCondStmt &update, parser::CharBlock source);
223 void CheckAtomicUpdateOnly(const parser::OpenMPAtomicConstruct &x,
224 const parser::Block &body, parser::CharBlock source);
225 void CheckAtomicConditionalUpdate(const parser::OpenMPAtomicConstruct &x,
226 const parser::Block &body, parser::CharBlock source);
227 void CheckAtomicUpdateCapture(const parser::OpenMPAtomicConstruct &x,
228 const parser::Block &body, parser::CharBlock source);
229 void CheckAtomicConditionalUpdateCapture(
230 const parser::OpenMPAtomicConstruct &x, const parser::Block &body,
231 parser::CharBlock source);
232 void CheckAtomicRead(const parser::OpenMPAtomicConstruct &x);
233 void CheckAtomicWrite(const parser::OpenMPAtomicConstruct &x);
234 void CheckAtomicUpdate(const parser::OpenMPAtomicConstruct &x);
235
236 // check-omp-loop.cpp
237 void HasInvalidDistributeNesting(const parser::OpenMPLoopConstruct &x);
238 void HasInvalidLoopBinding(const parser::OpenMPLoopConstruct &x);
239 void CheckSIMDNest(const parser::OpenMPConstruct &x);
240 void CheckRectangularNest(const parser::OmpDirectiveSpecification &spec,
241 const omp::LoopSequence &nest);
242 void CheckNestedConstruct(const parser::OpenMPLoopConstruct &x);
243 const parser::Name GetLoopIndex(const parser::DoConstruct *x);
244 void CheckIterationVariables(const parser::OpenMPLoopConstruct &x);
245 std::int64_t GetOrdCollapseLevel(const parser::OpenMPLoopConstruct &x);
246 void CheckAssociatedLoopConstraints(const parser::OpenMPLoopConstruct &x);
247 void CheckScanModifier(const parser::OmpClause::Reduction &x);
248 void CheckDistLinear(const parser::OpenMPLoopConstruct &x);
249
250 // check-omp-variant.cpp
251 void CheckOmpDeclareVariantDirective(
253 void CheckDeclareVariantUserConditions(const parser::OmpContextSelector &);
254 const std::list<parser::OmpTraitProperty> &GetTraitPropertyList(
256 std::optional<llvm::omp::Clause> GetClauseFromProperty(
258
259 void CheckTraitSelectorList(const std::list<parser::OmpTraitSelector> &);
260 void CheckContextSelectorSpecification(const parser::OmpContextSelector &);
261 void CheckTraitSetSelector(const parser::OmpTraitSetSelector &);
262 void CheckTraitScore(const parser::OmpTraitScore &);
263 bool VerifyTraitPropertyLists(
265 void CheckTraitSelector(
267 void CheckTraitADMO(
269 void CheckTraitCondition(
271 void CheckTraitDeviceNum(
273 void CheckTraitRequires(
275 void CheckTraitSimd(
277
278 // check-omp-structure.cpp
279 bool IsAllowedClause(llvm::omp::Clause clauseId);
280 bool CheckAllowedClause(llvm::omp::Clause clause);
281 void CheckArgumentObjectKind(const parser::OmpClause &x);
282 void CheckDirectiveSpelling(
283 parser::CharBlock spelling, llvm::omp::Directive id);
284 void CheckDirectiveDeprecation(const parser::OpenMPConstruct &x);
285 void AnalyzeObject(const parser::OmpObject &object);
286
287 const parser::OpenMPConstruct *GetCurrentConstruct() const;
288 void CheckSourceLabel(const parser::Label &);
289 void CheckLabelContext(const parser::CharBlock, const parser::CharBlock,
291 void ClearLabels();
292 void CheckMultipleOccurrence(semantics::UnorderedSymbolSet &listVars,
293 const std::list<parser::Name> &nameList, const parser::CharBlock &item,
294 const std::string &clauseName);
295 void CheckMultListItems();
296 void CheckStructureComponent(
297 const parser::OmpObject &object, llvm::omp::Clause clauseId);
298 void CheckStructureComponent(
299 const parser::OmpObjectList &objects, llvm::omp::Clause clauseId);
300 bool HasInvalidWorksharingNesting(
301 const parser::OmpDirectiveName &name, const OmpDirectiveSet &);
302
303 bool IsCloselyNestedRegion(const OmpDirectiveSet &set);
304 bool IsNestedInDirective(llvm::omp::Directive directive);
305 bool IsCombinedParallelWorksharing(llvm::omp::Directive directive) const;
306 bool InTargetRegion();
307 void HasInvalidTeamsNesting(
308 const llvm::omp::Directive &dir, const parser::CharBlock &source);
309 bool HasRequires(llvm::omp::Clause req);
310 void CheckAllowedMapTypes(
311 parser::OmpMapType::Value, llvm::ArrayRef<parser::OmpMapType::Value>);
312
313 llvm::StringRef getClauseName(llvm::omp::Clause clause) override;
314 llvm::StringRef getDirectiveName(llvm::omp::Directive directive) override;
315
316 template < //
317 typename LessTy, typename RangeTy,
318 typename IterTy = decltype(std::declval<RangeTy>().begin())>
319 std::optional<IterTy> FindDuplicate(RangeTy &&);
320
321 void CheckDependList(const parser::DataRef &);
322 void CheckDoacross(const parser::OmpDoacross &doa);
323 void CheckDimsModifier(parser::CharBlock source, size_t numValues,
324 const parser::OmpDimsModifier &x);
325 void CheckTypeParamInquiry(const parser::CharBlock &source,
326 const parser::OmpObject &object, llvm::omp::Directive dirId);
327 void CheckTypeParamInquiry(const parser::CharBlock &source,
328 const parser::OmpObject &object, llvm::omp::Clause clauseId);
329 void CheckVarIsNotPartOfAnotherVar(const parser::CharBlock &source,
330 const parser::OmpObject &object, llvm::StringRef clause = "");
331 void CheckVarIsNotPartOfAnotherVar(const parser::CharBlock &source,
332 const parser::OmpObjectList &objList, llvm::StringRef clause = "");
333 void CheckThreadprivateOrDeclareTargetVar(const parser::Designator &);
334 void CheckThreadprivateOrDeclareTargetVar(const parser::Name &);
335 void CheckThreadprivateOrDeclareTargetVar(const parser::OmpObject &);
336 void CheckThreadprivateOrDeclareTargetVar(const parser::OmpObjectList &);
337 void CheckIntentInPointer(SymbolSourceMap &, const llvm::omp::Clause);
338 void CheckProcedurePointer(SymbolSourceMap &, const llvm::omp::Clause);
339 void CheckCrayPointee(const parser::OmpObjectList &objectList,
340 llvm::StringRef clause, bool suggestToUseCrayPointer = true);
341 void GetSymbolsInObjectList(const parser::OmpObjectList &, SymbolSourceMap &);
342 void CheckDefinableObjects(SymbolSourceMap &, const llvm::omp::Clause);
343 void CheckCopyingPolymorphicAllocatable(
344 SymbolSourceMap &, const llvm::omp::Clause);
345 void CheckPrivateSymbolsInOuterCxt(
346 SymbolSourceMap &, DirectivesClauseTriple &, const llvm::omp::Clause);
347 bool CheckTargetBlockOnlyTeams(const parser::Block &);
348 void CheckWorkshareBlockStmts(const parser::Block &, parser::CharBlock);
349 void CheckWorkdistributeBlockStmts(const parser::Block &, parser::CharBlock);
350 void CheckIndividualAllocateDirective(
351 const parser::OmpAllocateDirective &x, bool isExecutable);
352 void CheckExecutableAllocateDirective(const parser::OmpAllocateDirective &x);
353
354 void CheckIteratorRange(const parser::OmpIteratorSpecifier &x);
355 void CheckIteratorModifier(const parser::OmpIterator &x);
356
357 void CheckTargetNest(const parser::OpenMPConstruct &x);
358 void CheckTargetUpdate();
359 void CheckTaskgraph(const parser::OmpBlockConstruct &x);
360 void CheckDependenceType(const parser::OmpDependenceType::Value &x);
361 void CheckTaskDependenceType(const parser::OmpTaskDependenceType::Value &x);
362 std::optional<llvm::omp::Directive> GetCancelType(
363 llvm::omp::Directive cancelDir, const parser::CharBlock &cancelSource,
364 const std::optional<parser::OmpClauseList> &maybeClauses);
365 void CheckCancellationNest(
366 const parser::CharBlock &source, llvm::omp::Directive type);
367 void CheckReductionObjects(
368 const parser::OmpObjectList &objects, llvm::omp::Clause clauseId);
369 bool CheckReductionOperator(const parser::OmpReductionIdentifier &ident,
370 parser::CharBlock source, llvm::omp::Clause clauseId);
371 void CheckReductionObjectTypes(const parser::OmpObjectList &objects,
372 const parser::OmpReductionIdentifier &ident);
373 void CheckReductionModifier(const parser::OmpReductionModifier &);
374 void CheckLastprivateModifier(const parser::OmpLastprivateModifier &);
375 void CheckMasterNesting(const parser::OmpBlockConstruct &x);
376 void ChecksOnOrderedAsBlock();
377 void CheckBarrierNesting(const parser::OpenMPSimpleStandaloneConstruct &x);
378 void CheckScan(const parser::OpenMPSimpleStandaloneConstruct &x);
379 void ChecksOnOrderedAsStandalone();
380 void CheckOrderedDependClause(std::optional<std::int64_t> orderedValue);
381 void CheckReductionArraySection(
382 const parser::OmpObjectList &ompObjectList, llvm::omp::Clause clauseId);
383 void CheckArraySection(const parser::ArrayElement &arrayElement,
384 const parser::Name &name, const llvm::omp::Clause clause);
385 void CheckLastPartRefForArraySection(
386 const parser::Designator &designator, llvm::omp::Clause clauseId);
387 void CheckSharedBindingInOuterContext(
388 const parser::OmpObjectList &ompObjectList);
389 void CheckIfContiguous(const parser::OmpObject &object);
390 const parser::Name *GetObjectName(const parser::OmpObject &object);
391 void CheckInitOnDepobj(const parser::OpenMPDepobjConstruct &depobj,
392 const parser::OmpClause &initClause);
393 void CheckAllowedRequiresClause(llvm::omp::Clause clause);
394 void AddEndDirectiveClauses(const parser::OmpClauseList &clauses);
395
396 void EnterDirectiveNest(const int index) { directiveNest_[index]++; }
397 void ExitDirectiveNest(const int index) { directiveNest_[index]--; }
398 int GetDirectiveNest(const int index) { return directiveNest_[index]; }
399
400 bool deviceConstructFound_{false};
401 enum directiveNestType : int {
402 SIMDNest,
403 TargetBlockOnlyTeams,
404 TargetNest,
405 DeclarativeNest,
406 ContextSelectorNest,
407 MetadirectiveNest,
408 LastType = MetadirectiveNest,
409 };
410 int directiveNest_[LastType + 1] = {0};
411
412 std::set<std::pair<const Symbol *, const Symbol *>> declareVariantPairs_;
413
414 int allocateDirectiveLevel_{0};
415 parser::CharBlock visitedAtomicSource_;
416
417 // Stack of nested DO loops and OpenMP constructs.
418 // This is used to verify DO loop nest for DOACROSS, and branches into
419 // and out of OpenMP constructs.
420 std::vector<LoopOrConstruct> constructStack_;
421 // Scopes for scoping units.
422 std::vector<const Scope *> scopeStack_;
423 // Stack of directive specifications (except for SECTION).
424 // This is to allow visitor functions to see all specified clauses, since
425 // they are only recorded in DirectiveContext as they are processed.
426 std::vector<const parser::OmpDirectiveSpecification *> dirStack_;
427
428 enum class PartKind : int {
429 // There are also other "parts", such as internal-subprogram-part, etc,
430 // but we're keeping track of these two for now.
431 SpecificationPart,
432 ExecutionPart,
433 };
434 std::vector<PartKind> partStack_;
435
436 std::multimap<const parser::Label,
437 std::pair<parser::CharBlock, const parser::OpenMPConstruct *>>
438 sourceLabels_;
439 std::map<const parser::Label,
440 std::pair<parser::CharBlock, const parser::OpenMPConstruct *>>
441 targetLabels_;
442 parser::CharBlock currentStatementSource_;
443};
444
445template <typename A>
446void OmpStructureChecker::Enter(const parser::Statement<A> &statement) {
447 currentStatementSource_ = statement.source;
448 // Keep track of the labels in all the labelled statements
449 if (statement.label) {
450 auto label{statement.label.value()};
451 // Get the context to check if the labelled statement is in an
452 // enclosing OpenMP construct
453 auto *thisConstruct{GetCurrentConstruct()};
454 targetLabels_.emplace(
455 label, std::make_pair(currentStatementSource_, thisConstruct));
456 // Check if a statement that causes a jump to the 'label'
457 // has already been encountered
458 auto range{sourceLabels_.equal_range(label)};
459 for (auto it{range.first}; it != range.second; ++it) {
460 // Check if both the statement with 'label' and the statement that
461 // causes a jump to the 'label' are in the same scope
462 CheckLabelContext(it->second.first, currentStatementSource_,
463 it->second.second, thisConstruct);
464 }
465 }
466}
467
470template <typename LessTy, typename RangeTy, typename IterTy>
471std::optional<IterTy> OmpStructureChecker::FindDuplicate(RangeTy &&range) {
472 // Deal with iterators, since the actual elements may be rvalues (i.e.
473 // have no addresses), for example with custom-constructed ranges that
474 // are not simple c.begin()..c.end().
475 std::set<IterTy, LessTy> uniq;
476 for (auto it{range.begin()}, end{range.end()}; it != end; ++it) {
477 if (!uniq.insert(it).second) {
478 return it;
479 }
480 }
481 return std::nullopt;
482}
483
484} // namespace Fortran::semantics
485#endif // FORTRAN_SEMANTICS_CHECK_OMP_STRUCTURE_H_
Definition enum-set.h:28
Definition expression.h:921
Definition common.h:215
Definition char-block.h:28
Definition check-directive-structure.h:208
Definition semantics.h:68
Definition FIRType.h:103
Definition parse-tree.h:3537
Definition parse-tree.h:1939
Definition parse-tree.h:3547
Definition parse-tree.h:2223
Definition parse-tree.h:3061
Definition parse-tree.h:2551
Definition parse-tree.h:1849
Definition parse-tree.h:1888
Definition parse-tree.h:2366
Definition parse-tree.h:559
Definition parse-tree.h:3181
Definition parse-tree.h:468
Definition parse-tree.h:2970
Definition parse-tree.h:2984
Definition parse-tree.h:3005
Definition parse-tree.h:592
Definition parse-tree.h:5364
Definition parse-tree.h:5222
Definition parse-tree.h:5211
Definition parse-tree.h:5153
Definition parse-tree.h:5163
Definition parse-tree.h:5122
Definition parse-tree.h:5106
Definition parse-tree.h:5291
Definition parse-tree.h:5308
Definition parse-tree.h:5283
Definition parse-tree.h:3573
Definition parse-tree.h:5129
Definition parse-tree.h:4553
Definition parse-tree.h:5158
Definition parse-tree.h:5233
Definition parse-tree.h:5196
Definition parse-tree.h:5317
Definition parse-tree.h:5176
Definition parse-tree.h:5190
Definition parse-tree.h:3618
Definition parse-tree.h:3606
Definition parse-tree.h:3662
Definition parse-tree.h:5324
Definition parse-tree.h:5330
Definition parse-tree.h:5390
Definition parse-tree.h:5395
Definition parse-tree.h:5432
Definition parse-tree.h:5516
Definition parse-tree.h:5380
Definition parse-tree.h:5443
Definition parse-tree.h:5457
Definition parse-tree.h:5473
Definition parse-tree.h:5481
Definition parse-tree.h:5534
Definition parse-tree.h:5502
Definition parse-tree.h:5248
Definition parse-tree.h:576
Definition parse-tree.h:456
Definition parse-tree.h:362
Definition parse-tree.h:3047
Definition parse-tree.h:3200
Definition parse-tree.h:4055
Definition parse-tree.h:4121
Definition parse-tree.h:4131
Definition parse-tree.h:4139
Definition parse-tree.h:4280
Definition parse-tree.h:3808
Definition parse-tree.h:3774
Definition parse-tree.h:3847
Definition parse-tree.h:3869
Definition check-omp-atomic.cpp:242
Definition openmp-utils.h:303