public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r11-11311] Fortran: fix DATA and derived types with pointer components [PR114474]
@ 2024-04-07 18:13 Harald Anlauf
  0 siblings, 0 replies; only message in thread
From: Harald Anlauf @ 2024-04-07 18:13 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:619fc13043c86d616ef57cb31f8ac5d29b059ade

commit r11-11311-g619fc13043c86d616ef57cb31f8ac5d29b059ade
Author: Harald Anlauf <anlauf@gmx.de>
Date:   Wed Mar 27 21:18:04 2024 +0100

    Fortran: fix DATA and derived types with pointer components [PR114474]
    
    When matching actual arguments in match_actual_arg, these are initially
    treated as a possible dummy procedure, assuming that the correct type is
    determined later.  This resolution could fail when the procedure is a
    derived type constructor with a pointer component and appears in a DATA
    statement, where the pointer shall be associated with an initial data
    target.  Check for those cases where the type obviously has not been
    resolved yet, and which were missed because there was no component
    reference.
    
    gcc/fortran/ChangeLog:
    
            PR fortran/114474
            * primary.c (gfc_variable_attr): Catch variables used in structure
            constructors within DATA statements that are still tagged with a
            temporary type BT_PROCEDURE from match_actual_arg and which have the
            target attribute, and fix their typespec.
    
    gcc/testsuite/ChangeLog:
    
            PR fortran/114474
            * gfortran.dg/data_pointer_3.f90: New test.
    
    (cherry picked from commit bbb7c513dddc5c9b2d5e9b78bc1c2f85a0cfe07e)

Diff:
---
 gcc/fortran/primary.c                        | 12 +++++
 gcc/testsuite/gfortran.dg/data_pointer_3.f90 | 77 ++++++++++++++++++++++++++++
 2 files changed, 89 insertions(+)

diff --git a/gcc/fortran/primary.c b/gcc/fortran/primary.c
index 5cad2d2682b..79a2201c812 100644
--- a/gcc/fortran/primary.c
+++ b/gcc/fortran/primary.c
@@ -2663,6 +2663,18 @@ gfc_variable_attr (gfc_expr *expr, gfc_typespec *ts)
   if (ts != NULL && expr->ts.type == BT_UNKNOWN)
     *ts = sym->ts;
 
+  /* Catch left-overs from match_actual_arg, where an actual argument of a
+     procedure is given a temporary ts.type == BT_PROCEDURE.  The fixup is
+     needed for structure constructors in DATA statements, where a pointer
+     is associated with a data target, and the argument has not been fully
+     resolved yet.  Components references are dealt with further below.  */
+  if (ts != NULL
+      && expr->ts.type == BT_PROCEDURE
+      && expr->ref == NULL
+      && attr.flavor != FL_PROCEDURE
+      && attr.target)
+    *ts = sym->ts;
+
   has_inquiry_part = false;
   for (ref = expr->ref; ref; ref = ref->next)
     if (ref->type == REF_INQUIRY)
diff --git a/gcc/testsuite/gfortran.dg/data_pointer_3.f90 b/gcc/testsuite/gfortran.dg/data_pointer_3.f90
new file mode 100644
index 00000000000..49c288e93b9
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/data_pointer_3.f90
@@ -0,0 +1,77 @@
+! { dg-do compile }
+! PR fortran/114474 - DATA and derived types with pointer components
+
+program pr114474
+  implicit none
+  integer, target     :: ii = 42    ! initial data target
+
+  integer, target     :: jj = 24
+  integer, pointer    :: qq => jj
+  ! ii and jj resolve slightly differently when the data statement below
+  ! is reached, as jj is resolved outside the structure constructor first
+
+  type t
+     integer, pointer :: h
+  end type t
+
+  integer, target     :: kk(7) =  23
+  integer, pointer    :: ll(:) => kk
+
+  type t1
+     integer          :: m(7)
+  end type t1
+
+  type(t)             :: x1, x2, x3, x4, x5
+  type(t), parameter  :: z1 = t(null())
+
+  type(t1), target    :: tt = t1([1,2,3,4,5,6,7])
+  type(t1), parameter :: vv = t1(22)
+  type(t1)            :: w1, w2
+  integer,  pointer   :: p1(:) => tt% m
+
+  data x1 / t(null())  /
+  data x2 / t(ii)      / ! ii is initial data target
+  data x3 / t(jj)      / ! jj is resolved differently...
+  data x4 / t(tt%m(3)) / ! pointer association with 3rd element
+
+  data w1 / t1(12)     /
+  data w2 / t1(vv%m)   /
+
+  if (      associated (x1% h)) stop 1
+  if (.not. associated (x2% h)) stop 2
+  if (.not. associated (x3% h)) stop 3
+  if (.not. associated (x4% h)) stop 4
+  if (x2% h /= 42) stop 5
+  if (x3% h /= 24) stop 6
+  if (x4% h /=  3) stop 7
+ 
+  if (any (w1%m /= 12  )) stop 8
+  if (any (w2%m /= vv%m)) stop 9
+end
+
+
+subroutine sub
+  implicit none
+
+  interface
+     real function myfun (x)
+       real, intent(in) :: x
+     end function myfun
+  end interface
+
+  type u
+     procedure(myfun), pointer, nopass :: p
+  end type u
+
+  type(u)            :: u3 = u(null())
+  type(u), parameter :: u4 = u(null())
+  type(u)            :: u1, u2
+
+  data u1 / u(null()) /
+  data u2 / u(myfun)  /
+end
+
+real function myfun (x)
+  real, intent(in) :: x
+  myfun = x
+end function myfun

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2024-04-07 18:13 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-04-07 18:13 [gcc r11-11311] Fortran: fix DATA and derived types with pointer components [PR114474] Harald Anlauf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).