[llvm-branch-commits] [flang] release/21.x: [Flang] Fix crash with parametrized derived types usage (#150289) (PR #151937)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Aug 4 03:07:07 PDT 2025
https://github.com/llvmbot created https://github.com/llvm/llvm-project/pull/151937
Backport 89e4d9f
Requested by: @tblah
>From bfff2eb3e5216113c2e4cac56c0a0a0e49d38256 Mon Sep 17 00:00:00 2001
From: Carlos Seo <carlos.seo at linaro.org>
Date: Fri, 1 Aug 2025 11:20:09 -0300
Subject: [PATCH] [Flang] Fix crash with parametrized derived types usage
(#150289)
The current mangleName implementation doesn't take a FoldingContext,
which prevents the proper evaluation of expressions containing parameter
references to an integer constant. Since parametrized derived types are
not yet implemented, the compiler will crash there in some cases (see
example in issue #127424).
This is a workaround so that doesn't happen until the feature is
properly implemented.
Fixes #127424
(cherry picked from commit 89e4d9f905f7abbf5803c011ab6fba26796ced30)
---
flang/lib/Lower/Mangler.cpp | 14 ++++++++++++--
.../test/Lower/parametrized-derived-types.f90 | 19 +++++++++++++++++++
2 files changed, 31 insertions(+), 2 deletions(-)
create mode 100644 flang/test/Lower/parametrized-derived-types.f90
diff --git a/flang/lib/Lower/Mangler.cpp b/flang/lib/Lower/Mangler.cpp
index 1333e3fe349d1..e1ae86a1b5bb2 100644
--- a/flang/lib/Lower/Mangler.cpp
+++ b/flang/lib/Lower/Mangler.cpp
@@ -224,8 +224,18 @@ std::string Fortran::lower::mangle::mangleName(
assert(paramExpr && "derived type kind param not explicit");
std::optional<int64_t> init =
Fortran::evaluate::ToInt64(paramValue->GetExplicit());
- assert(init && "derived type kind param is not constant");
- kinds.emplace_back(*init);
+ // TODO: put the assertion check back when parametrized derived types
+ // are supported:
+ // assert(init && "derived type kind param is not constant");
+ //
+ // The init parameter above will require a FoldingContext for proper
+ // expression evaluation to an integer constant, otherwise the
+ // compiler may crash here (see example in issue #127424).
+ if (!init) {
+ TODO_NOLOC("parameterized derived types");
+ } else {
+ kinds.emplace_back(*init);
+ }
}
}
return fir::NameUniquer::doType(modules, procs, blockId, symbolName, kinds);
diff --git a/flang/test/Lower/parametrized-derived-types.f90 b/flang/test/Lower/parametrized-derived-types.f90
new file mode 100644
index 0000000000000..97a40c9169d2b
--- /dev/null
+++ b/flang/test/Lower/parametrized-derived-types.f90
@@ -0,0 +1,19 @@
+! RUN: %python %S/test_errors.py %s %flang_fc1
+! XFAIL: *
+program main
+ TYPE ty(k1,k2)
+ INTEGER ,KIND::k1,k2=5
+ INTEGER::arr(k1:k2)=10
+ CHARACTER(LEN=k2)::CHARACTER
+ END TYPE ty
+ TYPE,EXTENDS(ty)::ty1(k3)
+ INTEGER,KIND ::k3=4
+ TYPE(ty(2,k3+1))::cmp_ty = ty(2,k3+1)(55,'HI')
+ END TYPE ty1
+ TYPE ty2(l1, l2)
+ !ERROR: not yet implemented: parameterized derived types
+ INTEGER,LEN ::l1,l2
+ TYPE(ty1(2,5)), ALLOCATABLE::ty1_cmp(:)
+ END TYPE ty2
+ TYPE(ty2(4,8)) ::ty2_obj
+end program main
More information about the llvm-branch-commits
mailing list