From d0160680e43e6e3f39dc90f746cda3b843640d2e Mon Sep 17 00:00:00 2001 From: Valery Dmitriev 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 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