[Bug fortran/26393] ICE with function returning variable lenght array

paul dot richard dot thomas at cea dot fr gcc-bugzilla@gcc.gnu.org
Mon Feb 27 16:18:00 GMT 2006



------- Comment #3 from paul dot richard dot thomas at cea dot fr  2006-02-27 16:10 -------
I have a fix that I will post tonight but it appears below anyway.

Paul

Index: gcc/fortran/trans-decl.c
===================================================================
--- gcc/fortran/trans-decl.c    (r├®vision 111471)
+++ gcc/fortran/trans-decl.c    (copie de travail)
@@ -846,7 +846,8 @@
   tree length = NULL_TREE;
   int byref;

-  gcc_assert (sym->attr.referenced);
+  gcc_assert (sym->attr.referenced
+               || sym->ns->proc_name->attr.if_source == IFSRC_IFBODY);

   if (sym->ns && sym->ns->proc_name->attr.function)
     byref = gfc_return_by_reference (sym->ns->proc_name);

and the testcase

! { dg-do run }
! Tests the fix for PR26393, in which an ICE would occur in trans-decl.c
! (gfc_get_symbol_decl) because anzKomponenten is not referenced in the
! interface for solveCConvert. The solution was to assert that the symbol
! is either referenced or in an interface body.
!
! Based on the testcase in the PR.
!
  MODULE MODULE_CONC
    INTEGER, SAVE :: anzKomponenten = 2
  END MODULE MODULE_CONC

  MODULE MODULE_THERMOCALC
    INTERFACE
      FUNCTION solveCConvert ()
        USE MODULE_CONC, ONLY: anzKomponenten
        REAL :: solveCConvert(1:anzKomponenten)
        END FUNCTION solveCConvert
    END INTERFACE
  END MODULE MODULE_THERMOCALC

  SUBROUTINE outDiffKoeff
    USE MODULE_CONC
    USE MODULE_THERMOCALC
    REAL :: buffer_conc(1:anzKomponenten)
    buffer_conc = solveCConvert ()
    if (any(buffer_conc .ne. (/(real(i), i = 1, anzKomponenten)/))) &
          call abort ()
  END SUBROUTINE outDiffKoeff

  program missing_ref
    USE MODULE_CONC
    call outDiffKoeff
! Now set anzKomponenten to a value that would cause a segfault if
! buffer_conc and solveCConvert did not have the correct allocation
! of memory.
    anzKomponenten = 5000
    call outDiffKoeff
  end program missing_ref

  FUNCTION solveCConvert ()
    USE MODULE_CONC, ONLY: anzKomponenten
    REAL :: solveCConvert(1:anzKomponenten)
    solveCConvert = (/(real(i), i = 1, anzKomponenten)/)
  END FUNCTION solveCConvert



-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26393



More information about the Gcc-bugs mailing list