[flang-commits] [flang] [flang] Fix compiler crash in semantics (PR #79609)

Peter Klausler via flang-commits flang-commits at lists.llvm.org
Fri Jan 26 07:52:33 PST 2024


https://github.com/klausler created https://github.com/llvm/llvm-project/pull/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 https://github.com/llvm/llvm-project/issues/79590.

>From a32d457e1a2504ffe0dd04b459430eb204c8a341 Mon Sep 17 00:00:00 2001
From: Peter Klausler <pklausler at nvidia.com>
Date: Fri, 26 Jan 2024 07:50:01 -0800
Subject: [PATCH] [flang] Fix compiler crash in semantics

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 https://github.com/llvm/llvm-project/issues/79590.
---
 flang/lib/Semantics/runtime-type-info.cpp | 31 +++++++++++++----------
 flang/test/Semantics/typeinfo08.f90       | 26 +++++++++++++++++++
 2 files changed, 43 insertions(+), 14 deletions(-)
 create mode 100644 flang/test/Semantics/typeinfo08.f90

diff --git a/flang/lib/Semantics/runtime-type-info.cpp b/flang/lib/Semantics/runtime-type-info.cpp
index 8ccb98663f885ab..de71083a21ff503 100644
--- a/flang/lib/Semantics/runtime-type-info.cpp
+++ b/flang/lib/Semantics/runtime-type-info.cpp
@@ -788,20 +788,23 @@ evaluate::StructureConstructor RuntimeTableBuilder::DescribeComponent(
     const DerivedTypeSpec &spec{dyType.GetDerivedTypeSpec()};
     Scope *derivedScope{const_cast<Scope *>(
         spec.scope() ? spec.scope() : spec.typeSymbol().scope())};
-    const Symbol *derivedDescription{DescribeType(DEREF(derivedScope))};
-    AddValue(values, componentSchema_, "derived"s,
-        evaluate::AsGenericExpr(evaluate::Expr<evaluate::SomeDerived>{
-            evaluate::Designator<evaluate::SomeDerived>{
-                DEREF(derivedDescription)}}));
-    // Package values of LEN parameters, if any
-    if (const SymbolVector * specParams{GetTypeParameters(spec.typeSymbol())}) {
-      for (SymbolRef ref : *specParams) {
-        const auto &tpd{ref->get<TypeParamDetails>()};
-        if (tpd.attr() == common::TypeParamAttr::Len) {
-          if (const ParamValue * paramValue{spec.FindParameter(ref->name())}) {
-            lenParams.emplace_back(GetValue(*paramValue, parameters));
-          } else {
-            lenParams.emplace_back(GetValue(tpd.init(), parameters));
+    if (const Symbol * derivedDescription{DescribeType(DEREF(derivedScope))}) {
+      AddValue(values, componentSchema_, "derived"s,
+          evaluate::AsGenericExpr(evaluate::Expr<evaluate::SomeDerived>{
+              evaluate::Designator<evaluate::SomeDerived>{
+                  DEREF(derivedDescription)}}));
+      // Package values of LEN parameters, if any
+      if (const SymbolVector *
+          specParams{GetTypeParameters(spec.typeSymbol())}) {
+        for (SymbolRef ref : *specParams) {
+          const auto &tpd{ref->get<TypeParamDetails>()};
+          if (tpd.attr() == common::TypeParamAttr::Len) {
+            if (const ParamValue *
+                paramValue{spec.FindParameter(ref->name())}) {
+              lenParams.emplace_back(GetValue(*paramValue, parameters));
+            } else {
+              lenParams.emplace_back(GetValue(tpd.init(), parameters));
+            }
           }
         }
       }
diff --git a/flang/test/Semantics/typeinfo08.f90 b/flang/test/Semantics/typeinfo08.f90
new file mode 100644
index 000000000000000..7509070fa3eec5c
--- /dev/null
+++ b/flang/test/Semantics/typeinfo08.f90
@@ -0,0 +1,26 @@
+!RUN: bbc --dump-symbols %s | FileCheck %s
+!RUN: %flang_fc1 -fdebug-dump-symbols %s | FileCheck %s
+! Regression test for a crash (llvm-project/issues/79590)
+module m
+  type t(k1)
+     integer,kind :: k1
+  end type
+  type s(l1)
+     integer,len :: l1
+     type(t(3)) :: t1
+  end type
+end module
+
+!CHECK: Module scope: m size=0 alignment=1 sourceRange=113 bytes
+!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())]
+!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)
+!CHECK: .lpk.s, SAVE, TARGET (CompilerCreated, ReadOnly): ObjectEntity type: INTEGER(1) shape: 0_8:0_8 init:[INTEGER(1)::4_1]
+!CHECK: .n.s, SAVE, TARGET (CompilerCreated, ReadOnly): ObjectEntity type: CHARACTER(1_8,1) init:"s"
+!CHECK: .n.t1, SAVE, TARGET (CompilerCreated, ReadOnly): ObjectEntity type: CHARACTER(2_8,1) init:"t1"
+!CHECK: s, PUBLIC: DerivedType components: t1
+!CHECK: t, PUBLIC: DerivedType
+!CHECK: DerivedType scope: t sourceRange=27 bytes
+!CHECK: k1: TypeParam type:INTEGER(4) Kind
+!CHECK: DerivedType scope: s size=0 alignment=1 sourceRange=43 bytes
+!CHECK: l1: TypeParam type:INTEGER(4) Len
+!CHECK: t1: ObjectEntity type: TYPE(t(k1=3_4))



More information about the flang-commits mailing list