Skip to content

[Flang] Compilation abnormally terminates when one procedure-entity-name specified in duplicate in two different procedure-declaration-stmt #123538

@ohno-fj

Description

@ohno-fj
Version of flang : 20.0.0(f5a35a31bfe6cbc16bec0c130f2bb3632dbf1fbf)/AArch64

The attached program is incorrect.
When one procedure-entity-name (ifunb) is specified in duplicate in two different procedure-declaration-stmt, a compilation terminates abnormally.
Gfortran and ifx detect errors during compilation.

The following are the test program, Flang, Gfortran and ifx compilation/execution result.

snf_err_pointer_ivl_119_.f90:

program main
  call sub1()
  print *,'pass'
end program main

subroutine sub1()
  intrinsic :: sin,tan
  procedure() ,pointer :: isub=>sub1
  procedure() ,pointer :: ifunb=>tan
  procedure(integer) ,pointer :: ifunb=>tan
end subroutine sub1
$ flang snf_err_pointer_ivl_119_.f90

fatal internal error: CHECK(!details.init()) failed at /work/groups/ssoft/compiler/llvm/src/llvm-main/flang/lib/Semantics/resolve-names.cpp(8407)
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Program arguments: /work/groups/ssoft/compiler/llvm/aarch64/main-20250113-f5a35a31bfe6/bin/flang -fc1 -triple aarch64-unknown-linux-gnu -emit-obj -mrelocation-model pic -pic-level 2 -pic-is-pie -target-cpu generic -target-feature +outline-atomics -target-feature +v8a -target-feature +fp-armv8 -target-feature
 +neon -resource-dir /work/groups/ssoft/compiler/llvm/aarch64/main-20250113-f5a35a31bfe6/lib/clang/20 -mframe-pointer=non-leaf -o /tmp/snf_err_pointer_ivl_119_-ee7ca5.o -x f95-cpp-input snf_err_pointer_ivl_119_.f90
 #0 0x0000400021cb71a0 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/work/groups/ssoft/compiler/llvm/aarch64/main-latest/lib/libLLVM.so.20.0git+0x59e71a0)
 #1 0x0000400021cb5228 llvm::sys::RunSignalHandlers() (/work/groups/ssoft/compiler/llvm/aarch64/main-latest/lib/libLLVM.so.20.0git+0x59e5228)
 #2 0x0000400021cb5380 SignalHandler(int) Signals.cpp:0:0
 #3 0x00004000172f07a0 (linux-vdso.so.1+0x7a0)
 #4 0x0000400026b36274 raise (/lib64/libc.so.6+0x36274)
 #5 0x0000400026b20a2c abort (/lib64/libc.so.6+0x20a2c)
 #6 0x0000000006d9de34 (/work/groups/ssoft/compiler/llvm/aarch64/main-20250113-f5a35a31bfe6/bin/flang+0x6d9de34)
 #7 0x0000000005f401cc Fortran::semantics::DeclarationVisitor::PointerInitialization(Fortran::parser::Name const&, Fortran::parser::ProcPointerInit const&) (/work/groups/ssoft/compiler/llvm/aarch64/main-20250113-f5a35a31bfe6/bin/flang+0x5f401cc)
 #8 0x0000000005f402a8 std::__detail::__variant::__gen_vtable_impl<std::__detail::__variant::_Multi_array<void (*)(void Fortran::parser::detail::ParseTreeVisitorLookupScope::Walk<Fortran::semantics::DeferredCheckVisitor, Fortran::common::Indirection<Fortran::parser::DerivedTypeDef, false>, Fortran::common::Indirecti
on<Fortran::parser::EnumDef, false>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::GenericStmt, false>>, Fortran::common::Indirection<Fortran::parser::InterfaceBlock, false>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::ParameterStmt, false>>, Fortran::parser::S
tatement<Fortran::common::Indirection<Fortran::parser::OldParameterStmt, false>>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::ProcedureDeclarationStmt, false>>, Fortran::parser::Statement<Fortran::parser::OtherSpecificationStmt>, Fortran::parser::Statement<Fortran::common::Indirection<Fo
rtran::parser::TypeDeclarationStmt, false>>, Fortran::common::Indirection<Fortran::parser::StructureDef, false>, Fortran::common::Indirection<Fortran::parser::OpenACCDeclarativeConstruct, false>, Fortran::common::Indirection<Fortran::parser::OpenMPDeclarativeConstruct, false>, Fortran::common::Indirection<Fortran::p
arser::CompilerDirective, false>>(std::variant<Fortran::common::Indirection<Fortran::parser::DerivedTypeDef, false>, Fortran::common::Indirection<Fortran::parser::EnumDef, false>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::GenericStmt, false>>, Fortran::common::Indirection<Fortran::pars
er::InterfaceBlock, false>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::ParameterStmt, false>>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::OldParameterStmt, false>>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::ProcedureDeclaratio
nStmt, false>>, Fortran::parser::Statement<Fortran::parser::OtherSpecificationStmt>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::TypeDeclarationStmt, false>>, Fortran::common::Indirection<Fortran::parser::StructureDef, false>, Fortran::common::Indirection<Fortran::parser::OpenACCDeclarat
iveConstruct, false>, Fortran::common::Indirection<Fortran::parser::OpenMPDeclarativeConstruct, false>, Fortran::common::Indirection<Fortran::parser::CompilerDirective, false>> const&, Fortran::semantics::DeferredCheckVisitor&)::'lambda'(Fortran::semantics::DeferredCheckVisitor const&)&&, std::variant<Fortran::commo
n::Indirection<Fortran::parser::DerivedTypeDef, false>, Fortran::common::Indirection<Fortran::parser::EnumDef, false>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::GenericStmt, false>>, Fortran::common::Indirection<Fortran::parser::InterfaceBlock, false>, Fortran::parser::Statement<Fortra
n::common::Indirection<Fortran::parser::ParameterStmt, false>>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::OldParameterStmt, false>>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::ProcedureDeclarationStmt, false>>, Fortran::parser::Statement<Fortran::parser::O
therSpecificationStmt>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::TypeDeclarationStmt, false>>, Fortran::common::Indirection<Fortran::parser::StructureDef, false>, Fortran::common::Indirection<Fortran::parser::OpenACCDeclarativeConstruct, false>, Fortran::common::Indirection<Fortran::p
arser::OpenMPDeclarativeConstruct, false>, Fortran::common::Indirection<Fortran::parser::CompilerDirective, false>> const&)>, std::tuple<std::variant<Fortran::common::Indirection<Fortran::parser::DerivedTypeDef, false>, Fortran::common::Indirection<Fortran::parser::EnumDef, false>, Fortran::parser::Statement<Fortran
::common::Indirection<Fortran::parser::GenericStmt, false>>, Fortran::common::Indirection<Fortran::parser::InterfaceBlock, false>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::ParameterStmt, false>>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::OldParameterStmt
, false>>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::ProcedureDeclarationStmt, false>>, Fortran::parser::Statement<Fortran::parser::OtherSpecificationStmt>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::TypeDeclarationStmt, false>>, Fortran::common::Indirecti
on<Fortran::parser::StructureDef, false>, Fortran::common::Indirection<Fortran::parser::OpenACCDeclarativeConstruct, false>, Fortran::common::Indirection<Fortran::parser::OpenMPDeclarativeConstruct, false>, Fortran::common::Indirection<Fortran::parser::CompilerDirective, false>> const&>, std::integer_sequence<unsign
ed long, 6ul>>::__visit_invoke(void Fortran::parser::detail::ParseTreeVisitorLookupScope::Walk<Fortran::semantics::DeferredCheckVisitor, Fortran::common::Indirection<Fortran::parser::DerivedTypeDef, false>, Fortran::common::Indirection<Fortran::parser::EnumDef, false>, Fortran::parser::Statement<Fortran::common::Ind
irection<Fortran::parser::GenericStmt, false>>, Fortran::common::Indirection<Fortran::parser::InterfaceBlock, false>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::ParameterStmt, false>>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::OldParameterStmt, false>>, Fo
rtran::parser::Statement<Fortran::common::Indirection<Fortran::parser::ProcedureDeclarationStmt, false>>, Fortran::parser::Statement<Fortran::parser::OtherSpecificationStmt>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::TypeDeclarationStmt, false>>, Fortran::common::Indirection<Fortran::p
arser::StructureDef, false>, Fortran::common::Indirection<Fortran::parser::OpenACCDeclarativeConstruct, false>, Fortran::common::Indirection<Fortran::parser::OpenMPDeclarativeConstruct, false>, Fortran::common::Indirection<Fortran::parser::CompilerDirective, false>>(std::variant<Fortran::common::Indirection<Fortran:
:parser::DerivedTypeDef, false>, Fortran::common::Indirection<Fortran::parser::EnumDef, false>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::GenericStmt, false>>, Fortran::common::Indirection<Fortran::parser::InterfaceBlock, false>, Fortran::parser::Statement<Fortran::common::Indirection<
Fortran::parser::ParameterStmt, false>>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::OldParameterStmt, false>>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::ProcedureDeclarationStmt, false>>, Fortran::parser::Statement<Fortran::parser::OtherSpecificationStmt>,
 Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::TypeDeclarationStmt, false>>, Fortran::common::Indirection<Fortran::parser::StructureDef, false>, Fortran::common::Indirection<Fortran::parser::OpenACCDeclarativeConstruct, false>, Fortran::common::Indirection<Fortran::parser::OpenMPDeclarativ
eConstruct, false>, Fortran::common::Indirection<Fortran::parser::CompilerDirective, false>> const&, Fortran::semantics::DeferredCheckVisitor&)::'lambda'(Fortran::semantics::DeferredCheckVisitor const&)&&, std::variant<Fortran::common::Indirection<Fortran::parser::DerivedTypeDef, false>, Fortran::common::Indirection
<Fortran::parser::EnumDef, false>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::GenericStmt, false>>, Fortran::common::Indirection<Fortran::parser::InterfaceBlock, false>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::ParameterStmt, false>>, Fortran::parser::Sta
tement<Fortran::common::Indirection<Fortran::parser::OldParameterStmt, false>>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::ProcedureDeclarationStmt, false>>, Fortran::parser::Statement<Fortran::parser::OtherSpecificationStmt>, Fortran::parser::Statement<Fortran::common::Indirection<Fort
ran::parser::TypeDeclarationStmt, false>>, Fortran::common::Indirection<Fortran::parser::StructureDef, false>, Fortran::common::Indirection<Fortran::parser::OpenACCDeclarativeConstruct, false>, Fortran::common::Indirection<Fortran::parser::OpenMPDeclarativeConstruct, false>, Fortran::common::Indirection<Fortran::par
ser::CompilerDirective, false>> const&) (/work/groups/ssoft/compiler/llvm/aarch64/main-20250113-f5a35a31bfe6/bin/flang+0x5f402a8)
 #9 0x0000000005eef1f4 std::__detail::__variant::__gen_vtable_impl<std::__detail::__variant::_Multi_array<void (*)(void Fortran::parser::detail::ParseTreeVisitorLookupScope::Walk<Fortran::semantics::DeferredCheckVisitor, Fortran::parser::SpecificationConstruct, Fortran::parser::Statement<Fortran::common::Indirection
<Fortran::parser::DataStmt, false>>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::FormatStmt, false>>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::EntryStmt, false>>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::StmtFunctionStmt, fa
lse>>, Fortran::parser::ErrorRecovery>(std::variant<Fortran::parser::SpecificationConstruct, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::DataStmt, false>>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::FormatStmt, false>>, Fortran::parser::Statement<Fortran::co
mmon::Indirection<Fortran::parser::EntryStmt, false>>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::StmtFunctionStmt, false>>, Fortran::parser::ErrorRecovery> const&, Fortran::semantics::DeferredCheckVisitor&)::'lambda'(Fortran::semantics::DeferredCheckVisitor const&)&&, std::variant<Fort
ran::parser::SpecificationConstruct, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::DataStmt, false>>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::FormatStmt, false>>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::EntryStmt, false>>, F
ortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::StmtFunctionStmt, false>>, Fortran::parser::ErrorRecovery> const&)>, std::tuple<std::variant<Fortran::parser::SpecificationConstruct, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::DataStmt, false>>, Fortran::parser::St
atement<Fortran::common::Indirection<Fortran::parser::FormatStmt, false>>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::EntryStmt, false>>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::StmtFunctionStmt, false>>, Fortran::parser::ErrorRecovery> const&>, std::int
eger_sequence<unsigned long, 0ul>>::__visit_invoke(void Fortran::parser::detail::ParseTreeVisitorLookupScope::Walk<Fortran::semantics::DeferredCheckVisitor, Fortran::parser::SpecificationConstruct, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::DataStmt, false>>, Fortran::parser::Statement<
Fortran::common::Indirection<Fortran::parser::FormatStmt, false>>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::EntryStmt, false>>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::StmtFunctionStmt, false>>, Fortran::parser::ErrorRecovery>(std::variant<Fortran::par
ser::SpecificationConstruct, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::DataStmt, false>>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::FormatStmt, false>>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::EntryStmt, false>>, Fortran::
parser::Statement<Fortran::common::Indirection<Fortran::parser::StmtFunctionStmt, false>>, Fortran::parser::ErrorRecovery> const&, Fortran::semantics::DeferredCheckVisitor&)::'lambda'(Fortran::semantics::DeferredCheckVisitor const&)&&, std::variant<Fortran::parser::SpecificationConstruct, Fortran::parser::Statement<
Fortran::common::Indirection<Fortran::parser::DataStmt, false>>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::FormatStmt, false>>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::parser::EntryStmt, false>>, Fortran::parser::Statement<Fortran::common::Indirection<Fortran::
parser::StmtFunctionStmt, false>>, Fortran::parser::ErrorRecovery> const&) (/work/groups/ssoft/compiler/llvm/aarch64/main-20250113-f5a35a31bfe6/bin/flang+0x5eef1f4)
#10 0x0000000005f0fde8 Fortran::semantics::ResolveNamesVisitor::FinishSpecificationParts(Fortran::semantics::ProgramTree const&) (.part.38532) resolve-names.cpp:0:0
#11 0x0000000005f4d870 Fortran::semantics::ResolveNamesVisitor::Pre(Fortran::parser::ProgramUnit const&) (/work/groups/ssoft/compiler/llvm/aarch64/main-20250113-f5a35a31bfe6/bin/flang+0x5f4d870)
#12 0x0000000005f4e134 Fortran::semantics::ResolveNames(Fortran::semantics::SemanticsContext&, Fortran::parser::Program const&, Fortran::semantics::Scope&) (/work/groups/ssoft/compiler/llvm/aarch64/main-20250113-f5a35a31bfe6/bin/flang+0x5f4e134)
#13 0x000000000601291c Fortran::semantics::Semantics::Perform() (/work/groups/ssoft/compiler/llvm/aarch64/main-20250113-f5a35a31bfe6/bin/flang+0x601291c)
#14 0x0000000005860680 Fortran::frontend::FrontendAction::runSemanticChecks() (/work/groups/ssoft/compiler/llvm/aarch64/main-20250113-f5a35a31bfe6/bin/flang+0x5860680)
#15 0x000000000594d214 Fortran::frontend::CodeGenAction::beginSourceFileAction() (/work/groups/ssoft/compiler/llvm/aarch64/main-20250113-f5a35a31bfe6/bin/flang+0x594d214)
#16 0x0000000005862954 Fortran::frontend::FrontendAction::beginSourceFile(Fortran::frontend::CompilerInstance&, Fortran::frontend::FrontendInputFile const&) (/work/groups/ssoft/compiler/llvm/aarch64/main-20250113-f5a35a31bfe6/bin/flang+0x5862954)
#17 0x0000000005852e48 Fortran::frontend::CompilerInstance::executeAction(Fortran::frontend::FrontendAction&) (/work/groups/ssoft/compiler/llvm/aarch64/main-20250113-f5a35a31bfe6/bin/flang+0x5852e48)
#18 0x00000000058671e4 Fortran::frontend::executeCompilerInvocation(Fortran::frontend::CompilerInstance*) (/work/groups/ssoft/compiler/llvm/aarch64/main-20250113-f5a35a31bfe6/bin/flang+0x58671e4)
#19 0x000000000584b620 fc1_main(llvm::ArrayRef<char const*>, char const*) (/work/groups/ssoft/compiler/llvm/aarch64/main-20250113-f5a35a31bfe6/bin/flang+0x584b620)
#20 0x000000000584b078 main (/work/groups/ssoft/compiler/llvm/aarch64/main-20250113-f5a35a31bfe6/bin/flang+0x584b078)
#21 0x0000400026b24384 __libc_start_main (/lib64/libc.so.6+0x24384)
#22 0x0000000005849544 _start (/work/groups/ssoft/compiler/llvm/aarch64/main-20250113-f5a35a31bfe6/bin/flang+0x5849544)
flang-20: error: unable to execute command: Aborted (core dumped)
flang-20: error: flang frontend command failed due to signal (use -v to see invocation)
flang version 20.0.0git (https://github.com/llvm/llvm-project.git f5a35a31bfe6cbc16bec0c130f2bb3632dbf1fbf)
Target: aarch64-unknown-linux-gnu
Thread model: posix
InstalledDir: /work/groups/ssoft/compiler/llvm/aarch64/main-20250113-f5a35a31bfe6/bin
Build config: +assertions
flang-20: note: diagnostic msg:
********************

PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
flang-20: note: diagnostic msg: /tmp/snf_err_pointer_ivl_119_-d2e82b
flang-20: note: diagnostic msg: /tmp/snf_err_pointer_ivl_119_-d2e82b.sh
flang-20: note: diagnostic msg:

********************
$
$ cat /tmp/snf_err_pointer_ivl_119_-d2e82b
#line "./snf_err_pointer_ivl_119_.f90" 1
      program main
      call sub1()
      print *,'pass'
      end program main

      subroutine sub1()
      intrinsic :: sin,tan
      procedure() ,pointer :: isub=>sub1
      procedure() ,pointer :: ifunb=>tan
      procedure(integer) ,pointer :: ifunb=>tan
      end subroutine sub1
$
$ cat /tmp/snf_err_pointer_ivl_119_-d2e82b.sh
# Crash reproducer for clang version 20.0.0git (https://github.com/llvm/llvm-project.git f5a35a31bfe6cbc16bec0c130f2bb3632dbf1fbf)
# Driver args: "snf_err_pointer_ivl_119_.f90"
# Original command:  "/work/groups/ssoft/compiler/llvm/aarch64/main-20250113-f5a35a31bfe6/bin/flang" "-fc1" "-triple" "aarch64-unknown-linux-gnu" "-emit-obj" "-mrelocation-model" "pic" "-pic-level" "2" "-pic-is-pie" "-target-cpu" "generic" "-target-feature" "+outline-atomics" "-target-feature" "+v8a" "-target-featur
e" "+fp-armv8" "-target-feature" "+neon" "-resource-dir" "/work/groups/ssoft/compiler/llvm/aarch64/main-20250113-f5a35a31bfe6/lib/clang/20" "-mframe-pointer=non-leaf" "-o" "/tmp/snf_err_pointer_ivl_119_-ee7ca5.o" "-x" "f95-cpp-input" "snf_err_pointer_ivl_119_.f90"
 "/work/groups/ssoft/compiler/llvm/aarch64/main-20250113-f5a35a31bfe6/bin/flang" "-fc1" "-triple" "aarch64-unknown-linux-gnu" "-emit-obj" "-mrelocation-model" "pic" "-pic-level" "2" "-pic-is-pie" "-target-cpu" "generic" "-target-feature" "+outline-atomics" "-target-feature" "+v8a" "-target-feature" "+fp-armv8" "-tar
get-feature" "+neon" "-mframe-pointer=non-leaf" "-x" "f95-cpp-input" "snf_err_pointer_ivl_119_-d2e82b"
$
$ gfortran snf_err_pointer_ivl_119_.f90
snf_err_pointer_ivl_119_.f90:10:38:

   10 |   procedure(integer) ,pointer :: ifunb=>tan
      |                                      1
Error: Duplicate EXTERNAL attribute specified at (1)
snf_err_pointer_ivl_119_.f90:8:36:

    8 |   procedure() ,pointer :: isub=>sub1
      |                                    1
Warning: Non-RECURSIVE procedure ‘sub1’ at (1) is possibly calling itself recursively.  Declare it RECURSIVE or use ‘-frecursive’
$
$ ifx snf_err_pointer_ivl_119_.f90
snf_err_pointer_ivl_119_.f90(10): error #6406: Conflicting attributes or multiple declaration of name.   [IFUNB]
  procedure(integer) ,pointer :: ifunb=>tan
---------------------------------^
compilation aborted for snf_err_pointer_ivl_119_.f90 (code 1)
$

Metadata

Metadata

Assignees

Labels

crashPrefer [crash-on-valid] or [crash-on-invalid]flang:frontend

Type

Projects

Status

Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions