[Flang] Assertion failure: assumed type argument in statement function
- Dominant language
- LLVM
- Stars
- 40.5k
- Forks
- 18.7k
- PR merge metrics
- PR metrics pending
Description
## Summary
Flang crashes when statement functions have an argument of assumed type. When Flang is built without assertions, it emits a semantic error instead of crashing.
### Reproducer
* test.f90
```fortran
subroutine sub(a)
type(*)::a
integer::c
integer :: func
func(a) = 1
c=func(a)
end subroutine
```
* commands
```
$ flang --version
flang version 23.0.0git (https://github.com/llvm/llvm-project.git 2301475676b208c555273e7c1ac5d4470d5ee70e)
Target: aarch64-unknown-linux-gnu
Thread model: posix
InstalledDir: /path/to/llvm/build/bin
Build config: +assertions
$ flang test.f90 -c
flang-23: /path/to/llvm-project/flang/lib/Lower/ConvertCall.cpp:935: hlfir::EntityWithAttributes genStmtFunctionRef(mlir::Location, Fortran::lower::AbstractConverter&, Fortran::lower::SymMap&, Fortran::lower::StatementContext&, const Fortran::evaluate::ProcedureRef&): Assertion `expr && "assumed type used as statement function argument"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace and instructions to reproduce the bug.
Stack dump:
0. Program arguments: /path/to/llvm/build/bin/flang-23 -fc1 -triple aarch64-unknown-linux-gnu -emit-obj -fcolor-diagnostics -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 /path/to/llvm/build/lib/clang/23 -fintrinsic-modules-path /path/to/llvm/build/lib/clang/23/finclude/flang/aarch64-unknown-linux-gnu -mframe-pointer=non-leaf-no-reserve -o test.o -x f95 test.f90
#0 0x0000ffffa39b3130 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/path/to/llvm/build/lib/libLLVM.so.23.0git+0x67a7130)
#1 0x0000ffffa39b0438 llvm::sys::RunSignalHandlers() (/path/to/llvm/build/lib/libLLVM.so.23.0git+0x67a4438)
#2 0x0000ffffa39b05a8 SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
#3 0x0000ffffb5d7d7f0 (linux-vdso.so.1+0x7f0)
#4 0x0000ffff9ccd4a78 __pthread_kill_implementation (/lib64/libc.so.6+0x82a78)
#5 0x0000ffff9cc8ccfc gsignal (/lib64/libc.so.6+0x3acfc)
#6 0x0000ffff9cc79274 abort (/lib64/libc.so.6+0x27274)
#7 0x0000ffff9cc86694 __assert_fail_base (/lib64/libc.so.6+0x34694)
#8 0x0000ffff9cc866ec (/lib64/libc.so.6+0x346ec)
#9 0x0000000006f10318 genProcedureRef((anonymous namespace)::CallContext&) (.constprop.8259) ConvertCall.cpp:0:0
#10 0x0000000006f11490 Fortran::lower::convertCallToHLFIR(mlir::Location, Fortran::lower::AbstractConverter&, Fortran::evaluate::ProcedureRefconst&, std::optional, Fortran::lower::SymMap&, Fortran::lower::StatementContext&) (/path/to/llvm/build/bin/flang-23+0x6f11490)
#11 0x0000000006f1395c std::__detail::__variant::__gen_vtable_impl>(Fortran::evaluate::Expr> const&)::'lambda'(Fortran::evaluate::Type<(Fortran::common::TypeCategory)0, 4> const&)&&, std::variant>, Fortran::evaluate::Negate>, Fortran::evaluate::Add>, Fortran::evaluate::Subtract>, Fortran::evaluate::Multiply>, Fortran::evaluate::Divide>, Fortran::evaluate::Power>, Fortran::evaluate::Extremum>, Fortran::evaluate::ConditionalExpr>, Fortran::evaluate::Convert, (Fortran::common::TypeCategory)0>, Fortran::evaluate::Convert, (Fortran::common::TypeCategory)2>, Fortran::evaluate::Convert, (Fortran::common::TypeCategory)1>, Fortran::evaluate::Constant>, Fortran::evaluate::ArrayConstructor>, Fortran::evaluate::Designator>, Fortran::evaluate::FunctionRef>> const&)>, std::tuple>, Fortran::evaluate::Negate>, Fortran::evaluate::Add>, Fortran::evaluate::Subtract>, Fortran::evaluate::Multiply>, Fortran::evaluate::Divide>, Fortran::evaluate::Power>, Fortran::evaluate::Extremum>, Fortran::evaluate::ConditionalExpr>, Fortran::evaluate::Convert, (Fortran::common::TypeCategory)0>, Fortran::evaluate::Convert, (Fortran::common::TypeCategory)2>, Fortran::evaluate::Convert, (Fortran::common::TypeCategory)1>, Fortran::evaluate::Constant>, Fortran::evaluate::ArrayConstructor>, Fortran::evaluate::Designator>, Fortran::evaluate::FunctionRef>> const&>, std::integer_sequence>::__visit_invoke(hlfir::EntityWithAttributes (anonymous namespace)::HlfirBuilder::gen>(Fortran::evaluate::Expr> const&)::'lambda'(Fortran::evaluate::Type<(Fortran::common::TypeCategory)0, 4> const&)&&, std::variant>, Fortran::evaluate::Negate>, Fortran::evaluate::Add>, Fortran::evaluate::Subtract>, Fortran::evaluate::Multiply>, Fortran::evaluate::Divide>, Fortran::evaluate::Power>, Fortran::evaluate::Extremum>, Fortran::evaluate::ConditionalExpr>, Fortran::evaluate::Convert, (Fortran::common::TypeCategory)0>, Fortran::evaluate::Convert, (Fortran::common::TypeCategory)2>, Fortran::evaluate::Convert, (Fortran::common::TypeCategory)1>, Fortran::evaluate::Constant>, Fortran::evaluate::ArrayConstructor>, Fortran::evaluate::Designator>, Fortran::evaluate::FunctionRef>> const&) ConvertExprToHLFIR.cpp:0:0
#12 0x0000000006f56ed8 hlfir::EntityWithAttributes (anonymous namespace)::HlfirBuilder::gen>(Fortran::evaluate::Expr> const&) ConvertExprToHLFIR.cpp:0:0
#13 0x0000000006f56f58 std::__detail::__variant::__gen_vtable_impl>(Fortran::evaluate::Expr> const&)::'lambda'(Fortran::evaluate::SomeKind<(Fortran::common::TypeCategory)0> const&)&&, std::variant>, Fortran::evaluate::Expr>, Fortran::evaluate::Expr>, Fortran::evaluate::Expr>, Fortran::evaluate::Expr>> const&)>, std::tuple>, Fortran::evaluate::Expr>, Fortran::evaluate::Expr>, Fortran::evaluate::Expr>, Fortran::evaluate::Expr>> const&>, std::integer_sequence>::__visit_invoke(hlfir::EntityWithAttributes (anonymous namespace)::HlfirBuilder::gen>(Fortran::evaluate::Expr> const&)::'lambda'(Fortran::evaluate::SomeKind<(Fortran::common::TypeCategory)0> const&)&&, std::variant>, Fortran::evaluate::Expr>, Fortran::evaluate::Expr>, Fortran::evaluate::Expr>, Fortran::evaluate::Expr>> const&) ConvertExprToHLFIR.cpp:0:0
#14 0x0000000006f35ed4 hlfir::EntityWithAttributes (anonymous namespace)::HlfirBuilder::gen>(Fortran::evaluate::Expr> const&) ConvertExprToHLFIR.cpp:0:0
#15 0x0000000006f35f40 std::__detail::__variant::__gen_vtable_impl(Fortran::evaluate::Expr const&)::'lambda'(Fortran::evaluate::SomeType const&)&&, std::variant, Fortran::evaluate::NullPointer, Fortran::evaluate::ProcedureDesignator, Fortran::evaluate::ProcedureRef, Fortran::evaluate::Expr>, Fortran::evaluate::Expr>, Fortran::evaluate::Expr>, Fortran::evaluate::Expr>, Fortran::evaluate::Expr>, Fortran::evaluate::Expr>, Fortran::evaluate::Expr>> const&)>, std::tuple, Fortran::evaluate::NullPointer, Fortran::evaluate::ProcedureDesignator, Fortran::evaluate::ProcedureRef, Fortran::evaluate::Expr>, Fortran::evaluate::Expr>, Fortran::evaluate::Expr>, Fortran::evaluate::Expr>, Fortran::evaluate::Expr>, Fortran::evaluate::Expr>, Fortran::evaluate::Expr>> const&>, std::integer_sequence>::__visit_invoke(hlfir::EntityWithAttributes (anonymous namespace)::HlfirBuilder::gen(Fortran::evaluate::Expr const&)::'lambda'(Fortran::evaluate::SomeType const&)&&, std::variant, Fortran::evaluate::NullPointer, Fortran::evaluate::ProcedureDesignator, Fortran::evaluate::ProcedureRef, Fortran::evaluate::Expr>, Fortran::evaluate::Expr>, Fortran::evaluate::Expr>, Fortran::evaluate::Expr>, Fortran::evaluate::Expr>, Fortran::evaluate::Expr>, Fortran::evaluate::Expr>> const&) ConvertExprToHLFIR.cpp:0:0
#16 0x0000000006f34c68 hlfir::EntityWithAttributes (anonymous namespace)::HlfirBuilder::gen(Fortran::evaluate::Expr const&) ConvertExprToHLFIR.cpp:0:0
#17 0x0000000006f34ccc Fortran::lower::convertExprToHLFIR(mlir::Location, Fortran::lower::AbstractConverter&, Fortran::evaluate::Expr const&, Fortran::lower::SymMap&, Fortran::lower::StatementContext&) (/path/to/llvm/build/bin/flang-23+0x6f34ccc)
#18 0x0000000006eb1b94 (anonymous namespace)::FirConverter::genDataAssignment(Fortran::evaluate::Assignment const&, Fortran::evaluate::ProcedureRef const*, llvm::ArrayRef const&)::'lambda'(Fortran::lower::StatementContext&)::operator()(Fortran::lower::StatementContext&) const Bridge.cpp:0:0
#19 0x0000000006ed2e20 (anonymous namespace)::FirConverter::genDataAssignment(Fortran::evaluate::Assignment const&, Fortran::evaluate::ProcedureRef const*, llvm::ArrayRef const&) Bridge.cpp:0:0
#20 0x0000000006eb333c std::__detail::__variant::__gen_vtable_impl::visit<(anonymous namespace)::FirConverter::genFIR(Fortran::lower::pft::Evaluation&,bool)::'lambda0'(auto const&)>(auto&&) const::'lambda'(auto)>&&, std::variant, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference,Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference> const&)>, std::tuple, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference> const&>, std::integer_sequence>::__visit_invoke(Fortran::common::visitors::visit<(anonymous namespace)::FirConverter::genFIR(Fortran::lower::pft::Evaluation&, bool)::'lambda0'(auto const&)>(auto&&) const::'lambda'(auto)>&&, std::variant<...> const&) Bridge.cpp:0:0
#21 0x0000000006ed6f30 (anonymous namespace)::FirConverter::lowerFunc(Fortran::lower::pft::FunctionLikeUnit&) Bridge.cpp:0:0
#22 0x0000000006ed4bf8 Fortran::lower::LoweringBridge::lower(Fortran::parser::Program const&, Fortran::semantics::SemanticsContext const&) (/path/to/llvm/build/bin/flang-23+0x6ed4bf8)
#23 0x0000000006d88350 Fortran::frontend::CodeGenAction::beginSourceFileAction() (/path/to/llvm/build/bin/flang-23+0x6d88350)
#24 0x0000000006d75094 Fortran::frontend::FrontendAction::beginSourceFile(Fortran::frontend::CompilerInstance&, Fortran::frontend::FrontendInputFile const&) (/path/to/llvm/build/bin/flang-23+0x6d75094)
#25 0x0000000006d6108c Fortran::frontend::CompilerInstance::executeAction(Fortran::frontend::FrontendAction&) (/path/to/llvm/build/bin/flang-23+0x6d6108c)
#26 0x0000000006d7b4f4 Fortran::frontend::executeCompilerInvocation(Fortran::frontend::CompilerInstance*) (/path/to/llvm/build/bin/flang-23+0x6d7b4f4)
#27 0x0000000006d57a50 fc1_main(llvm::ArrayRef, char const*) (/path/to/llvm/build/bin/flang-23+0x6d57a50)
#28 0x0000000006d5722c main (/path/to/llvm/build/bin/flang-23+0x6d5722c)
#29 0x0000ffff9cc79540 __libc_start_call_main (/lib64/libc.so.6+0x27540)
#30 0x0000ffff9cc79618 __libc_start_main@GLIBC_2.17 (/lib64/libc.so.6+0x27618)
#31 0x0000000006d550d4 _start (/path/to/llvm/build/bin/flang-23+0x6d550d4)
flang-23: error: unable to execute command: Aborted (core dumped)
flang-23: error: flang frontend command failed with exit code -2 (use -v to see invocation)
flang version 23.0.0git (https://github.com/llvm/llvm-project.git 2301475676b208c555273e7c1ac5d4470d5ee70e)
Target: aarch64-unknown-linux-gnu
Thread model: posix
InstalledDir: /path/to/llvm/build/bin
Build config: +assertions
flang-23: note: diagnostic msg:
********************
PLEASE ATTACH THE FOLLOWING CRASH REPRODUCER FILES TO THE BUG REPORT:
flang-23: note: diagnostic msg: /tmp/test-6c8bbd
flang-23: note: diagnostic msg: /tmp/test-6c8bbd.sh
flang-23: note: diagnostic msg:
********************
$ cat /tmp/test-6c8bbd
#line "test.f90" 1
subroutine sub(a)
type(*)::a
integer::c
integer :: func
func(a) = 1
c=func(a)
end subroutine
$ cat /tmp/test-6c8bbd.sh
# Crash reproducer for clang version 23.0.0git (https://github.com/llvm/llvm-project.git 2301475676b208c555273e7c1ac5d4470d5ee70e)
# Driver args: "test.f90" "-c"
# Original command: "/path/to/llvm/build/bin/flang-23" "-fc1" "-triple" "aarch64-unknown-linux-gnu" "-emit-obj" "-fcolor-diagnostics" "-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" "/path/to/llvm/build/lib/clang/23" "-fintrinsic-modules-path" "/path/to/llvm/build/lib/clang/23/finclude/flang/aarch64-unknown-linux-gnu" "-mframe-pointer=non-leaf-no-reserve" "-o" "test.o" "-x" "f95" "test.f90"
"/path/to/llvm/build/bin/flang-23" "-fc1" "-triple" "aarch64-unknown-linux-gnu" "-emit-obj" "-fcolor-diagnostics" "-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" "-fintrinsic-modules-path" "/path/to/llvm/build/lib/clang/23/finclude/flang/aarch64-unknown-linux-gnu" "-mframe-pointer=non-leaf-no-reserve" "-x" "f95" "test-6c8bbd"
```
## Other Compilers
* GFortran
```console
$ gfortran --version
GNU Fortran (GCC) 15.2.0
Copyright (C) 2025 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ gfortran test.f90 -c
$
```
* Intel Fortran
```console
$ ifx --version
ifx (IFX) 2025.3.2 20260112
Copyright (C) 1985-2026 Intel Corporation. All rights reserved.
$ ifx -O0 test.f90 -c
$
```
Contributor guide
Research direction
Start with the reproducer in test.f90 and run it with flang --version and flang test.f90 -c. Then inspect flang/lib/Lower/ConvertCall.cpp around line 935 and the genStmtFunctionRef entry point; done means the assumed-type statement-function case no longer asserts and reports the expected semantic error instead.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- cpp
- Domain
- compilers
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 55/100