diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp index e0a8246ebc752..4b8cd447bcf19 100644 --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -4787,10 +4787,13 @@ void DeclarationVisitor::Post(const parser::EntityDecl &x) { } else if (attrs.test(Attr::PARAMETER)) { // C882, C883 Say(name, "Missing initialization for parameter '%s'"_err_en_US); } - if (auto *scopeSymbol{currScope().symbol()}) - if (auto *details{scopeSymbol->detailsIf()}) - if (details->isDECStructure()) + if (auto *scopeSymbol{currScope().symbol()}) { + if (auto *details{scopeSymbol->detailsIf()}) { + if (details->isDECStructure()) { details->add_component(symbol); + } + } + } } void DeclarationVisitor::Post(const parser::PointerDecl &x) { @@ -7660,10 +7663,54 @@ class ExecutionPartSkimmerBase { --blockDepth_; PopScope(); } + // Note declarations of local names in BLOCK constructs. + // Don't have to worry about INTENT(), VALUE, or OPTIONAL + // (pertinent only to dummy arguments), ASYNCHRONOUS/VOLATILE, + // or accessibility attributes, bool Pre(const parser::EntityDecl &x) { Hide(std::get(x.t)); return true; } + bool Pre(const parser::ObjectDecl &x) { + Hide(std::get(x.t)); + return true; + } + bool Pre(const parser::PointerDecl &x) { + Hide(std::get(x.t)); + return true; + } + bool Pre(const parser::BindEntity &x) { + Hide(std::get(x.t)); + return true; + } + bool Pre(const parser::ContiguousStmt &x) { + for (const parser::Name &name : x.v) { + Hide(name); + } + return true; + } + bool Pre(const parser::DimensionStmt::Declaration &x) { + Hide(std::get(x.t)); + return true; + } + bool Pre(const parser::ExternalStmt &x) { + for (const parser::Name &name : x.v) { + Hide(name); + } + return true; + } + bool Pre(const parser::IntrinsicStmt &x) { + for (const parser::Name &name : x.v) { + Hide(name); + } + return true; + } + bool Pre(const parser::CodimensionStmt &x) { + for (const parser::CodimensionDecl &decl : x.v) { + Hide(std::get(decl.t)); + } + return true; + } void Post(const parser::ImportStmt &x) { if (x.kind == common::ImportKind::None || x.kind == common::ImportKind::Only) { diff --git a/flang/test/Semantics/bug115674.f90 b/flang/test/Semantics/bug115674.f90 new file mode 100644 index 0000000000000..87c527bb4297a --- /dev/null +++ b/flang/test/Semantics/bug115674.f90 @@ -0,0 +1,9 @@ +!RUN: %flang_fc1 -fsyntax-only %s 2>&1 | FileCheck --allow-empty %s +!CHECK-NOT: error: +program main + sin = 1 + block + intrinsic sin + print *, sin(0.) + end block +end