Commit 866664a3 by Thomas Koenig

re PR fortran/78865 (ICE in create_tmp_var, at gimple-expr.c:473)

2019-03-24  Thomas Koenig  <tkoenig@gcc.gnu.org>

	PR fortran/78865
	* interface.c (compare_actual_formal): Change errors about
	missing or extra to gfc_error_now to make sure they are issued.
	Change "spec" to "specifier" in message.
	* resolve.c (resolve_global_procedure): Also check for mismatching
	interface with global symbols if the namespace has already been
	resolved.

2019-03-24  Thomas Koenig  <tkoenig@gcc.gnu.org>

	PR fortran/78865
	* gfortran.dg/altreturn_10.f90: New test.
	* gfortran.dg/whole_file_3.f90: Change dg-warning to dg-error.

From-SVN: r269895
parent c1e62ea1
2019-03-24 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/78865
* interface.c (compare_actual_formal): Change errors about
missing or extra to gfc_error_now to make sure they are issued.
Change "spec" to "specifier" in message.
* resolve.c (resolve_global_procedure): Also check for mismatching
interface with global symbols if the namespace has already been
resolved.
2019-03-21 Thomas Schwinge <thomas@codesourcery.com> 2019-03-21 Thomas Schwinge <thomas@codesourcery.com>
PR fortran/72741 PR fortran/72741
......
...@@ -2969,17 +2969,19 @@ compare_actual_formal (gfc_actual_arglist **ap, gfc_formal_arglist *formal, ...@@ -2969,17 +2969,19 @@ compare_actual_formal (gfc_actual_arglist **ap, gfc_formal_arglist *formal,
if (f->sym == NULL) if (f->sym == NULL)
{ {
/* These errors have to be issued, otherwise an ICE can occur.
See PR 78865. */
if (where) if (where)
gfc_error ("Missing alternate return spec in subroutine call " gfc_error_now ("Missing alternate return specifier in subroutine "
"at %L", where); "call at %L", where);
return false; return false;
} }
if (a->expr == NULL) if (a->expr == NULL)
{ {
if (where) if (where)
gfc_error ("Unexpected alternate return spec in subroutine " gfc_error_now ("Unexpected alternate return specifier in "
"call at %L", where); "subroutine call at %L", where);
return false; return false;
} }
......
...@@ -2498,62 +2498,64 @@ resolve_global_procedure (gfc_symbol *sym, locus *where, ...@@ -2498,62 +2498,64 @@ resolve_global_procedure (gfc_symbol *sym, locus *where,
&& gsym->type != GSYM_UNKNOWN && gsym->type != GSYM_UNKNOWN
&& !gsym->binding_label && !gsym->binding_label
&& gsym->ns && gsym->ns
&& gsym->ns->resolved != -1
&& gsym->ns->proc_name && gsym->ns->proc_name
&& not_in_recursive (sym, gsym->ns) && not_in_recursive (sym, gsym->ns)
&& not_entry_self_reference (sym, gsym->ns)) && not_entry_self_reference (sym, gsym->ns))
{ {
gfc_symbol *def_sym; gfc_symbol *def_sym;
def_sym = gsym->ns->proc_name;
/* Resolve the gsymbol namespace if needed. */ if (gsym->ns->resolved != -1)
if (!gsym->ns->resolved)
{ {
gfc_symbol *old_dt_list;
/* Stash away derived types so that the backend_decls do not /* Resolve the gsymbol namespace if needed. */
get mixed up. */ if (!gsym->ns->resolved)
old_dt_list = gfc_derived_types; {
gfc_derived_types = NULL; gfc_symbol *old_dt_list;
gfc_resolve (gsym->ns); /* Stash away derived types so that the backend_decls
do not get mixed up. */
old_dt_list = gfc_derived_types;
gfc_derived_types = NULL;
/* Store the new derived types with the global namespace. */ gfc_resolve (gsym->ns);
if (gfc_derived_types)
gsym->ns->derived_types = gfc_derived_types;
/* Restore the derived types of this namespace. */ /* Store the new derived types with the global namespace. */
gfc_derived_types = old_dt_list; if (gfc_derived_types)
} gsym->ns->derived_types = gfc_derived_types;
/* Make sure that translation for the gsymbol occurs before /* Restore the derived types of this namespace. */
the procedure currently being resolved. */ gfc_derived_types = old_dt_list;
ns = gfc_global_ns_list;
for (; ns && ns != gsym->ns; ns = ns->sibling)
{
if (ns->sibling == gsym->ns)
{
ns->sibling = gsym->ns->sibling;
gsym->ns->sibling = gfc_global_ns_list;
gfc_global_ns_list = gsym->ns;
break;
} }
}
def_sym = gsym->ns->proc_name; /* Make sure that translation for the gsymbol occurs before
the procedure currently being resolved. */
ns = gfc_global_ns_list;
for (; ns && ns != gsym->ns; ns = ns->sibling)
{
if (ns->sibling == gsym->ns)
{
ns->sibling = gsym->ns->sibling;
gsym->ns->sibling = gfc_global_ns_list;
gfc_global_ns_list = gsym->ns;
break;
}
}
/* This can happen if a binding name has been specified. */ /* This can happen if a binding name has been specified. */
if (gsym->binding_label && gsym->sym_name != def_sym->name) if (gsym->binding_label && gsym->sym_name != def_sym->name)
gfc_find_symbol (gsym->sym_name, gsym->ns, 0, &def_sym); gfc_find_symbol (gsym->sym_name, gsym->ns, 0, &def_sym);
if (def_sym->attr.entry_master) if (def_sym->attr.entry_master)
{ {
gfc_entry_list *entry; gfc_entry_list *entry;
for (entry = gsym->ns->entries; entry; entry = entry->next) for (entry = gsym->ns->entries; entry; entry = entry->next)
if (strcmp (entry->sym->name, sym->name) == 0) if (strcmp (entry->sym->name, sym->name) == 0)
{ {
def_sym = entry->sym; def_sym = entry->sym;
break; break;
} }
}
} }
if (sym->attr.function && !gfc_compare_types (&sym->ts, &def_sym->ts)) if (sym->attr.function && !gfc_compare_types (&sym->ts, &def_sym->ts))
......
2019-03-24 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/78865
* interface.c (compare_actual_formal): Change errors about
missing or extra to gfc_error_now to make sure they are issued.
Change "spec" to "specifier" in message.
* resolve.c (resolve_global_procedure): Also check for mismatching
interface with global symbols if the namespace has already been
resolved.
2019-03-22 Vladimir Makarov <vmakarov@redhat.com> 2019-03-22 Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/89676 PR rtl-optimization/89676
......
! { dg-do compile }
! { dg-options -Os }
! PR 78865 - this used to ICE.
program p
call sub (3)
end
subroutine sub (x)
integer :: x, i, n
do i = 1, x
if ( n /= 0 ) stop
call sub2
end do
print *, x, n
end
subroutine sub2
call sub (*99) ! { dg-error "Unexpected alternate return specifier" }
call sub (99.) ! { dg-warning "Type mismatch in argument" }
99 stop
end
...@@ -14,8 +14,8 @@ ...@@ -14,8 +14,8 @@
program test program test
EXTERNAL R EXTERNAL R
call PHLOAD (R, 1) ! { dg-warning "Missing alternate return spec" } call PHLOAD (R, 1) ! { dg-error "Missing alternate return specifier" }
CALL PHLOAD (R, 2) ! { dg-warning "Missing alternate return spec" } CALL PHLOAD (R, 2) ! { dg-error "Missing alternate return specifier" }
CALL PHLOAD (R, *999) ! This one is OK CALL PHLOAD (R, *999) ! This one is OK
999 continue 999 continue
END program test END program test
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment