Skip to content

Commit 74bebee

Browse files
authored
[flang] Fix compiler crash in semantics (#79609)
The runtime type information table generator couldn't handle a null pointer returned correctly for a original (not instantiated) derived type with kind parameters. Fixes #79590.
1 parent c492eb6 commit 74bebee

File tree

2 files changed

+43
-14
lines changed

2 files changed

+43
-14
lines changed

flang/lib/Semantics/runtime-type-info.cpp

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -788,20 +788,23 @@ evaluate::StructureConstructor RuntimeTableBuilder::DescribeComponent(
788788
const DerivedTypeSpec &spec{dyType.GetDerivedTypeSpec()};
789789
Scope *derivedScope{const_cast<Scope *>(
790790
spec.scope() ? spec.scope() : spec.typeSymbol().scope())};
791-
const Symbol *derivedDescription{DescribeType(DEREF(derivedScope))};
792-
AddValue(values, componentSchema_, "derived"s,
793-
evaluate::AsGenericExpr(evaluate::Expr<evaluate::SomeDerived>{
794-
evaluate::Designator<evaluate::SomeDerived>{
795-
DEREF(derivedDescription)}}));
796-
// Package values of LEN parameters, if any
797-
if (const SymbolVector * specParams{GetTypeParameters(spec.typeSymbol())}) {
798-
for (SymbolRef ref : *specParams) {
799-
const auto &tpd{ref->get<TypeParamDetails>()};
800-
if (tpd.attr() == common::TypeParamAttr::Len) {
801-
if (const ParamValue * paramValue{spec.FindParameter(ref->name())}) {
802-
lenParams.emplace_back(GetValue(*paramValue, parameters));
803-
} else {
804-
lenParams.emplace_back(GetValue(tpd.init(), parameters));
791+
if (const Symbol * derivedDescription{DescribeType(DEREF(derivedScope))}) {
792+
AddValue(values, componentSchema_, "derived"s,
793+
evaluate::AsGenericExpr(evaluate::Expr<evaluate::SomeDerived>{
794+
evaluate::Designator<evaluate::SomeDerived>{
795+
DEREF(derivedDescription)}}));
796+
// Package values of LEN parameters, if any
797+
if (const SymbolVector *
798+
specParams{GetTypeParameters(spec.typeSymbol())}) {
799+
for (SymbolRef ref : *specParams) {
800+
const auto &tpd{ref->get<TypeParamDetails>()};
801+
if (tpd.attr() == common::TypeParamAttr::Len) {
802+
if (const ParamValue *
803+
paramValue{spec.FindParameter(ref->name())}) {
804+
lenParams.emplace_back(GetValue(*paramValue, parameters));
805+
} else {
806+
lenParams.emplace_back(GetValue(tpd.init(), parameters));
807+
}
805808
}
806809
}
807810
}

flang/test/Semantics/typeinfo08.f90

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
!RUN: bbc --dump-symbols %s | FileCheck %s
2+
!RUN: %flang_fc1 -fdebug-dump-symbols %s | FileCheck %s
3+
! Regression test for a crash (llvm-project/issues/79590)
4+
module m
5+
type t(k1)
6+
integer,kind :: k1
7+
end type
8+
type s(l1)
9+
integer,len :: l1
10+
type(t(3)) :: t1
11+
end type
12+
end module
13+
14+
!CHECK: Module scope: m size=0 alignment=1 sourceRange=113 bytes
15+
!CHECK: .c.s, SAVE, TARGET (CompilerCreated, ReadOnly): ObjectEntity type: TYPE(component) shape: 0_8:0_8 init:[component::component(name=.n.t1,genre=1_1,category=5_1,kind=0_1,rank=0_1,offset=0_8,characterlen=value(genre=1_1,value=0_8),lenvalue=NULL(),bounds=NULL(),initialization=NULL())]
16+
!CHECK: .dt.s, SAVE, TARGET (CompilerCreated, ReadOnly): ObjectEntity type: TYPE(derivedtype) init:derivedtype(binding=NULL(),name=.n.s,sizeinbytes=0_8,uninstantiated=NULL(),kindparameter=NULL(),lenparameterkind=.lpk.s,component=.c.s,procptr=NULL(),special=NULL(),specialbitset=0_4,hasparent=0_1,noinitializationneeded=1_1,nodestructionneeded=1_1,nofinalizationneeded=1_1)
17+
!CHECK: .lpk.s, SAVE, TARGET (CompilerCreated, ReadOnly): ObjectEntity type: INTEGER(1) shape: 0_8:0_8 init:[INTEGER(1)::4_1]
18+
!CHECK: .n.s, SAVE, TARGET (CompilerCreated, ReadOnly): ObjectEntity type: CHARACTER(1_8,1) init:"s"
19+
!CHECK: .n.t1, SAVE, TARGET (CompilerCreated, ReadOnly): ObjectEntity type: CHARACTER(2_8,1) init:"t1"
20+
!CHECK: s, PUBLIC: DerivedType components: t1
21+
!CHECK: t, PUBLIC: DerivedType
22+
!CHECK: DerivedType scope: t sourceRange=27 bytes
23+
!CHECK: k1: TypeParam type:INTEGER(4) Kind
24+
!CHECK: DerivedType scope: s size=0 alignment=1 sourceRange=43 bytes
25+
!CHECK: l1: TypeParam type:INTEGER(4) Len
26+
!CHECK: t1: ObjectEntity type: TYPE(t(k1=3_4))

0 commit comments

Comments
 (0)