ICE on invalid(?) with sizeof() polymorphic variable

Andrew Benson abenson@obs.carnegiescience.edu
Sat Apr 25 16:32:00 GMT 2015


Hello,

The following testcase causes an ICE with gfortran 6.0 (r222432):

module m
  type n
  end type n
contains
  subroutine g(ns)
    class(n), intent(out), allocatable, dimension(:) :: ns
    write (0,*) sizeof(ns)
  end subroutine g
end module m

$ gfortran -v
Using built-in specs.
COLLECT_GCC=gfortran
COLLECT_LTO_WRAPPER=/nfs/17/cond0061/Galacticus/Tools/libexec/gcc/x86_64-
unknown-linux-gnu/6.0.0/lto-wrapper
Target: x86_64-unknown-linux-gnu
Configured with: ../gcc-trunk/configure --
prefix=/nfs/17/cond0061/Galacticus/Tools --enable-languages=c,c++,fortran --
disable-multilib
Thread model: posix
gcc version 6.0.0 20150424 (experimental) (GCC)

$ gfortran -c small.f90 -o small.o                                                                                                    
small.f90:7:0:

     write (0,*) sizeof(ns)
 1
internal compiler error: tree check: expected tree that contains ‘decl common’ 
structure, have ‘indirect_ref’ in gfc_conv_intrinsic_sizeof, at fortran/trans-
intrinsic.c:5928
0xdd8994 tree_contains_struct_check_failed(tree_node const*, 
tree_node_structure_enum, char const*, int, char const*)
        ../../gcc-trunk/gcc/tree.c:9471
0x706628 contains_struct_check(tree_node*, tree_node_structure_enum, char 
const*, int, char const*)
        ../../gcc-trunk/gcc/tree.h:2960
0x706628 gfc_conv_intrinsic_sizeof
        ../../gcc-trunk/gcc/fortran/trans-intrinsic.c:5928
0x70e24f gfc_conv_intrinsic_function(gfc_se*, gfc_expr*)
        ../../gcc-trunk/gcc/fortran/trans-intrinsic.c:8185
0x6ece32 gfc_conv_expr(gfc_se*, gfc_expr*)
        ../../gcc-trunk/gcc/fortran/trans-expr.c:7361
0x6f3685 gfc_conv_expr_reference(gfc_se*, gfc_expr*)
        ../../gcc-trunk/gcc/fortran/trans-expr.c:7496
0x7150c1 gfc_trans_transfer(gfc_code*)
        ../../gcc-trunk/gcc/fortran/trans-io.c:2394
0x6b18d7 trans_code
        ../../gcc-trunk/gcc/fortran/trans.c:1885
0x7121b0 build_dt
        ../../gcc-trunk/gcc/fortran/trans-io.c:1921
0x6b18f7 trans_code
        ../../gcc-trunk/gcc/fortran/trans.c:1857
0x6de1df gfc_generate_function_code(gfc_namespace*)
        ../../gcc-trunk/gcc/fortran/trans-decl.c:5896
0x6b6149 gfc_generate_module_code(gfc_namespace*)
        ../../gcc-trunk/gcc/fortran/trans.c:2053
0x66e3ad translate_all_program_units
        ../../gcc-trunk/gcc/fortran/parse.c:5328
0x66e3ad gfc_parse_file()
        ../../gcc-trunk/gcc/fortran/parse.c:5538
0x6ae745 gfc_be_parse_file
        ../../gcc-trunk/gcc/fortran/f95-lang.c:228
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See <http://gcc.gnu.org/bugs.html> for instructions.

It's not clear to me if this is invalid code - see the discussion for PR57305 
on how SIZEOF() should work on variables without a declared type. I checked 
that the testcase for PR57305 still compiles successfully.

Wrapping the call to SIZEOF() inside a "SELECT TYPE" block removes the ICE. 

Replacing SIZEOF() with STORAGE_SIZE() (as suggested in PR57305) results in a 
slightly different backtrace:

$ gfortran -c small.f90 -o small.o
small.f90:7:0:

     write (0,*) storage_size(ns)
 1
internal compiler error: Segmentation fault
0xb7572f crash_signal
        ../../gcc-trunk/gcc/toplev.c:383
0x70689e gfc_conv_intrinsic_storage_size
        ../../gcc-trunk/gcc/fortran/trans-intrinsic.c:6067
0x70e8b9 gfc_conv_intrinsic_function(gfc_se*, gfc_expr*)
        ../../gcc-trunk/gcc/fortran/trans-intrinsic.c:8189
0x6ece32 gfc_conv_expr(gfc_se*, gfc_expr*)
        ../../gcc-trunk/gcc/fortran/trans-expr.c:7361
0x6f3685 gfc_conv_expr_reference(gfc_se*, gfc_expr*)
        ../../gcc-trunk/gcc/fortran/trans-expr.c:7496
0x7150c1 gfc_trans_transfer(gfc_code*)
        ../../gcc-trunk/gcc/fortran/trans-io.c:2394
0x6b18d7 trans_code
        ../../gcc-trunk/gcc/fortran/trans.c:1885
0x7121b0 build_dt
        ../../gcc-trunk/gcc/fortran/trans-io.c:1921
0x6b18f7 trans_code
        ../../gcc-trunk/gcc/fortran/trans.c:1857
0x6de1df gfc_generate_function_code(gfc_namespace*)
        ../../gcc-trunk/gcc/fortran/trans-decl.c:5896
0x6b6149 gfc_generate_module_code(gfc_namespace*)
        ../../gcc-trunk/gcc/fortran/trans.c:2053
0x66e3ad translate_all_program_units
        ../../gcc-trunk/gcc/fortran/parse.c:5328
0x66e3ad gfc_parse_file()
        ../../gcc-trunk/gcc/fortran/parse.c:5538
0x6ae745 gfc_be_parse_file
        ../../gcc-trunk/gcc/fortran/f95-lang.c:228
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See <http://gcc.gnu.org/bugs.html> for instructions.

I've created a PR for this:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65889

-Andrew

-- 

* Andrew Benson: http://users.obs.carnegiescience.edu/abenson/contact.html

* Galacticus: http://sites.google.com/site/galacticusmodel



More information about the Fortran mailing list