[flang-commits] [PATCH] D129681: [flang] Avoid crash from forward referenced derived type

Peter Klausler via Phabricator via flang-commits flang-commits at lists.llvm.org
Wed Jul 13 11:54:00 PDT 2022


klausler created this revision.
klausler added a reviewer: PeteSteinfeld.
klausler added a project: Flang.
Herald added a subscriber: jdoerfert.
Herald added a reviewer: sscalpone.
Herald added a project: All.
klausler requested review of this revision.

Fortran permits forward references to derived types in contexts that don't
require knowledge of the derived type definition for semantic analysis,
such as in the declaration of a pointer or allocatable variable or component.
But when the forward-referenced derived type is used later for a component
reference, it is possible for the DerivedTypeSpec in he base variable or component
declaration to still have a null scope pointer even if the type has been defined,
since DerivedTypeSpec and TypeSpec objects are created in scopes of use
rather than in scopes of definition.  The fix is to call
DerivedTypeSpec::Instantiate() in the name resolution of each component
name so that the scope gets filled in if it is still null.


https://reviews.llvm.org/D129681

Files:
  flang/lib/Semantics/resolve-names.cpp
  flang/test/Semantics/symbol21.f90


Index: flang/test/Semantics/symbol21.f90
===================================================================
--- /dev/null
+++ flang/test/Semantics/symbol21.f90
@@ -0,0 +1,30 @@
+! RUN: %python %S/test_symbols.py %s %flang_fc1
+! Derived type forward reference regression case
+
+ !DEF: /MainProgram1/t2 DerivedType
+ type :: t2
+  !DEF: /MainProgram1/t1 DerivedType
+  !DEF: /MainProgram1/t2/ptr POINTER ObjectEntity TYPE(t1)
+  type(t1), pointer :: ptr
+ end type
+ !REF: /MainProgram1/t1
+ type :: t1
+  !DEF: /MainProgram1/t1/a ObjectEntity REAL(4)
+  real :: a
+  !REF: /MainProgram1/t2
+  !DEF: /MainProgram1/t1/p2 POINTER ObjectEntity TYPE(t2)
+  type(t2), pointer :: p2
+  !REF: /MainProgram1/t1
+  !DEF: /MainProgram1/t1/p1 POINTER ObjectEntity TYPE(t1)
+  type(t1), pointer :: p1
+ end type
+ !REF: /MainProgram1/t1
+ !DEF: /MainProgram1/x1 POINTER ObjectEntity TYPE(t1)
+ !DEF: /MainProgram1/x2 POINTER ObjectEntity TYPE(t1)
+ type(t1), pointer :: x1, x2
+ !REF: /MainProgram1/x2
+ !REF: /MainProgram1/t1/p1
+ !REF: /MainProgram1/t1/a
+ !REF: /MainProgram1/x1
+ x2%p1%a = x1%a
+end program
Index: flang/lib/Semantics/resolve-names.cpp
===================================================================
--- flang/lib/Semantics/resolve-names.cpp
+++ flang/lib/Semantics/resolve-names.cpp
@@ -4419,7 +4419,6 @@
       spec->AddRawParamValue(optKeyword, std::move(param));
     }
   }
-
   // The DerivedTypeSpec *spec is used initially as a search key.
   // If it turns out to have the same name and actual parameter
   // value expressions as another DerivedTypeSpec in the current
@@ -6646,7 +6645,8 @@
       MakePlaceholder(component, miscKind);
       return &component;
     }
-  } else if (const DerivedTypeSpec * derived{type->AsDerived()}) {
+  } else if (DerivedTypeSpec * derived{type->AsDerived()}) {
+    derived->Instantiate(currScope()); // in case of forward referenced type
     if (const Scope * scope{derived->scope()}) {
       if (Resolve(component, scope->FindComponent(component.source))) {
         if (auto msg{


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D129681.444370.patch
Type: text/x-patch
Size: 2047 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/flang-commits/attachments/20220713/fe34ab2f/attachment.bin>


More information about the flang-commits mailing list