67class SemanticsContext {
79 return languageFeatures_;
82 const std::string &openAccDefaultNoneScalarsStrictDisableOption()
const {
83 return openAccDefaultNoneScalarsStrictDisableOption_;
85 int GetDefaultKind(TypeCategory)
const;
86 int doublePrecisionKind()
const {
87 return defaultKinds_.doublePrecisionKind();
89 int quadPrecisionKind()
const {
return defaultKinds_.quadPrecisionKind(); }
90 bool IsEnabled(common::LanguageFeature feature)
const {
91 return languageFeatures_.IsEnabled(feature);
93 template <
typename A>
bool ShouldWarn(A x)
const {
94 return languageFeatures_.ShouldWarn(x);
96 const std::optional<parser::CharBlock> &location()
const {
return location_; }
97 const std::vector<std::string> &searchDirectories()
const {
98 return searchDirectories_;
100 const std::vector<std::string> &intrinsicModuleDirectories()
const {
101 return intrinsicModuleDirectories_;
103 const std::vector<std::string> &implicitUseModules()
const {
104 return implicitUseModules_;
106 const std::string &moduleDirectory()
const {
return moduleDirectory_; }
107 const std::string &moduleFileSuffix()
const {
return moduleFileSuffix_; }
108 bool underscoring()
const {
return underscoring_; }
109 bool warningsAreErrors()
const {
return warningsAreErrors_; }
110 bool debugModuleWriter()
const {
return debugModuleWriter_; }
111 const evaluate::IntrinsicProcTable &intrinsics()
const {
return intrinsics_; }
113 return targetCharacteristics_;
116 return targetCharacteristics_;
118 const std::string &targetTriple()
const {
return targetTriple_; }
119 const std::string &targetFeatures()
const {
return targetFeatures_; }
120 Scope &globalScope() {
return globalScope_; }
121 Scope &intrinsicModulesScope() {
return intrinsicModulesScope_; }
122 Scope *currentHermeticModuleFileScope() {
123 return currentHermeticModuleFileScope_;
125 void set_currentHermeticModuleFileScope(
Scope *scope) {
126 currentHermeticModuleFileScope_ = scope;
132 std::map<const Symbol *, SourceName> &moduleFileOutputRenamings() {
133 return moduleFileOutputRenamings_;
136 SemanticsContext &set_location(
137 const std::optional<parser::CharBlock> &location) {
138 location_ = location;
141 SemanticsContext &set_searchDirectories(
const std::vector<std::string> &x) {
142 searchDirectories_ = x;
145 SemanticsContext &set_intrinsicModuleDirectories(
146 const std::vector<std::string> &x) {
147 intrinsicModuleDirectories_ = x;
150 SemanticsContext &set_implicitUseModules(
const std::vector<std::string> &x) {
151 implicitUseModules_ = x;
154 SemanticsContext &set_moduleDirectory(
const std::string &x) {
155 moduleDirectory_ = x;
158 SemanticsContext &set_moduleFileSuffix(
const std::string &x) {
159 moduleFileSuffix_ = x;
162 SemanticsContext &set_underscoring(
bool x) {
166 SemanticsContext &set_warnOnNonstandardUsage(
bool x) {
167 warnOnNonstandardUsage_ = x;
170 SemanticsContext &set_maxErrors(
size_t x) {
174 SemanticsContext &set_warningsAreErrors(
bool x) {
175 warningsAreErrors_ = x;
178 SemanticsContext &set_debugModuleWriter(
bool x) {
179 debugModuleWriter_ = x;
182 SemanticsContext &set_openAccDefaultNoneScalarsStrictDisableOption(
184 openAccDefaultNoneScalarsStrictDisableOption_ = std::move(x);
187 SemanticsContext &set_targetTriple(
const std::string &x) {
191 SemanticsContext &set_targetFeatures(
const std::string &x) {
196 const DeclTypeSpec &MakeNumericType(TypeCategory,
int kind = 0);
199 std::size_t maxErrors()
const {
return maxErrors_; }
201 bool AnyFatalError()
const;
204 bool HasError(
const Symbol &);
205 bool HasError(
const Symbol *);
207 void SetError(
const Symbol &,
bool =
true);
211 return messages_.Say(*location_, std::forward<A>(args)...);
213 template <
typename... A>
215 return messages_.Say(at, std::forward<A>(args)...);
218 return messages_.Say(std::move(msg));
220 template <
typename... A>
224 auto &message{Say(at, std::move(msg), args...)};
225 evaluate::AttachDeclaration(&message, symbol);
229 template <
typename... A>
232 return messages.Warn(IsInModuleFile(at), languageFeatures_, feature, at,
233 std::forward<A>(args)...);
235 template <
typename... A>
238 return messages.Warn(IsInModuleFile(at), languageFeatures_, warning, at,
239 std::forward<A>(args)...);
241 template <
typename... A>
244 return messages.Warn(IsInModuleFile(at), languageFeatures_, feature, at,
245 std::forward<A>(args)...);
247 template <
typename... A>
250 return messages.Warn(IsInModuleFile(at), languageFeatures_, warning, at,
251 std::forward<A>(args)...);
253 template <
typename... A>
255 common::LanguageFeature feature, A &&...args) {
256 return messages.Warn(IsInModuleFile(messages.at()), languageFeatures_,
257 feature, messages.at(), std::forward<A>(args)...);
259 template <
typename... A>
261 common::UsageWarning warning, A &&...args) {
262 return messages.Warn(IsInModuleFile(messages.at()), languageFeatures_,
263 warning, messages.at(), std::forward<A>(args)...);
265 template <
typename... A>
268 return Warn(messages_, feature, at, std::forward<A>(args)...);
270 template <
typename... A>
273 return Warn(messages_, warning, at, std::forward<A>(args)...);
275 template <
typename... A>
278 return Warn(feature, *location_, std::forward<A>(args)...);
280 template <
typename... A>
283 return Warn(warning, *location_, std::forward<A>(args)...);
286 void EmitMessages(llvm::raw_ostream &);
291 void DumpScopeIndex(llvm::raw_ostream &)
const;
295 const ConstructStack &constructStack()
const {
return constructStack_; }
296 template <
typename N>
void PushConstruct(
const N &node) {
297 constructStack_.emplace_back(&node);
301 ENUM_CLASS(IndexVarKind, DO, FORALL)
308 void ActivateIndexVar(
const parser::Name &, IndexVarKind);
310 SymbolVector GetIndexVars(IndexVarKind);
311 SourceName SaveTempName(std::string &&);
312 SourceName GetTempName(
const Scope &);
313 static bool IsTempName(
const std::string &);
316 Scope *GetBuiltinModule(
const char *name);
319 void UseFortranBuiltinsModule();
320 const Scope *GetBuiltinsScope()
const {
return builtinsScope_; }
324 const Scope *GetCUDABuiltinsScope();
325 const Scope *GetCUDADeviceScope();
327 void UsePPCBuiltinTypesModule();
328 void UsePPCBuiltinsModule();
329 Scope *GetPPCBuiltinTypesScope() {
return ppcBuiltinTypesScope_; }
330 const Scope *GetPPCBuiltinsScope()
const {
return ppcBuiltinsScope_; }
334 parser::Program &SaveParseTree(parser::Program &&);
342 void MapCommonBlockAndCheckConflicts(
const Symbol &);
358 CommonBlockList GetCommonBlocks()
const;
360 void NoteDefinedSymbol(
const Symbol &);
361 bool IsSymbolDefined(
const Symbol &)
const;
362 void NoteUsedSymbol(
const Symbol &);
363 void NoteUsedSymbols(
const UnorderedSymbolSet &);
364 bool IsSymbolUsed(
const Symbol &)
const;
369 accObjectDuplicates_.insert(o);
372 return accObjectDuplicates_.count(o) != 0;
375 void DumpSymbols(llvm::raw_ostream &);
381 struct ScopeIndexComparator {
385 std::multimap<parser::CharBlock, Scope &, ScopeIndexComparator>;
390 void CheckError(
const Symbol &);
396 std::string openAccDefaultNoneScalarsStrictDisableOption_;
397 std::optional<parser::CharBlock> location_;
398 std::vector<std::string> searchDirectories_;
399 std::vector<std::string> intrinsicModuleDirectories_;
400 std::vector<std::string> implicitUseModules_;
401 std::string moduleDirectory_{
"."s};
402 std::string moduleFileSuffix_{
".mod"};
403 std::string targetTriple_;
404 std::string targetFeatures_;
405 bool underscoring_{
true};
406 bool warnOnNonstandardUsage_{
false};
407 bool warningsAreErrors_{
false};
408 bool debugModuleWriter_{
false};
409 const evaluate::IntrinsicProcTable intrinsics_;
412 Scope &intrinsicModulesScope_;
413 Scope *currentHermeticModuleFileScope_{
nullptr};
414 ScopeIndex scopeIndex_;
416 std::size_t maxErrors_{0};
418 ConstructStack constructStack_;
419 struct IndexVarInfo {
423 std::map<SymbolRef, const IndexVarInfo, SymbolAddressCompare>
425 UnorderedSymbolSet errorSymbols_;
426 std::set<std::string> tempNames_;
427 const Scope *builtinsScope_{
nullptr};
428 Scope *ppcBuiltinTypesScope_{
nullptr};
429 std::optional<const Scope *> cudaBuiltinsScope_;
430 std::optional<const Scope *> cudaDeviceScope_;
431 const Scope *ppcBuiltinsScope_{
nullptr};
432 std::list<parser::Program> modFileParseTrees_;
433 std::unique_ptr<CommonBlockMap> commonBlockMap_;
435 std::map<const Symbol *, SourceName> moduleFileOutputRenamings_;
436 UnorderedSymbolSet isDefined_;
437 UnorderedSymbolSet isUsed_;
438 std::set<const parser::AccObject *> accObjectDuplicates_;
439 std::list<ProgramTree> programTrees_;