llvm / llvm/llvm-project

[Flang] Assertion failure: assumed type argument in statement function

Open
#207,304 4 comments 0 reactions 0 assignees View on GitHub
crash flang:fir-hlfir
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.