[flang-commits] [flang] [Flang] Avoid crash on invalid EQUIVALENCE objects (PR #215979)

via flang-commits flang-commits at lists.llvm.org
Thu Aug 13 01:02:13 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-flang-semantics

Author: nudt_yixiao (keepyixiao)

<details>
<summary>Changes</summary>

An invalid EQUIVALENCE statement may introduce a symbol that is not a data object into later offset computation. ComputeOffsetsHelper assumes such symbols have ObjectEntityDetails when assigning COMMON block information, which can cause a crash after a semantic error.

Check for ObjectEntityDetails before accessing object-specific information to keep error recovery paths safe.

Test coverage
- Add a regression test for using a subroutine name as an EQUIVALENCE object.

Tests:
- llvm-lit -v flang/test/Semantics/equivalence-non-data-object.f90

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


2 Files Affected:

- (modified) flang/lib/Semantics/compute-offsets.cpp (+3-1) 
- (added) flang/test/Semantics/equivalence-non-data-object.f90 (+7) 


``````````diff
diff --git a/flang/lib/Semantics/compute-offsets.cpp b/flang/lib/Semantics/compute-offsets.cpp
index 3a355f040b865..a97c4ec0c0093 100644
--- a/flang/lib/Semantics/compute-offsets.cpp
+++ b/flang/lib/Semantics/compute-offsets.cpp
@@ -212,7 +212,9 @@ void ComputeOffsetsHelper::Compute(Scope &scope) {
   for (auto &[symbol, dep] : dependents_) {
     symbol->set_offset(dep.symbol->offset() + dep.offset);
     if (const auto *block{FindCommonBlockContaining(*dep.symbol)}) {
-      symbol->get<ObjectEntityDetails>().set_commonBlock(*block);
+      if (symbol->has<ObjectEntityDetails>()) {
+        symbol->get<ObjectEntityDetails>().set_commonBlock(*block);
+      }
     }
   }
 }
diff --git a/flang/test/Semantics/equivalence-non-data-object.f90 b/flang/test/Semantics/equivalence-non-data-object.f90
new file mode 100644
index 0000000000000..08604eb412729
--- /dev/null
+++ b/flang/test/Semantics/equivalence-non-data-object.f90
@@ -0,0 +1,7 @@
+! RUN: %python %S/test_errors.py %s %flang_fc1
+
+subroutine test3()
+  common /blk/ k1
+  ! ERROR: 'test3' in equivalence set is not a data object
+  equivalence(i1, TEST3, k1) 
+end subroutine test3
\ No newline at end of file

``````````

</details>


https://github.com/llvm/llvm-project/pull/215979


More information about the flang-commits mailing list