This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Patch, fortran] PR55827 ICE with multiple fortran modules.


Hello,

here is a fix for PR fortran/55827 where we had a function expression (loaded from a module) whose symtree pointer was NULL. My attempt to have symtree properly set got me way too far, so this is fixing the unconditional usages of symtree based on Steve's patch in the PR. As noted in the PR, it looks bogus to have a NULL expr->symtree, but in fact expr->value.function.esym is set, and it is what is solely looked at, apart for the cases fixed in this patch.

The trans-expr.c part initializes `sym' earlier and uses it instead of accessing `expr->symtree' directly.

The class.c part creates a similar construct to initialize `ts' without accessing `expr->symtree' directly. I don't use Steve's way (returning early for a NULL symtree), because I remembered that `expr->symtree' could be a generic symbol, thus have invalid type for use to initialize `ts', contrary to `expr->value.function.esym'. It's better to always use `esym' when it is available. And then returning early on NULL symtree is not necessary any more.

Regression tested on x86_64-unknown-linux-gnu. OK for trunk?
Do we want it on the branches as well?

Mikael







Attachment: pr55827_submit.CL
Description: Text document

Attachment: pr55827_submit.diff
Description: Text document

Attachment: pr55827-test.CL
Description: Text document

! { dg-do compile }
!
! PR fortran/55827
! gfortran used to ICE with the call to `tostring' depending on how the
! `tostring' symbol was USE-associated.
!
! Contributed by Lorenz Hüdepohl <bugs@stellardeath.org>

module stringutils
  interface
    pure function strlen(handle) result(len)
      integer, intent(in) :: handle
      integer :: len
    end function
  end interface
end module
module intermediate ! does not die if this module is merged with stringutils
  contains
  function tostring(handle) result(string)
    use stringutils
    integer, intent(in) :: handle
    character(len=strlen(handle)) :: string
  end function
end module
module usage
  contains
  subroutine dies_here(handle)
    use stringutils ! does not die if this unnecessary line is omitted or placed after "use intermediate"
    use intermediate
    integer :: handle
    write(*,*) tostring(handle) ! ICE
  end subroutine
end module



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]