Skip to content

Conversation

klausler
Copy link
Contributor

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 #158412.

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 llvm#158412.
@llvmbot llvmbot added flang Flang issues not falling into any other category flang:semantics labels Sep 15, 2025
@llvmbot
Copy link
Member

llvmbot commented Sep 15, 2025

@llvm/pr-subscribers-flang-semantics

Author: Peter Klausler (klausler)

Changes

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 #158412.


Full diff: https://github.com/llvm/llvm-project/pull/158749.diff

2 Files Affected:

  • (modified) flang/lib/Semantics/resolve-names.cpp (+12-5)
  • (added) flang/test/Semantics/resolve127.f90 (+7)
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

@klausler klausler merged commit 615977a into llvm:main Sep 17, 2025
12 checks passed
@klausler klausler deleted the bug158412 branch September 17, 2025 16:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

flang:semantics flang Flang issues not falling into any other category

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Flang] fatal internal error: No error was reported but setting error on: z: ObjectEntity type: COMPLEX

3 participants