Commit b00802f5 by Steven G. Kargl

re PR fortran/68544 (ICE trying to pass derived type constructor as a function)

2019-06-13  Steven G. Kargl  <kargl@gcc.gnu.org>

	PR fortran/68544
	* resolve.c (is_dt_name): New function to compare symbol name against
	list of derived types.
	(resolve_actual_arglist): Use it to find wrong code.

2019-06-13  Steven G. Kargl  <kargl@gcc.gnu.org>

	PR fortran/68544
	* gfortran.dg/pr68544.f90: New test.
	* gfortran.dg/pr85687.f90: Modify test for new error message.

From-SVN: r272259
parent 19c6bc40
2019-06-12 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/68544
* resolve.c (is_dt_name): New function to compare symbol name against
list of derived types.
(resolve_actual_arglist): Use it to find wrong code.
2019-06-13 Steven G. Kargl <kargl@gcc.gnu.org> 2019-06-13 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/89344 PR fortran/89344
......
...@@ -1862,6 +1862,25 @@ resolve_procedure_expression (gfc_expr* expr) ...@@ -1862,6 +1862,25 @@ resolve_procedure_expression (gfc_expr* expr)
} }
/* Check that name is not a derived type. */
static bool
is_dt_name (const char *name)
{
gfc_symbol *dt_list, *dt_first;
dt_list = dt_first = gfc_derived_types;
for (; dt_list; dt_list = dt_list->dt_next)
{
if (strcmp(dt_list->name, name) == 0)
return true;
if (dt_first == dt_list->dt_next)
break;
}
return false;
}
/* Resolve an actual argument list. Most of the time, this is just /* Resolve an actual argument list. Most of the time, this is just
resolving the expressions in the list. resolving the expressions in the list.
The exception is that we sometimes have to decide whether arguments The exception is that we sometimes have to decide whether arguments
...@@ -1923,6 +1942,13 @@ resolve_actual_arglist (gfc_actual_arglist *arg, procedure_type ptype, ...@@ -1923,6 +1942,13 @@ resolve_actual_arglist (gfc_actual_arglist *arg, procedure_type ptype,
sym = e->symtree->n.sym; sym = e->symtree->n.sym;
if (sym->attr.flavor == FL_PROCEDURE && is_dt_name (sym->name))
{
gfc_error ("Derived type %qs is used as an actual "
"argument at %L", sym->name, &e->where);
goto cleanup;
}
if (sym->attr.flavor == FL_PROCEDURE if (sym->attr.flavor == FL_PROCEDURE
|| sym->attr.intrinsic || sym->attr.intrinsic
|| sym->attr.external) || sym->attr.external)
......
2019-06-13 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/68544
* gfortran.dg/pr68544.f90: New test.
* gfortran.dg/pr85687.f90: Modify test for new error message.
2019-06-13 Iain Sandoe <iain@sandoe.co.uk> 2019-06-13 Iain Sandoe <iain@sandoe.co.uk>
* g++.dg/pr71694.C: Use non-PIC codegen for Darwin m32. * g++.dg/pr71694.C: Use non-PIC codegen for Darwin m32.
......
! { dg-do compile }
! PF fortran/68544
program p
real x
type t
end type
x = f(t) ! { dg-error "used as an actual argument" }
end
subroutine b
type t
end type
print *, shape(t) ! { dg-error "used as an actual argument" }
end
...@@ -4,5 +4,5 @@ ...@@ -4,5 +4,5 @@
program p program p
type t type t
end type end type
print *, rank(t) ! { dg-error "must be a data object" } print *, rank(t) ! { dg-error "used as an actual argument" }
end end
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