[flang-commits] [flang] 615977a - [flang] Fix name resolution bug (#158749)
via flang-commits
flang-commits at lists.llvm.org
Wed Sep 17 09:15:16 PDT 2025
Author: Peter Klausler
Date: 2025-09-17T09:15:13-07:00
New Revision: 615977a5bc63fc346d35dff68f69a64be6822301
URL: https://github.com/llvm/llvm-project/commit/615977a5bc63fc346d35dff68f69a64be6822301
DIFF: https://github.com/llvm/llvm-project/commit/615977a5bc63fc346d35dff68f69a64be6822301.diff
LOG: [flang] Fix name resolution bug (#158749)
When the current scope is an implied DO loop nested within a derived
type declaration, it is possible for name resolution to mistakenly
resolve a name to a component rather than to a name in the outer scope.
Fix.
Fixes https://github.com/llvm/llvm-project/issues/158412.
Added:
flang/test/Semantics/resolve127.f90
Modified:
flang/lib/Semantics/resolve-names.cpp
Removed:
################################################################################
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index 077bee930675e..d0d3b0e1caa5a 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -2994,12 +2994,20 @@ Symbol *ScopeHandler::FindSymbol(const Scope &scope, const parser::Name &name) {
}
}
return FindSymbol(scope.parent(), name);
- } else {
+ } else if (scope.kind() == Scope::Kind::ImpliedDos) {
+ if (Symbol * symbol{FindInScope(scope, name)}) {
+ return Resolve(name, symbol);
+ } else {
+ // Don't use scope.FindSymbol() as below, since implied DO scopes
+ // can be parts of initializers in derived type components.
+ return FindSymbol(scope.parent(), name);
+ }
+ } else if (inEquivalenceStmt_) {
// In EQUIVALENCE statements only resolve names in the local scope, see
// 19.5.1.4, paragraph 2, item (10)
- return Resolve(name,
- inEquivalenceStmt_ ? FindInScope(scope, name)
- : scope.FindSymbol(name.source));
+ return Resolve(name, FindInScope(scope, name));
+ } else {
+ return Resolve(name, scope.FindSymbol(name.source));
}
}
@@ -8722,7 +8730,6 @@ const parser::Name *DeclarationVisitor::ResolveName(const parser::Name &name) {
return &name;
}
}
-
if (CheckForHostAssociatedImplicit(name)) {
NotePossibleBadForwardRef(name);
return &name;
diff --git a/flang/test/Semantics/resolve127.f90 b/flang/test/Semantics/resolve127.f90
new file mode 100644
index 0000000000000..e1dacf628426e
--- /dev/null
+++ b/flang/test/Semantics/resolve127.f90
@@ -0,0 +1,7 @@
+!RUN: %flang_fc1 -fdebug-unparse %s 2>&1 | FileCheck %s
+double precision, parameter :: x = 1.0d0
+type t
+ !CHECK: REAL :: x(1_4) = [INTEGER(4)::8_4]
+ real :: x(1) = [(kind(x),j=1,1)]
+end type
+end
More information about the flang-commits
mailing list