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>
|
2006-12-31 Paul Thomas <pault@gcc.gnu.org>
|
||||||
|
|
||||||
PR fortran/23060
|
PR fortran/23060
|
||||||
|
|
|
@ -140,6 +140,21 @@ resolve_formal_arglist (gfc_symbol * proc)
|
||||||
continue;
|
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;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -937,6 +952,21 @@ resolve_actual_arglist (gfc_actual_arglist * arg, procedure_type ptype)
|
||||||
&& sym->ns->parent->proc_name == sym)))
|
&& sym->ns->parent->proc_name == sym)))
|
||||||
goto got_variable;
|
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;
|
goto argument_list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1512,6 +1542,13 @@ resolve_function (gfc_expr * expr)
|
||||||
if (expr->symtree)
|
if (expr->symtree)
|
||||||
sym = expr->symtree->n.sym;
|
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
|
/* If the procedure is not internal, a statement function or a module
|
||||||
procedure,it must be external and should be checked for usage. */
|
procedure,it must be external and should be checked for usage. */
|
||||||
if (sym && !sym->attr.dummy && !sym->attr.contained
|
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>
|
2006-12-31 Paul Thomas <pault@gcc.gnu.org>
|
||||||
|
|
||||||
PR fortran/23060
|
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