[patch, fortran] Fix ICE on invalid, PR 94090
Fritz Reese
fritzoreese@gmail.com
Wed Apr 15 15:54:48 GMT 2020
> Yes. Looking back at the code, I think it can also be cleaned up
> a little - turning the error to warnings is only needed on that
> particular branch, and resetting it to the default can also
> happen there, and at the target of a goto statement.
>
> So, here's an updated patch. OK for trunk?
>
> Regards
>
> Thomas
Looks great, thank you for the cleanup!
While you're touching the code anyway, how would you feel about
replacing the nearby "goto done"s with a chain of "else if"? There's
really no reason I can see for goto here, since the block following
the conditions is already "done". Here (and attached) is a diff on top
of your latest changes, in case you think it's appropriate:
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 2371ab23645..617e8d01a59 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -2511,6 +2511,7 @@ resolve_global_procedure (gfc_symbol *sym, locus
*where, int sub)
gfc_namespace *ns;
enum gfc_symbol_type type;
char reason[200];
+ bool bad_result_characteristics;
type = sub ? GSYM_SUBROUTINE : GSYM_FUNCTION;
@@ -2586,23 +2587,16 @@ resolve_global_procedure (gfc_symbol *sym,
locus *where, int sub)
}
if (sym->attr.function && !gfc_compare_types (&sym->ts, &def_sym->ts))
- {
- gfc_error ("Return type mismatch of function %qs at %L (%s/%s)",
- sym->name, &sym->declared_at, gfc_typename (&sym->ts),
- gfc_typename (&def_sym->ts));
- goto done;
- }
+ gfc_error ("Return type mismatch of function %qs at %L (%s/%s)",
+ sym->name, &sym->declared_at, gfc_typename (&sym->ts),
+ gfc_typename (&def_sym->ts));
- if (sym->attr.if_source == IFSRC_UNKNOWN
+ else if (sym->attr.if_source == IFSRC_UNKNOWN
&& gfc_explicit_interface_required (def_sym, reason, sizeof(reason)))
- {
- gfc_error ("Explicit interface required for %qs at %L: %s",
- sym->name, &sym->declared_at, reason);
- goto done;
- }
+ gfc_error ("Explicit interface required for %qs at %L: %s",
+ sym->name, &sym->declared_at, reason);
- bool bad_result_characteristics;
- if (!gfc_compare_interfaces (sym, def_sym, sym->name, 0, 1,
+ else if (!gfc_compare_interfaces (sym, def_sym, sym->name, 0, 1,
reason, sizeof(reason), NULL, NULL,
&bad_result_characteristics))
{
@@ -2617,12 +2611,9 @@ resolve_global_procedure (gfc_symbol *sym,
locus *where, int sub)
gfc_error ("Interface mismatch in global procedure %qs at %L: %s",
sym->name, &sym->declared_at, reason);
gfc_errors_to_warnings (false);
- goto done;
}
}
-done:
-
if (gsym->type == GSYM_UNKNOWN)
{
gsym->type = type;
---
Even if you don't want to include this, your patch LGTM. Thanks again.
---
Fritz Reese
-------------- next part --------------
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 2371ab23645..617e8d01a59 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -2511,6 +2511,7 @@ resolve_global_procedure (gfc_symbol *sym, locus *where, int sub)
gfc_namespace *ns;
enum gfc_symbol_type type;
char reason[200];
+ bool bad_result_characteristics;
type = sub ? GSYM_SUBROUTINE : GSYM_FUNCTION;
@@ -2586,23 +2587,16 @@ resolve_global_procedure (gfc_symbol *sym, locus *where, int sub)
}
if (sym->attr.function && !gfc_compare_types (&sym->ts, &def_sym->ts))
- {
- gfc_error ("Return type mismatch of function %qs at %L (%s/%s)",
- sym->name, &sym->declared_at, gfc_typename (&sym->ts),
- gfc_typename (&def_sym->ts));
- goto done;
- }
+ gfc_error ("Return type mismatch of function %qs at %L (%s/%s)",
+ sym->name, &sym->declared_at, gfc_typename (&sym->ts),
+ gfc_typename (&def_sym->ts));
- if (sym->attr.if_source == IFSRC_UNKNOWN
+ else if (sym->attr.if_source == IFSRC_UNKNOWN
&& gfc_explicit_interface_required (def_sym, reason, sizeof(reason)))
- {
- gfc_error ("Explicit interface required for %qs at %L: %s",
- sym->name, &sym->declared_at, reason);
- goto done;
- }
+ gfc_error ("Explicit interface required for %qs at %L: %s",
+ sym->name, &sym->declared_at, reason);
- bool bad_result_characteristics;
- if (!gfc_compare_interfaces (sym, def_sym, sym->name, 0, 1,
+ else if (!gfc_compare_interfaces (sym, def_sym, sym->name, 0, 1,
reason, sizeof(reason), NULL, NULL,
&bad_result_characteristics))
{
@@ -2617,12 +2611,9 @@ resolve_global_procedure (gfc_symbol *sym, locus *where, int sub)
gfc_error ("Interface mismatch in global procedure %qs at %L: %s",
sym->name, &sym->declared_at, reason);
gfc_errors_to_warnings (false);
- goto done;
}
}
-done:
-
if (gsym->type == GSYM_UNKNOWN)
{
gsym->type = type;
More information about the Gcc-patches
mailing list