diff --git a/flang/include/flang/Semantics/semantics.h b/flang/include/flang/Semantics/semantics.h --- a/flang/include/flang/Semantics/semantics.h +++ b/flang/include/flang/Semantics/semantics.h @@ -207,10 +207,9 @@ class Semantics { public: explicit Semantics(SemanticsContext &context, parser::Program &program, - parser::CharBlock charBlock, bool debugModuleWriter = false) + bool debugModuleWriter = false) : context_{context}, program_{program} { context.set_debugModuleWriter(debugModuleWriter); - context.globalScope().AddSourceRange(charBlock); } SemanticsContext &context() const { return context_; } diff --git a/flang/lib/Frontend/FrontendActions.cpp b/flang/lib/Frontend/FrontendActions.cpp --- a/flang/lib/Frontend/FrontendActions.cpp +++ b/flang/lib/Frontend/FrontendActions.cpp @@ -158,7 +158,7 @@ // Prepare semantics setSemantics(std::make_unique( ci.invocation().semanticsContext(), parseTree, - ci.parsing().cooked().AsCharBlock(), ci.invocation().debugModuleDir())); + ci.invocation().debugModuleDir())); auto &semantics = this->semantics(); // Run semantic checks diff --git a/flang/lib/Semantics/check-io.cpp b/flang/lib/Semantics/check-io.cpp --- a/flang/lib/Semantics/check-io.cpp +++ b/flang/lib/Semantics/check-io.cpp @@ -953,8 +953,12 @@ void IoChecker::CheckForPureSubprogram() const { // C1597 CHECK(context_.location()); - if (FindPureProcedureContaining(context_.FindScope(*context_.location()))) { - context_.Say("External I/O is not allowed in a pure subprogram"_err_en_US); + if (const Scope * + scope{context_.globalScope().FindScope(*context_.location())}) { + if (FindPureProcedureContaining(*scope)) { + context_.Say( + "External I/O is not allowed in a pure subprogram"_err_en_US); + } } } diff --git a/flang/lib/Semantics/scope.cpp b/flang/lib/Semantics/scope.cpp --- a/flang/lib/Semantics/scope.cpp +++ b/flang/lib/Semantics/scope.cpp @@ -318,7 +318,7 @@ } void Scope::AddSourceRange(const parser::CharBlock &source) { - for (auto *scope = this; !scope->IsGlobal(); scope = &scope->parent()) { + for (auto *scope{this}; !scope->IsGlobal(); scope = &scope->parent()) { scope->sourceRange_.ExtendToCover(source); } } diff --git a/flang/lib/Semantics/tools.cpp b/flang/lib/Semantics/tools.cpp --- a/flang/lib/Semantics/tools.cpp +++ b/flang/lib/Semantics/tools.cpp @@ -80,8 +80,12 @@ // N.B. We only need to examine the innermost containing program unit // because an internal subprogram of a pure subprogram must also // be pure (C1592). - const Scope &scope{GetProgramUnitContaining(start)}; - return IsPureProcedure(scope) ? &scope : nullptr; + if (start.IsGlobal()) { + return nullptr; + } else { + const Scope &scope{GetProgramUnitContaining(start)}; + return IsPureProcedure(scope) ? &scope : nullptr; + } } static bool MightHaveCompatibleDerivedtypes( diff --git a/flang/tools/f18/f18.cpp b/flang/tools/f18/f18.cpp --- a/flang/tools/f18/f18.cpp +++ b/flang/tools/f18/f18.cpp @@ -253,8 +253,8 @@ if (!driver.debugNoSemantics || driver.dumpSymbols || driver.dumpUnparseWithSymbols || driver.getDefinition || driver.getSymbolsSources) { - Fortran::semantics::Semantics semantics{semanticsContext, parseTree, - parsing.cooked().AsCharBlock(), driver.debugModuleWriter}; + Fortran::semantics::Semantics semantics{ + semanticsContext, parseTree, driver.debugModuleWriter}; semantics.Perform(); Fortran::semantics::RuntimeDerivedTypeTables tables; if (!semantics.AnyFatalError()) {