[Bug fortran/67760] New: ICE on contained subroutine in function modifying function return value
thomas.orgis@uni-hamburg.de
gcc-bugzilla@gcc.gnu.org
Tue Sep 29 11:43:00 GMT 2015
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67760
Bug ID: 67760
Summary: ICE on contained subroutine in function modifying
function return value
Product: gcc
Version: 5.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: fortran
Assignee: unassigned at gcc dot gnu.org
Reporter: thomas.orgis@uni-hamburg.de
Target Milestone: ---
Host: x86_64-unknown-linux-gnu
Created attachment 36414
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=36414&action=edit
example code triggering the ICE
I get a reliable gfortran internal compiler error with all versions I tried so
far (version 5.1.0 picked as the one where the installation reports a backtrace
that may be useful).
In my tests this affects gcc-4.8.3 (CentOS), gcc-4.1.2 (SLES) and
self-compiled vanilla gcc 4.9.2, 5.1.0, 5.2.0 . I therefore conclude that it
probably still is there in more current/upcoming releases.
The culprit is a contained subroutine inside a function that is accessing the
return value of that function through the functions's name:
function fancy()
!integer :: fancy ! both gcc and icc happy
!integer :: fancy(4) ! gcc crash, icc depends on more_fancy
integer :: fancy(3,2) ! gcc crash, icc depends on more_fancy
call more_fancy
contains
subroutine more_fancy
fancy = 42 ! Fine, generally.
!fancy(:) = 42 ! icc giving error about substring
!fancy(:,:) = 42 ! icc giving error about function name conflict
end subroutine
end function
I am not really sure what the standard says about this, especially since this
works for a scalar return value for both gcc and the Intel compiler, and also
for an array if the first assignment in more_fancy is used. For a non-recursive
function, I actually don't see any problem when one considers the code of the
contained subroutine still being in the scope of the function.
But anyhow: At least an error should be produced instead of the compiler
crashing. Example from gcc-5.1.0:
$ LANG=C gfortran -Wall -Wextra -o gfortran-ice gfortran-ice.f90
gfortran-ice.f90:16:0:
function fancy()
^
internal compiler error: Segmentation fault
0x90c276 crash_signal
/usr/src/gcc-5.1.0/gcc/toplev.c:383
0x2b47551271ef ???
/usr/src/glibc-2.21/signal/../sysdeps/unix/sysv/linux/x86_64/sigaction.c:0
0x97bd0a get_frame_type
/usr/src/gcc-5.1.0/gcc/tree-nested.c:263
0x97bd0a get_chain_decl
/usr/src/gcc-5.1.0/gcc/tree-nested.c:369
0x97e2ea get_chain_decl
/usr/src/gcc-5.1.0/gcc/tree-nested.c:875
0x97e2ea get_nonlocal_debug_decl
/usr/src/gcc-5.1.0/gcc/tree-nested.c:880
0x97e408 convert_nonlocal_reference_op
/usr/src/gcc-5.1.0/gcc/tree-nested.c:958
0xaff4e4 walk_tree_1(tree_node**, tree_node* (*)(tree_node**, int*, void*),
void*, hash_set<tree_node*, default_hashset_traits>*, tree_node*
(*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*), void*,
hash_set<tree_node*, default_hashset_traits>*))
/usr/src/gcc-5.1.0/gcc/tree.c:11093
0x74f66c walk_gimple_op(gimple_statement_base*, tree_node* (*)(tree_node**,
int*, void*), walk_stmt_info*)
/usr/src/gcc-5.1.0/gcc/gimple-walk.c:235
0x74f8d4 walk_gimple_stmt(gimple_stmt_iterator*, tree_node*
(*)(gimple_stmt_iterator*, bool*, walk_stmt_info*), tree_node* (*)(tree_node**,
int*, void*), walk_stmt_info*)
/usr/src/gcc-5.1.0/gcc/gimple-walk.c:575
0x74fab0 walk_gimple_seq_mod(gimple_statement_base**, tree_node*
(*)(gimple_stmt_iterator*, bool*, walk_stmt_info*), tree_node* (*)(tree_node**,
int*, void*), walk_stmt_info*)
/usr/src/gcc-5.1.0/gcc/gimple-walk.c:72
0x74f992 walk_gimple_stmt(gimple_stmt_iterator*, tree_node*
(*)(gimple_stmt_iterator*, bool*, walk_stmt_info*), tree_node* (*)(tree_node**,
int*, void*), walk_stmt_info*)
/usr/src/gcc-5.1.0/gcc/gimple-walk.c:585
0x74fab0 walk_gimple_seq_mod(gimple_statement_base**, tree_node*
(*)(gimple_stmt_iterator*, bool*, walk_stmt_info*), tree_node* (*)(tree_node**,
int*, void*), walk_stmt_info*)
/usr/src/gcc-5.1.0/gcc/gimple-walk.c:72
0x74f992 walk_gimple_stmt(gimple_stmt_iterator*, tree_node*
(*)(gimple_stmt_iterator*, bool*, walk_stmt_info*), tree_node* (*)(tree_node**,
int*, void*), walk_stmt_info*)
/usr/src/gcc-5.1.0/gcc/gimple-walk.c:585
0x74fab0 walk_gimple_seq_mod(gimple_statement_base**, tree_node*
(*)(gimple_stmt_iterator*, bool*, walk_stmt_info*), tree_node* (*)(tree_node**,
int*, void*), walk_stmt_info*)
/usr/src/gcc-5.1.0/gcc/gimple-walk.c:72
0x97b7b1 walk_body
/usr/src/gcc-5.1.0/gcc/tree-nested.c:628
0x97ba5e walk_function
/usr/src/gcc-5.1.0/gcc/tree-nested.c:639
0x97ba5e walk_all_functions
/usr/src/gcc-5.1.0/gcc/tree-nested.c:704
0x97d2c7 lower_nested_functions(tree_node*)
/usr/src/gcc-5.1.0/gcc/tree-nested.c:3008
0x608d7b cgraph_node::analyze()
/usr/src/gcc-5.1.0/gcc/cgraphunit.c:640
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
For gcc-5.2.0 on another machine, I just get
gfortran-ice.f90: In function 'fancy':
gfortran-ice.f90:16:0: internal compiler error: Segmentation fault
function fancy()
^
Please submit a full bug report,
All versions down to SuSE's gcc-4.1.2 have some variant of ICE.
More information about the Gcc-bugs
mailing list