In "gcc version 4.0.0 20041009 (experimental)", the "equivalence" statement no longer works. (I think it used to work). This is what I get: [olchansk@tw15 gfortran_test]$ cat test_equiv.f90 module test_equiv implicit none private real a(100) integer b(100) ! Following error, unless "equivalence" is removed: ! /triumfcs/trshare/olchansk/gcc-tree-ssa/install/bin/gfortran -x f95 -c -o test_equiv.o -O2 -g -Wall -Waliasing -Wline-truncation -Wsurprising -Wunused-labels -fPIC -ffixed-line-length-132 test_equiv.f90 ! test_equiv.f90:0: internal compiler error: backend decl for module variable a already exists ! Please submit a full bug report, ! with preprocessed source if appropriate. ! See <URL:http://gcc.gnu.org/bugs.html> for instructions. equivalence (a(1),b(1)) end module test_equiv [olchansk@tw15 gfortran_test]$ make test_equiv.o /triumfcs/trshare/olchansk/gcc-tree-ssa/install/bin/gfortran -x f95 -c -o test_equiv.o -O2 -g -Wall -Waliasing -Wline-truncation -Wsurprising -Wunused-labels -fPIC -ffixed-line-length-132 test_equiv.f90 Warning: test_equiv.f90:9: Line is being truncated test_equiv.f90:0: internal compiler error: backend decl for module variable a already exists Please submit a full bug report, with preprocessed source if appropriate. See <URL:http://gcc.gnu.org/bugs.html> for instructions. make: *** [test_equiv.o] Error 1 [olchansk@tw15 gfortran_test]$ /triumfcs/trshare/olchansk/gcc-tree-ssa/install/bin/gfortran -v Reading specs from /triumfcs/trshare/olchansk/gcc-tree-ssa/install-20041008/lib/gcc/i686-pc-linux-gnu/4.0.0/specs Configured with: ../gcc/configure --prefix=/triumfcs/trshare/olchansk/gcc-tree-ssa/install-20041008 --with-mpfr-dir=/triumfcs/trshare/olchansk/gcc-tree-ssa/mpfr/mpfr-2.0.3 --with-gmp-dir=/triumfcs/trshare/olchansk/gcc-tree-ssa/mpfr/gmp-4.1.3 --enable-languages=c,f95 Thread model: posix gcc version 4.0.0 20041009 (experimental) K.O.
Confirmed.
This works with: [tobi@marktplatz tests]$ /home/tobi/tmp/gcc/build/gcc/f951 pr17917.f90 Execution times (seconds) parser : 0.00 ( 0%) usr 0.01 (100%) sys 0.06 (15%) wall varconst : 0.00 ( 0%) usr 0.00 ( 0%) sys 0.01 ( 2%) wall TOTAL : 0.02 0.01 0.41 Extra diagnostic checks enabled; compiler may run slowly. Configure with --disable-checking to disable checks. [tobi@marktplatz tests]$ /home/tobi/tmp/gcc/build/gcc/f951 --version GNU F95 version 3.5.0 20040630 (experimental) (i686-pc-linux-gnu) compiled by GNU C version 3.5.0 20040623 (experimental). GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096 [tobi@marktplatz tests]$ And is broken with: [tobi@marktplatz tests]$ /home/tobi/usr/libexec/gcc/i686-pc-linux-gnu/3.5.0/f951 pr17917.f90 pr17917.f90:0: internal compiler error: backend decl for module variable a already exists Please submit a full bug report, with preprocessed source if appropriate. See <URL:http://gcc.gnu.org/bugs.html> for instructions. [tobi@marktplatz tests]$ /home/tobi/usr/libexec/gcc/i686-pc-linux-gnu/3.5.0/f951 --version GNU F95 version 3.5.0 20040829 (experimental) (i686-pc-linux-gnu) compiled by GNU C version 3.5.0 20040822 (experimental). GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096 So a change somewhere in between 2004-06-23 and 2004-08-22 must have caused this.
(In reply to comment #2) > So a change somewhere in between 2004-06-23 and 2004-08-22 must have caused this. ^^ make that 29
The most suspicious commits are: 2004-07-10 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de> Paul Brook <paul@codesourcery.com> PR fortran/13415 * trans-common.c (calculate_length): Remove ... (get_segment_info): Merge into here. Save field type. (build_field): Use saved type. (create_common, new_condition, new_segment, finish_equivalences): Use new get_segment_info. * trans-types.c: Update comment. 2004-07-10 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de> * trans-decl.c (gfc_create_module_variable): Nothing to do if symbol is in common, because we ... (gfc_generate_module_vars): Call gfc_trans_common.
(In reply to comment #1) > Confirmed. Note that this bug is provoked by this minimalist version of the above module test_equiv !Bug 17917 real a(2),b(4) equivalence (a(1),b(3)) end module test_equiv However, equivalence does what it should in programs, subroutines and functions. For example, this works correctly: PROGRAM test_equiv ! .not.Bug 17917 common b real a(2) INTEGER b(4) equivalence (a(1),b(3)) b=(/1,2,3,4/) PRINT *,a end PROGRAM test_equiv
This bug occurs also in a SPEC2004 candidate benchmark.
*** Bug 20146 has been marked as a duplicate of this bug. ***
hdf5 is also hitting this ICE.
Are there any workarounds we can use to avoid this problem? Also, is there anything we can do to help resolve it? Quincey Koziol HDF Development Team
*** Bug 21429 has been marked as a duplicate of this bug. ***
Patch posted here: http://gcc.gnu.org/ml/fortran/2005-06/msg00307.html
(In reply to comment #11) > Patch posted here: http://gcc.gnu.org/ml/fortran/2005-06/msg00307.html This is still not complete. The example below produces separate unions, which represent the equivalences, in sub1 and sub2. They need to be promoted to a more elevated namespace AND declared external, so that loaded procedures also pick up the same union. The COMMON code is mostly OK, so I will be applying that to module equivalences. I'm on to it, as promised on the list..... Paul T module equiv real :: x(10), y(2) equivalence (y(1), x(5)) end module equiv subroutine sub1 () use equiv x =(/(real (i), i = 1,10)/) end subroutine sub1 subroutine sub2 () use equiv print *, y end subroutine sub2 program test_equiv call sub1 () call sub2 () end program test_equiv
*** Bug 23641 has been marked as a duplicate of this bug. ***
*** Bug 23713 has been marked as a duplicate of this bug. ***
Subject: Bug 17917 CVSROOT: /cvs/gcc Module name: gcc Changes by: pault@gcc.gnu.org 2005-09-09 00:23:18 Modified files: gcc/fortran : gfortran.h match.c module.c primary.c trans-common.c trans-decl.c ChangeLog gcc/testsuite : ChangeLog Added files: gcc/testsuite/gfortran.dg: module_blank_common.f90 module_double_reuse.f90 common_equivalence_1.f common_equivalence_2.f common_equivalence_3.f contained_equivalence_1.f90 module_commons_1.f90 module_equivalence_1.f90 nested_modules_1.f90 Log message: 2005-09-09 Paul Thomas <pault@gcc.gnu.org> PR fortran/18878 * module.c (find_use_name_n): Based on original find_use_name. Either counts number of use names for a given real name or returns use name n. (find_use_name, number_use_names): Interfaces to the function find_use_name_n. (read_module): Add the logic and calls to these functions, so that mutiple reuses of the same real name are loaded. 2005-09-09 Paul Thomas <pault@gcc.gnu.org> PR fortran/22304 PR fortran/23270 PR fortran/18870 PR fortran/16511 PR fortran/17917 * gfortran.h: Move definition of BLANK_COMMON_NAME from trans- common.c so that it is accessible to module.c. Add common_head field to gfc_symbol structure. Add field for the equivalence name AND new attr field, in_equivalence. * match.c (gfc_match_common, gfc_match_equivalence): In loops that flag common block equivalences, emit an error if the common blocks are different, using sym->common_head as the common block identifier. Ensure that symbols that are equivalence associated with a common block are marked as being in_common. * module.c (write_blank_common): New. (write_common): Use unmangled common block name. (load_equiv): New function ported from g95. (read_module): Call load_equiv. (write_equiv): New function ported from g95. Correct string referencing for gfc functions. Give module equivalences a unique name. (write_module): Call write_equiv and write_blank_common. * primary.c (match_variable) Old gfc_match_variable, made static and third argument provided to indicate if parent namespace to be visited or not. (gfc_match_variable) New. Interface to match_variable. (gfc_match_equiv_variable) New. Interface to match_variable. * trans-common.c (finish_equivalences): Provide the call to create_common with a gfc_common_header so that module equivalences are made external, rather than local. (find_equivalences): Ensure that all members in common block equivalences are marked as used. This prevents the subsequent call to this function from making local unions. * trans-decl.c (gfc_generate_function_code): Move the call to gfc_generate_contained_functions to after the call to gfc_trans_common so the use-associated, contained common blocks produce the correct references. (gfc_create_module_variable): Return for equivalenced symbols with existing backend declaration. 2005-09-09 Paul Thomas <pault@gcc.gnu.org> PR fortran/18878 * gfortran.dg/module_double_reuse.f90: New. 2005-09-09 Paul Thomas <pault@gcc.gnu.org> PR fortran/23270 PR fortran/22304 PR fortran/18870 PR fortran/17917 PR fortran/16511 * gfortran.dg/common_equivalence_1.f: New. * gfortran.dg/common_equivalence_2.f: New. * gfortran.dg/common_equivalence_3.f: New. * gfortran.dg/contained_equivalence_1.f90: New. * gfortran.dg/module_blank_common.f90: New. * gfortran.dg/module_commons_1.f90: New. * gfortran.dg/module_equivalence_1.f90: New. * gfortran.dg/nested_modules_1.f90: New. * gfortran.dg/g77/19990905-0.f: Remove XFAIL, rearrange equivalences and add comment to connect the test with the PR. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fortran/gfortran.h.diff?cvsroot=gcc&r1=1.84&r2=1.85 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fortran/match.c.diff?cvsroot=gcc&r1=1.44&r2=1.45 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fortran/module.c.diff?cvsroot=gcc&r1=1.35&r2=1.36 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fortran/primary.c.diff?cvsroot=gcc&r1=1.35&r2=1.36 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fortran/trans-common.c.diff?cvsroot=gcc&r1=1.30&r2=1.31 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fortran/trans-decl.c.diff?cvsroot=gcc&r1=1.67&r2=1.68 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fortran/ChangeLog.diff?cvsroot=gcc&r1=1.543&r2=1.544 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/module_blank_common.f90.diff?cvsroot=gcc&r1=NONE&r2=1.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/module_double_reuse.f90.diff?cvsroot=gcc&r1=NONE&r2=1.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/common_equivalence_1.f.diff?cvsroot=gcc&r1=NONE&r2=1.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/common_equivalence_2.f.diff?cvsroot=gcc&r1=NONE&r2=1.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/common_equivalence_3.f.diff?cvsroot=gcc&r1=NONE&r2=1.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/contained_equivalence_1.f90.diff?cvsroot=gcc&r1=NONE&r2=1.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/module_commons_1.f90.diff?cvsroot=gcc&r1=NONE&r2=1.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/module_equivalence_1.f90.diff?cvsroot=gcc&r1=NONE&r2=1.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/nested_modules_1.f90.diff?cvsroot=gcc&r1=NONE&r2=1.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&r1=1.6033&r2=1.6034
Subject: Bug 17917 CVSROOT: /cvs/gcc Module name: gcc Branch: gcc-4_0-branch Changes by: pault@gcc.gnu.org 2005-09-09 09:06:09 Modified files: gcc/fortran : gfortran.h match.h match.c module.c primary.c trans-common.c trans-decl.c ChangeLog gcc/testsuite/gfortran.dg/g77: 19990905-0.f gcc/testsuite : ChangeLog Added files: gcc/testsuite/gfortran.dg: module_blank_common.f90 module_double_reuse.f90 common_equivalence_1.f common_equivalence_2.f common_equivalence_3.f contained_equivalence_1.f90 module_commons_1.f90 module_equivalence_1.f90 nested_modules_1.f90 Log message: 2005-09-09 Paul Thomas <pault@gcc.gnu.org> PR fortran/18878 * module.c (find_use_name_n): Based on original find_use_name. Either counts number of use names for a given real name or returns use name n. (find_use_name, number_use_names): Interfaces to the function find_use_name_n. (read_module): Add the logic and calls to these functions, so that mutiple reuses of the same real name are loaded. 2005-09-09 Paul Thomas <pault@gcc.gnu.org> PR fortran/22304 PR fortran/23270 PR fortran/18870 PR fortran/16511 PR fortran/17917 * gfortran.h: Move definition of BLANK_COMMON_NAME from trans- common.c so that it is accessible to module.c. Add common_head field to gfc_symbol structure. Add field for the equivalence name AND new attr field, in_equivalence. * match.c (gfc_match_common, gfc_match_equivalence): In loops that flag common block equivalences, emit an error if the common blocks are different, using sym->common_head as the common block identifier. Ensure that symbols that are equivalence associated with a common block are marked as being in_common. * module.c (write_blank_common): New. (write_common): Use unmangled common block name. (load_equiv): New function ported from g95. (read_module): Call load_equiv. (write_equiv): New function ported from g95. Correct string referencing for gfc functions. Give module equivalences a unique name. (write_module): Call write_equiv and write_blank_common. * primary.c (match_variable) Old gfc_match_variable, made static and third argument provided to indicate if parent namespace to be visited or not. (gfc_match_variable): New. Interface to match_variable. (gfc_match_equiv_variable): New. Interface to match_variable. * trans-common.c (finish_equivalences): Provide the call to create_common with a gfc_common_header so that module equivalences are made external, rather than local. (find_equivalences): Ensure that all members in common block equivalences are marked as used. This prevents the subsequent call to this function from making local unions. * trans-decl.c (gfc_generate_function_code): Move the call to gfc_generate_contained_functions to after the call to gfc_trans_common so the use-associated, contained common blocks produce the correct references. (gfc_create_module_variable): Return for equivalenced symbols with existing backend declaration. 2005-09-09 Paul Thomas <pault@gcc.gnu.org> PR fortran/18878 * gfortran.dg/module_double_reuse.f90: New. 2005-09-09 Paul Thomas <pault@gcc.gnu.org> PR fortran/23270 PR fortran/22304 PR fortran/18870 PR fortran/17917 PR fortran/16511 * gfortran.dg/common_equivalence_1.f: New. * gfortran.dg/common_equivalence_2.f: New. * gfortran.dg/common_equivalence_3.f: New. * gfortran.dg/contained_equivalence_1.f90: New. * gfortran.dg/module_blank_common.f90: New. * gfortran.dg/module_commons_1.f90: New. * gfortran.dg/module_equivalence_1.f90: New. * gfortran.dg/nested_modules_1.f90: New. * gfortran.dg/g77/19990905-0.f: Remove XFAIL, rearrange equivalences and add comment to connect the test with the PR. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fortran/gfortran.h.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.58.2.16&r2=1.58.2.17 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fortran/match.h.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.10.36.1&r2=1.10.36.2 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fortran/match.c.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.31.8.11&r2=1.31.8.12 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fortran/module.c.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.31.2.2&r2=1.31.2.3 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fortran/primary.c.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.22.2.10&r2=1.22.2.11 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fortran/trans-common.c.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.23.2.4&r2=1.23.2.5 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fortran/trans-decl.c.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.54.2.5&r2=1.54.2.6 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fortran/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.335.2.114&r2=1.335.2.115 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/module_blank_common.f90.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.2.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/module_double_reuse.f90.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.2.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/common_equivalence_1.f.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.2.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/common_equivalence_2.f.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.2.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/common_equivalence_3.f.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.2.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/contained_equivalence_1.f90.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.2.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/module_commons_1.f90.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.2.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/module_equivalence_1.f90.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.2.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/nested_modules_1.f90.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.2.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/g77/19990905-0.f.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.1&r2=1.1.48.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.5084.2.394&r2=1.5084.2.395
Fixed.