diff options
-rw-r--r-- | gcc/fortran/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/fortran/resolve.c | 56 |
2 files changed, 51 insertions, 13 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 34f1cb2180f..0bdbefdb6e2 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +2006-02-05 H.J. Lu <hongjiu.lu@intel.com> + + PR fortran/26041 + PR fortran/26064 + * resolve.c (resolve_types): New function. + (resolve_codes): Likewise. + (gfc_resolve): Use them. + 2006-02-05 Roger Sayle <roger@eyesopen.com> * trans-stmt.c (gfc_evaluate_where_mask): Use LOGICAL*1 for WHERE diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 474030b1e71..2a964f74bb2 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -5793,21 +5793,20 @@ resolve_fntype (gfc_namespace * ns) } -/* This function is called after a complete program unit has been compiled. - Its purpose is to examine all of the expressions associated with a program - unit, assign types to all intermediate expressions, make sure that all - assignments are to compatible types and figure out which names refer to - which functions or subroutines. */ +/* Examine all of the expressions associated with a program unit, + assign types to all intermediate expressions, make sure that all + assignments are to compatible types and figure out which names + refer to which functions or subroutines. It doesn't check code + block, which is handled by resolve_code. */ -void -gfc_resolve (gfc_namespace * ns) +static void +resolve_types (gfc_namespace * ns) { - gfc_namespace *old_ns, *n; + gfc_namespace *n; gfc_charlen *cl; gfc_data *d; gfc_equiv *eq; - old_ns = gfc_current_ns; gfc_current_ns = ns; resolve_entries (ns); @@ -5825,7 +5824,7 @@ gfc_resolve (gfc_namespace * ns) "also be PURE", n->proc_name->name, &n->proc_name->declared_at); - gfc_resolve (n); + resolve_types (n); } forall_flag = 0; @@ -5849,12 +5848,43 @@ gfc_resolve (gfc_namespace * ns) for (eq = ns->equiv; eq; eq = eq->next) resolve_equivalence (eq); - cs_base = NULL; - resolve_code (ns->code, ns); - /* Warn about unused labels. */ if (gfc_option.warn_unused_labels) warn_unused_label (ns->st_labels); +} + + +/* Call resolve_code recursively. */ + +static void +resolve_codes (gfc_namespace * ns) +{ + gfc_namespace *n; + + for (n = ns->contained; n; n = n->sibling) + resolve_codes (n); + + gfc_current_ns = ns; + cs_base = NULL; + resolve_code (ns->code, ns); +} + + +/* This function is called after a complete program unit has been compiled. + Its purpose is to examine all of the expressions associated with a program + unit, assign types to all intermediate expressions, make sure that all + assignments are to compatible types and figure out which names refer to + which functions or subroutines. */ + +void +gfc_resolve (gfc_namespace * ns) +{ + gfc_namespace *old_ns; + + old_ns = gfc_current_ns; + + resolve_types (ns); + resolve_codes (ns); gfc_current_ns = old_ns; } |