[Bug fortran/26393] New: "CONTAIN"-ed + assumed character length + "WRITE" -> ICE at trans-decl.c:849?

P dot Schaffnit at access dot rwth-aachen dot de gcc-bugzilla@gcc.gnu.org
Tue Feb 21 12:22:00 GMT 2006


Hi!

I have some severly twisted code (..): a "CONTAIN"-ed routine with assumed
character length arguments writing out a string (...) which causes an ICE. The
bad news, is that a "barebones" similar thing compiles (and runs) fine, so I
had to reduce it by trial and error, 8-( ... Whatever, don't look for much
sense here, but I believe that to be still valid (and lf95 would seem to
agree!).

Philippe

PS: what I get (and how I do it):
gfortran -c -g -pedantic-errors -Wall Sources.f90
Sources.f90: In function 'outdiffkoeff':
Sources.f90:85: internal compiler error: in gfc_get_symbol_decl, at
fortran/trans-decl.c:849
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://gcc.gnu.org/bugs.html> for instructions.

PPS: the "sources":
!
      MODULE MODULE_DIMENSION
!
      INTEGER, PARAMETER :: Sng = 4
      INTEGER, PARAMETER :: Dbl = 8
      INTEGER, PARAMETER :: Dft = Sng
!
      INTEGER, PARAMETER :: Length_File_Name = 1000
!
      END MODULE MODULE_DIMENSION
!
!
      MODULE MODULE_CONC
!
      USE MODULE_DIMENSION, ONLY: Length_File_Name, Dft, Sng, Dbl
!
      INTEGER, PARAMETER :: Weight = 1, Atom = 2
      INTEGER, PARAMETER :: Atom_to_Weight = 1, Weight_to_Atom = 2
!
      INTEGER, SAVE                               :: anzKomponenten = 0
      INTEGER, SAVE                               :: concTyp
      INTEGER, SAVE, ALLOCATABLE, DIMENSION(:,:,:):: diffZeiger
!
      REAL ( KIND = Dft ), SAVE, ALLOCATABLE  :: diffKoefKonst(:)
      REAL ( KIND = Dft ), SAVE, ALLOCATABLE  :: diffKoefAkt(:)
!
      END MODULE MODULE_CONC
!
!
      MODULE MODULE_THERMOCALC
!
      USE MODULE_DIMENSION, ONLY: Dft, Sng, Dbl
!
      CHARACTER ( LEN = 2 ), SAVE, ALLOCATABLE  ::   kompNameTQ(:)
      CHARACTER ( LEN = 12 ), SAVE, ALLOCATABLE ::   phaseNameTQ(:)
!
      LOGICAL, SAVE, ALLOCATABLE ::   usePhaseTQ(:)
      LOGICAL, SAVE, ALLOCATABLE ::   diff_Coeff_Inter(:,:)
!
      INTEGER, SAVE, ALLOCATABLE ::   cNr(:)
      INTEGER, SAVE, ALLOCATABLE ::   pNr(:)
!
      REAL ( KIND = Dft ), SAVE, ALLOCATABLE ::                        &
     &                                         diff_Coeff_Cond_Conc(:,:)
      REAL ( KIND = Dft ), SAVE, ALLOCATABLE ::                        &
     &                                         diff_Coeff_Cond_Temp(:)
!
      INTERFACE
          FUNCTION solveCConvert ( Flag_Conversion, Composition )
              USE MODULE_CONC, ONLY: anzKomponenten
              USE MODULE_DIMENSION, ONLY: Dft
              IMPLICIT NONE
              INTEGER, INTENT ( IN )         ::   Flag_Conversion
              REAL ( KIND = Dft ),                                     &
     &                        INTENT ( IN )  ::   Composition          &
     &                                            ( 1 : anzKomponenten )
              REAL ( KIND = Dft )            ::   solveCConvert        &
     &                                            ( 1 : anzKomponenten )
          END FUNCTION solveCConvert
      END INTERFACE
!
      END MODULE MODULE_THERMOCALC
!
!
      SUBROUTINE outDiffKoeff ( phase )
!
      USE MODULE_CONC
      USE MODULE_DIMENSION
      USE MODULE_THERMOCALC
!
      IMPLICIT   NONE
!
      LOGICAL, PARAMETER  ::   thermocalc = .TRUE.
!
      INTEGER                           ::   IO_Stat
      INTEGER                           ::   phase, k
!
      REAL ( KIND = Dft ), PARAMETER    ::   R = 8.31441
      REAL ( KIND = Dft )               ::   buffer_conc               &
     &                                            ( 1 : anzKomponenten )
!
      CHARACTER ( LEN = 250 )           ::   String
!
      WRITE ( String, FMT = * ) diff_Coeff_Cond_Temp(phase)
      CALL CTN_Write_String ( TRIM(String), "(A)" )
          IF ( ( ( thermocalc ) .AND. ( concTyp .EQ. Weight ) ) ) THEN
            buffer_conc = solveCConvert ( Atom_to_Weight, &
     &                diff_Coeff_Cond_Conc(phase,:) ) * 1E2
          ELSE
            buffer_conc = diff_Coeff_Cond_Conc(phase,:) * 1E2
          ENDIF
          DO k = 1, anzKomponenten
              WRITE ( UNIT = String, FMT = "(ES12.4)" ) buffer_conc(k)
              CALL CTN_Write_String ( TRIM(String), "(A)" )
          ENDDO
!
      CONTAINS
!
        SUBROUTINE CTN_Write_String ( String, Fmt )
!
          CHARACTER ( LEN = * ), INTENT ( IN )    ::   String, Fmt
!
          WRITE ( UNIT = 12, FMT = TRIM(Fmt), IOSTAT = IO_Stat )       &
     &                                                      TRIM(String)
          IF ( IO_Stat .NE. 0 ) THEN
            CALL toolStop
          ENDIF
!
        END SUBROUTINE CTN_Write_String
!
      END SUBROUTINE outDiffKoeff
!

PPPS: I'm using 4.2.0 20060221 (experimental)


-- 
           Summary: "CONTAIN"-ed + assumed character length + "WRITE" -> ICE
                    at trans-decl.c:849?
           Product: gcc
           Version: 4.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: fortran
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: P dot Schaffnit at access dot rwth-aachen dot de


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



More information about the Gcc-bugs mailing list