[Patch, fortran] PR54107: ICE on recursive interfaces and PR54195: symbol bogusly inserted twice in the interface.
Mikael Morin
mikael.morin@sfr.fr
Sun Feb 3 21:35:00 GMT 2013
Hello,
The following patches fix both PR54107 and PR54195.
- In PR54107(comment 26), the procedure result is a procedure pointer
whose interface is the procedure itself, which leads to an infinite
recursion during resolution.
- In PR54195, a type's type bound procedures are resolved twice, leading
to a symbol being added twice in an interface and rejected.
The fix, as discussed in PR54195, adds a flag to mark a symbol as
resolved. This leads to two regressions. For class_20, a check to skip
result symbols had to be removed (which was there to avoid duplicated
resolution). For initialization_27 (among a few others) the code adding
the default initialization code was guarded by a check against
gfc_current_ns, which always ended triggering when there was more than
one resolution but may not anymore. The fix removes it; I checked that
gfc_current_ns wasn't used in the following code.
The second fix makes the recursion through resolve_symbol, so that the
flag just added triggers and PR54195 is fixed.
Regression tested on x86_64-unknown-linux-gnu. OK for trunk?
Mikael
-------------- next part --------------
2013-02-03 Mikael Morin <mikael@gcc.gnu.org>
PR fortran/54107
PR fortran/54195
* gfortran.h (struct symbol_attribute): New field 'resolved'.
* resolve.c (resolve_fl_var_and_proc): Don't skip result symbols.
(resolve_symbol): Skip duplicate calls. Don' check the current
namespace.
2013-02-03 Mikael Morin <mikael@gcc.gnu.org>
PR fortran/54107
* gfortran.dg/recursive_interface_1.f90: New test.
-------------- next part --------------
diff --git a/gfortran.h b/gfortran.h
index 16751b4..af2b45a 100644
--- a/gfortran.h
+++ b/gfortran.h
@@ -810,6 +810,9 @@ typedef struct
/* Attributes set by compiler extensions (!GCC$ ATTRIBUTES). */
unsigned ext_attr:EXT_ATTR_NUM;
+ /* Used to avoid multiple resolutions of a single symbol. */
+ unsigned resolved:1;
+
/* The namespace where the attribute has been set. */
struct gfc_namespace *volatile_ns, *asynchronous_ns;
}
diff --git a/resolve.c b/resolve.c
index d6bae43..3b74c6f 100644
--- a/resolve.c
+++ b/resolve.c
@@ -11051,11 +11051,6 @@ resolve_fl_var_and_proc (gfc_symbol *sym, int mp_flag)
{
gfc_array_spec *as;
- /* Avoid double diagnostics for function result symbols. */
- if ((sym->result || sym->attr.result) && !sym->attr.dummy
- && (sym->ns != gfc_current_ns))
- return SUCCESS;
-
if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
as = CLASS_DATA (sym)->as;
else
@@ -13170,6 +13165,10 @@ resolve_symbol (gfc_symbol *sym)
gfc_array_spec *as;
bool saved_specification_expr;
+ if (sym->attr.resolved)
+ return;
+ sym->attr.resolved = 1;
+
if (sym->attr.artificial)
return;
@@ -13779,7 +13778,6 @@ resolve_symbol (gfc_symbol *sym)
described in 14.7.5, to those variables that have not already
been assigned one. */
if (sym->ts.type == BT_DERIVED
- && sym->ns == gfc_current_ns
&& !sym->value
&& !sym->attr.allocatable
&& !sym->attr.alloc_comp)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: recursive_interface_1.f90
Type: text/x-fortran
Size: 373 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20130203/6c10af55/attachment.bin>
-------------- next part --------------
2013-02-03 Mikael Morin <mikael@gcc.gnu.org>
PR fortran/54195
* resolve.c (resolve_typebound_procedures): Recurse through
resolve_symbol.
2013-02-03 Mikael Morin <mikael@gcc.gnu.org>
PR fortran/54195
* gfortran.dg/defined_assignment_4.f90: New test.
* gfortran.dg/defined_assignment_5.f90: New test.
-------------- next part --------------
diff --git a/resolve.c b/resolve.c
index 3b74c6f..6bec662 100644
--- a/resolve.c
+++ b/resolve.c
@@ -12344,7 +12344,7 @@ resolve_typebound_procedures (gfc_symbol* derived)
super_type = gfc_get_derived_super_type (derived);
if (super_type)
- resolve_typebound_procedures (super_type);
+ resolve_symbol (super_type);
resolve_bindings_derived = derived;
resolve_bindings_result = SUCCESS;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: typebound_assignment_4.f90
Type: text/x-fortran
Size: 553 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20130203/6c10af55/attachment-0001.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: typebound_assignment_5.f90
Type: text/x-fortran
Size: 635 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20130203/6c10af55/attachment-0002.bin>
More information about the Gcc-patches
mailing list