[Bug fortran/48112] [4.6/4.7 Regression] generic interface to external function in module
burnus at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Apr 26 10:19:00 GMT 2011
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48112
--- Comment #4 from Tobias Burnus <burnus at gcc dot gnu.org> 2011-04-26 10:18:23 UTC ---
Rev. 159475 works, Rev. 159476 fails, which is the following commit:
URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=159476
Log:
2010-05-17 Janus Weil <janus@gcc.gnu.org>
PR fortran/44044
* resolve.c (resolve_fl_var_and_proc): Move error messages here from ...
(resolve_fl_variable_derived): ... this place.
(resolve_symbol): Make sure function symbols (and their result
variables) are not resolved twice.
The crucial part of the patch is:
+ /* Avoid double resolution of function result symbols. */
+ if ((sym->result || sym->attr.result) && (sym->ns != gfc_current_ns))
+ return;
* * *
If one places a break point, one sees first:
(gdb) p sym->name
$5 = 0x2aaaaab40ea8 "test1"
(gdb) p sym->ns->sym_root->name
$8 = 0x2aaaaab40ea8 "test1"
(gdb) p ((sym->result || sym->attr.result) && (sym->ns != gfc_current_ns))
$10 = 0
and then next:
(gdb) p sym->name
$14 = 0x2aaaaab40ea0 "test"
(gdb) p sym->ns->sym_root->name
$15 = 0x2aaaaab40ea0 "test"
(gdb) p gfc_current_ns->sym_root->name
$16 = 0x2aaaaab40ea8 "test1"
And hence:
(gdb) p ((sym->result || sym->attr.result) && (sym->ns != gfc_current_ns))
$17 = 1
and finally:
(gdb) p sym->name
$26 = 0x2aaaaab40ea8 "test1"
(gdb) p sym->ns->sym_root->name
$27 = 0x2aaaaab40ea8 "test1"
(gdb) p gfc_current_ns->sym_root->name
$28 = 0x2aaaaab40ea0 "test"
(gdb) p ((sym->result || sym->attr.result) && (sym->ns != gfc_current_ns))
$25 = 1
Seemingly, the ICE occurs unless both resolutions happen.
(I wonder whether one could use {sym->ns,gfc_current_namespace}->resolved to
decide whether one should continue or not; currently, one finds the values "-1"
and "0".)
More information about the Gcc-bugs
mailing list