9#ifndef FORTRAN_SEMANTICS_SEMANTICS_H_
10#define FORTRAN_SEMANTICS_SEMANTICS_H_
12#include "module-dependences.h"
13#include "program-tree.h"
16#include "flang/Common/Fortran-features.h"
17#include "flang/Common/LangOptions.h"
18#include "flang/Evaluate/common.h"
19#include "flang/Evaluate/intrinsics.h"
20#include "flang/Evaluate/target.h"
21#include "flang/Parser/message.h"
32class IntrinsicTypeDefaultKinds;
38class AllCookedSources;
39struct AssociateConstruct;
43struct ChangeTeamConstruct;
44struct CriticalConstruct;
45struct ForallConstruct;
47struct SelectRankConstruct;
48struct SelectTypeConstruct;
53namespace Fortran::semantics {
57using CommonBlockList = std::vector<std::pair<SymbolRef, std::size_t>>;
59using ConstructNode = std::variant<
const parser::AssociateConstruct *,
60 const parser::BlockConstruct *,
const parser::CaseConstruct *,
61 const parser::ChangeTeamConstruct *,
const parser::CriticalConstruct *,
62 const parser::DoConstruct *,
const parser::ForallConstruct *,
63 const parser::IfConstruct *,
const parser::SelectRankConstruct *,
64 const parser::SelectTypeConstruct *,
const parser::WhereConstruct *>;
65using ConstructStack = std::vector<ConstructNode>;
78 return languageFeatures_;
81 int GetDefaultKind(TypeCategory)
const;
82 int doublePrecisionKind()
const {
83 return defaultKinds_.doublePrecisionKind();
85 int quadPrecisionKind()
const {
return defaultKinds_.quadPrecisionKind(); }
86 bool IsEnabled(common::LanguageFeature feature)
const {
87 return languageFeatures_.IsEnabled(feature);
89 template <
typename A>
bool ShouldWarn(A x)
const {
90 return languageFeatures_.ShouldWarn(x);
92 const std::optional<parser::CharBlock> &location()
const {
return location_; }
93 const std::vector<std::string> &searchDirectories()
const {
94 return searchDirectories_;
96 const std::vector<std::string> &intrinsicModuleDirectories()
const {
97 return intrinsicModuleDirectories_;
99 const std::string &moduleDirectory()
const {
return moduleDirectory_; }
100 const std::string &moduleFileSuffix()
const {
return moduleFileSuffix_; }
101 bool underscoring()
const {
return underscoring_; }
102 bool warningsAreErrors()
const {
return warningsAreErrors_; }
103 bool debugModuleWriter()
const {
return debugModuleWriter_; }
104 const evaluate::IntrinsicProcTable &intrinsics()
const {
return intrinsics_; }
106 return targetCharacteristics_;
109 return targetCharacteristics_;
111 Scope &globalScope() {
return globalScope_; }
112 Scope &intrinsicModulesScope() {
return intrinsicModulesScope_; }
117 std::map<const Symbol *, SourceName> &moduleFileOutputRenamings() {
118 return moduleFileOutputRenamings_;
122 const std::optional<parser::CharBlock> &location) {
123 location_ = location;
126 SemanticsContext &set_searchDirectories(
const std::vector<std::string> &x) {
127 searchDirectories_ = x;
131 const std::vector<std::string> &x) {
132 intrinsicModuleDirectories_ = x;
136 moduleDirectory_ = x;
140 moduleFileSuffix_ = x;
148 warnOnNonstandardUsage_ = x;
152 warningsAreErrors_ = x;
157 debugModuleWriter_ = x;
161 const DeclTypeSpec &MakeNumericType(TypeCategory,
int kind = 0);
164 bool AnyFatalError()
const;
167 bool HasError(
const Symbol &);
168 bool HasError(
const Symbol *);
170 void SetError(
const Symbol &,
bool =
true);
174 return messages_.Say(*location_, std::forward<A>(args)...);
176 template <
typename... A>
178 return messages_.Say(at, std::forward<A>(args)...);
181 return messages_.Say(std::move(msg));
183 template <
typename... A>
187 auto &message{Say(at, std::move(msg), args...)};
188 evaluate::AttachDeclaration(&message, symbol);
192 template <
typename FeatureOrUsageWarning,
typename... A>
195 if (languageFeatures_.ShouldWarn(warning) && !IsInModuleFile(at)) {
197 messages_.Say(warning, at, std::forward<A>(args)...)};
204 template <
typename FeatureOrUsageWarning,
typename... A>
207 return Warn(warning, *location_, std::forward<A>(args)...);
216 const ConstructStack &constructStack()
const {
return constructStack_; }
217 template <
typename N>
void PushConstruct(
const N &node) {
218 constructStack_.emplace_back(&node);
222 ENUM_CLASS(IndexVarKind, DO, FORALL)
229 void ActivateIndexVar(
const parser::Name &, IndexVarKind);
231 SymbolVector GetIndexVars(IndexVarKind);
234 static bool IsTempName(
const std::string &);
237 Scope *GetBuiltinModule(
const char *name);
240 void UseFortranBuiltinsModule();
241 const Scope *GetBuiltinsScope()
const {
return builtinsScope_; }
243 const Scope &GetCUDABuiltinsScope();
244 const Scope &GetCUDADeviceScope();
246 void UsePPCBuiltinTypesModule();
247 void UsePPCBuiltinsModule();
248 Scope *GetPPCBuiltinTypesScope() {
return ppcBuiltinTypesScope_; }
249 const Scope *GetPPCBuiltinsScope()
const {
return ppcBuiltinsScope_; }
253 parser::Program &SaveParseTree(parser::Program &&);
261 void MapCommonBlockAndCheckConflicts(
const Symbol &);
277 CommonBlockList GetCommonBlocks()
const;
279 void NoteDefinedSymbol(
const Symbol &);
280 bool IsSymbolDefined(
const Symbol &)
const;
282 void DumpSymbols(llvm::raw_ostream &);
288 struct ScopeIndexComparator {
292 std::multimap<parser::CharBlock, Scope &, ScopeIndexComparator>;
297 void CheckError(
const Symbol &);
303 std::optional<parser::CharBlock> location_;
304 std::vector<std::string> searchDirectories_;
305 std::vector<std::string> intrinsicModuleDirectories_;
306 std::string moduleDirectory_{
"."s};
307 std::string moduleFileSuffix_{
".mod"};
308 bool underscoring_{
true};
309 bool warnOnNonstandardUsage_{
false};
310 bool warningsAreErrors_{
false};
311 bool debugModuleWriter_{
false};
312 const evaluate::IntrinsicProcTable intrinsics_;
315 Scope &intrinsicModulesScope_;
316 ScopeIndex scopeIndex_;
319 ConstructStack constructStack_;
320 struct IndexVarInfo {
324 std::map<SymbolRef, const IndexVarInfo, SymbolAddressCompare>
326 UnorderedSymbolSet errorSymbols_;
327 std::set<std::string> tempNames_;
328 const Scope *builtinsScope_{
nullptr};
329 Scope *ppcBuiltinTypesScope_{
nullptr};
330 std::optional<const Scope *> cudaBuiltinsScope_;
331 std::optional<const Scope *> cudaDeviceScope_;
332 const Scope *ppcBuiltinsScope_{
nullptr};
333 std::list<parser::Program> modFileParseTrees_;
334 std::unique_ptr<CommonBlockMap> commonBlockMap_;
336 std::map<const Symbol *, SourceName> moduleFileOutputRenamings_;
337 UnorderedSymbolSet isDefined_;
338 std::list<ProgramTree> programTrees_;
344 : context_{context}, program_{program} {}
345 Semantics &set_hermeticModuleFileOutput(
bool yes =
true) {
346 hermeticModuleFileOutput_ = yes;
353 return context_.FindScope(where);
355 bool AnyFatalError()
const {
return context_.AnyFatalError(); }
356 void EmitMessages(llvm::raw_ostream &);
357 void DumpSymbols(llvm::raw_ostream &);
358 void DumpSymbolsSources(llvm::raw_ostream &)
const;
362 parser::Program &program_;
363 bool hermeticModuleFileOutput_{
false};
368 template <
typename N>
void Enter(
const N &) {}
369 template <
typename N>
void Leave(
const N &) {}
Definition: default-kinds.h:26
Definition: LangOptions.h:58
Definition: Fortran-features.h:84
Definition: provenance.h:281
Definition: char-block.h:28
Definition: message.h:188
Definition: message.h:319
Definition: module-dependences.h:21
Definition: program-tree.h:31
Definition: semantics.h:67
Definition: semantics.h:341
Definition: bit-population-count.h:20
Definition: check-expression.h:19
Definition: parse-tree.h:580
Definition: parse-tree.h:1865
Definition: semantics.h:367