[flang-commits] [flang] [flang] Fix crash resolving interface procedure type. (PR #162205)

Valery Dmitriev via flang-commits flang-commits at lists.llvm.org
Tue Oct 7 10:52:53 PDT 2025


https://github.com/valerydmit updated https://github.com/llvm/llvm-project/pull/162205

>From d0160680e43e6e3f39dc90f746cda3b843640d2e Mon Sep 17 00:00:00 2001
From: Valery Dmitriev <valeryd at nvidia.com>
Date: Mon, 6 Oct 2025 17:13:55 -0700
Subject: [PATCH 1/2] [flang] Fix crash resolving interface procedure type.

When generic interface name shadows specific, bypass
to specific procedure while resolving its type.
---
 flang/include/flang/Semantics/symbol.h        |  3 +++
 .../Inputs/generic-shadows-specific-a.f90     | 21 +++++++++++++++++++
 .../Semantics/generic-shadows-specific-b.f90  | 13 ++++++++++++
 3 files changed, 37 insertions(+)
 create mode 100644 flang/test/Semantics/Inputs/generic-shadows-specific-a.f90
 create mode 100644 flang/test/Semantics/generic-shadows-specific-b.f90

diff --git a/flang/include/flang/Semantics/symbol.h b/flang/include/flang/Semantics/symbol.h
index 975423b32da73..98e2a5fe88da4 100644
--- a/flang/include/flang/Semantics/symbol.h
+++ b/flang/include/flang/Semantics/symbol.h
@@ -1126,6 +1126,9 @@ inline const DeclTypeSpec *Symbol::GetTypeImpl(int depth) const {
           [&](const HostAssocDetails &x) {
             return x.symbol().GetTypeImpl(depth);
           },
+          [&](const GenericDetails &x) {
+            return x.specific() ? x.specific()->GetTypeImpl(depth) : nullptr;
+          },
           [](const auto &) -> const DeclTypeSpec * { return nullptr; },
       },
       details_);
diff --git a/flang/test/Semantics/Inputs/generic-shadows-specific-a.f90 b/flang/test/Semantics/Inputs/generic-shadows-specific-a.f90
new file mode 100644
index 0000000000000..bf3c6d464c7dd
--- /dev/null
+++ b/flang/test/Semantics/Inputs/generic-shadows-specific-a.f90
@@ -0,0 +1,21 @@
+! these modules must be read from  module files
+module m1
+  interface f ! reference must be to generic
+    module procedure f ! must have same name as generic interface
+  end interface
+ contains
+  character function f() ! must be character
+    f = 'q'
+  end
+end
+module m2
+   use m1
+end
+module m3
+   use m2 ! must be m2, not m1
+ contains
+   subroutine mustExist() ! not called, but must exist
+     character x
+     x = f()
+   end
+end
diff --git a/flang/test/Semantics/generic-shadows-specific-b.f90 b/flang/test/Semantics/generic-shadows-specific-b.f90
new file mode 100644
index 0000000000000..d1dcefc7499a0
--- /dev/null
+++ b/flang/test/Semantics/generic-shadows-specific-b.f90
@@ -0,0 +1,13 @@
+! Check that expected code produced with no crash.
+subroutine reproducer()
+  use m2
+  use m3
+  character x
+  x = f()
+end
+
+! RUN: %flang_fc1 -fsyntax-only %S/Inputs/generic-shadows-specific-a.f90
+! RUN: bbc -emit-fir -o - %s | FileCheck %s
+
+! CHECK-LABEL: func.func @_QPreproducer
+! CHECK: fir.call @_QMm1Pf

>From 370e673ba81c70e62c3065bdaab420fb9192dd21 Mon Sep 17 00:00:00 2001
From: Valery Dmitriev <valeryd at nvidia.com>
Date: Tue, 7 Oct 2025 10:51:19 -0700
Subject: [PATCH 2/2] Update test and place it into Lower.

---
 flang/test/Lower/generic-shadows-specific.F90 | 40 +++++++++++++++++++
 .../Inputs/generic-shadows-specific-a.f90     | 21 ----------
 .../Semantics/generic-shadows-specific-b.f90  | 13 ------
 3 files changed, 40 insertions(+), 34 deletions(-)
 create mode 100644 flang/test/Lower/generic-shadows-specific.F90
 delete mode 100644 flang/test/Semantics/Inputs/generic-shadows-specific-a.f90
 delete mode 100644 flang/test/Semantics/generic-shadows-specific-b.f90

diff --git a/flang/test/Lower/generic-shadows-specific.F90 b/flang/test/Lower/generic-shadows-specific.F90
new file mode 100644
index 0000000000000..e72190884db13
--- /dev/null
+++ b/flang/test/Lower/generic-shadows-specific.F90
@@ -0,0 +1,40 @@
+
+#if STEP == 1
+! these modules must be read from  module files
+module generic_shadows_specific_m1
+  interface f ! reference must be to generic
+    module procedure f ! must have same name as generic interface
+  end interface
+ contains
+  character function f() ! must be character
+    f = 'q'
+  end
+end
+module generic_shadows_specific_m2
+   use generic_shadows_specific_m1
+end
+module generic_shadows_specific_m3
+   use generic_shadows_specific_m2 ! must be generic_shadows_specific_m2, not generic_shadows_specific_m1
+ contains
+   subroutine mustExist() ! not called, but must exist
+     character x
+     x = f()
+   end
+end
+
+#else
+! Check that expected code produced with no crash.
+subroutine reproducer()
+  use generic_shadows_specific_m2
+  use generic_shadows_specific_m3
+  character x
+  x = f()
+end
+#endif
+
+!RUN: rm -rf %t && mkdir -p %t
+!RUN: %flang_fc1 -fsyntax-only -DSTEP=1 -J%t %s
+!RUN: %flang_fc1 -emit-fir -J%t -o - %s | FileCheck %s
+
+!CHECK-LABEL: func.func @_QPreproducer
+!CHECK: fir.call @_QMgeneric_shadows_specific_m1Pf
diff --git a/flang/test/Semantics/Inputs/generic-shadows-specific-a.f90 b/flang/test/Semantics/Inputs/generic-shadows-specific-a.f90
deleted file mode 100644
index bf3c6d464c7dd..0000000000000
--- a/flang/test/Semantics/Inputs/generic-shadows-specific-a.f90
+++ /dev/null
@@ -1,21 +0,0 @@
-! these modules must be read from  module files
-module m1
-  interface f ! reference must be to generic
-    module procedure f ! must have same name as generic interface
-  end interface
- contains
-  character function f() ! must be character
-    f = 'q'
-  end
-end
-module m2
-   use m1
-end
-module m3
-   use m2 ! must be m2, not m1
- contains
-   subroutine mustExist() ! not called, but must exist
-     character x
-     x = f()
-   end
-end
diff --git a/flang/test/Semantics/generic-shadows-specific-b.f90 b/flang/test/Semantics/generic-shadows-specific-b.f90
deleted file mode 100644
index d1dcefc7499a0..0000000000000
--- a/flang/test/Semantics/generic-shadows-specific-b.f90
+++ /dev/null
@@ -1,13 +0,0 @@
-! Check that expected code produced with no crash.
-subroutine reproducer()
-  use m2
-  use m3
-  character x
-  x = f()
-end
-
-! RUN: %flang_fc1 -fsyntax-only %S/Inputs/generic-shadows-specific-a.f90
-! RUN: bbc -emit-fir -o - %s | FileCheck %s
-
-! CHECK-LABEL: func.func @_QPreproducer
-! CHECK: fir.call @_QMm1Pf



More information about the flang-commits mailing list