re PR fortran/27900 ([4.1 only] ICE using intrinsics as arguments)
2006-12-31 Paul Thomas <pault@gcc.gnu.org> PR fortran/27900 * resolve.c (resolve_actual_arglist): If all else fails and a procedure actual argument has no type, see if a specific intrinsic matches. PR fortran/24325 * resolve.c (resolve_function): If the function reference is FL_VARIABLE this is an error. 2006-12-31 Paul Thomas <pault@gcc.gnu.org> PR fortran/27900 * gfortran.dg/intrinsic_actual_4.f90: New test. PR fortran/24325 * gfortran.dg/func_decl_3.f90: New test. From-SVN: r120296
This commit is contained in:
parent
7fcafa718d
commit
20a037d5f5
|
@ -1,3 +1,14 @@
|
|||
2006-12-31 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/27900
|
||||
* resolve.c (resolve_actual_arglist): If all else fails and a
|
||||
procedure actual argument has no type, see if a specific
|
||||
intrinsic matches.
|
||||
|
||||
PR fortran/24325
|
||||
* resolve.c (resolve_function): If the function reference is
|
||||
FL_VARIABLE this is an error.
|
||||
|
||||
2006-12-31 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/23060
|
||||
|
|
|
@ -140,6 +140,21 @@ resolve_formal_arglist (gfc_symbol * proc)
|
|||
continue;
|
||||
}
|
||||
|
||||
if (sym->attr.function
|
||||
&& sym->ts.type == BT_UNKNOWN
|
||||
&& sym->attr.intrinsic)
|
||||
{
|
||||
gfc_intrinsic_sym *isym;
|
||||
isym = gfc_find_function (sym->name);
|
||||
if (isym == NULL || !isym->specific)
|
||||
{
|
||||
gfc_error ("Unable to find a specific INTRINSIC procedure "
|
||||
"for the reference '%s' at %L", sym->name,
|
||||
&sym->declared_at);
|
||||
}
|
||||
sym->ts = isym->ts;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -937,6 +952,21 @@ resolve_actual_arglist (gfc_actual_arglist * arg, procedure_type ptype)
|
|||
&& sym->ns->parent->proc_name == sym)))
|
||||
goto got_variable;
|
||||
|
||||
/* If all else fails, see if we have a specific intrinsic. */
|
||||
if (sym->attr.function
|
||||
&& sym->ts.type == BT_UNKNOWN
|
||||
&& sym->attr.intrinsic)
|
||||
{
|
||||
gfc_intrinsic_sym *isym;
|
||||
isym = gfc_find_function (sym->name);
|
||||
if (isym == NULL || !isym->specific)
|
||||
{
|
||||
gfc_error ("Unable to find a specific INTRINSIC procedure "
|
||||
"for the reference '%s' at %L", sym->name,
|
||||
&e->where);
|
||||
}
|
||||
sym->ts = isym->ts;
|
||||
}
|
||||
goto argument_list;
|
||||
}
|
||||
|
||||
|
@ -1512,6 +1542,13 @@ resolve_function (gfc_expr * expr)
|
|||
if (expr->symtree)
|
||||
sym = expr->symtree->n.sym;
|
||||
|
||||
if (sym && sym->attr.flavor == FL_VARIABLE)
|
||||
{
|
||||
gfc_error ("'%s' at %L is not a function",
|
||||
sym->name, &expr->where);
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
/* If the procedure is not internal, a statement function or a module
|
||||
procedure,it must be external and should be checked for usage. */
|
||||
if (sym && !sym->attr.dummy && !sym->attr.contained
|
||||
|
|
|
@ -1,3 +1,11 @@
|
|||
2006-12-31 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/27900
|
||||
* gfortran.dg/intrinsic_actual_4.f90: New test.
|
||||
|
||||
PR fortran/24325
|
||||
* gfortran.dg/func_decl_3.f90: New test.
|
||||
|
||||
2006-12-31 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/23060
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
! { dg-do compile }
|
||||
! Tests the fix for PR24325 in which the lack of any declaration
|
||||
! that foo is a function or even a procedure was not detected.
|
||||
!
|
||||
! Contributed by Jakub Jelinek <jakub@gcc.gnu.org>
|
||||
!
|
||||
integer foo
|
||||
call test
|
||||
contains
|
||||
subroutine test
|
||||
integer :: i
|
||||
i = foo () ! { dg-error "is not a function" }
|
||||
end subroutine test
|
||||
end
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
! { dg-do run }
|
||||
! Tests the fix for PR27900, in which an ICE would be caused because
|
||||
! the actual argument LEN had no type.
|
||||
!
|
||||
! Contributed by Klaus Ramstöck <klra67@freenet.de>
|
||||
!
|
||||
subroutine sub (proc, chr)
|
||||
external proc
|
||||
integer proc
|
||||
character*(*) chr
|
||||
if (proc (chr) .ne. 6) call abort ()
|
||||
end subroutine sub
|
||||
|
||||
implicit none
|
||||
integer i
|
||||
i = len ("123")
|
||||
call sub (len, "abcdef")
|
||||
end
|
Loading…
Reference in New Issue