Commit 9ebe2d22 by Paul Thomas

re PR fortran/28172 ([4.2 and 4.1 only] alternate return in contained procedure segfaults)

2007-01-15  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/28172
	* trans-stmt.c (gfc_trans_call): If it does not have one, get
	a backend_decl for an alternate return.

	PR fortran/29389
	* resolve.c (pure_function): Statement functions are pure. Note
	that this will have to recurse to comply fully with F95.

	PR fortran/29712
	* resolve.c (resolve_function): Only a reference to the final
	dimension of an assumed size array is an error in an inquiry
	function.

	PR fortran/30283
	* resolve.c (resolve_function): Make sure that the function
	expression has a type.

2007-01-15  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/28172
	* gfortran.dg/altreturn_4.f90: New test.

	PR fortran/29389
	* gfortran.dg/stfunc_4.f90: New test.

	PR fortran/29712
	* gfortran.dg/bound_2.f90: Reinstate commented out line.
	* gfortran.dg/initialization_1.f90: Change warning.

	PR fortran/30283
	* gfortran.dg/specification_type_resolution_2.f90: New test.

From-SVN: r120790
parent 32d6b8ae
2007-01-15 Paul Thomas <pault@gcc.gnu.org>
PR fortran/28172
* trans-stmt.c (gfc_trans_call): If it does not have one, get
a backend_decl for an alternate return.
PR fortran/29389
* resolve.c (pure_function): Statement functions are pure. Note
that this will have to recurse to comply fully with F95.
PR fortran/29712
* resolve.c (resolve_function): Only a reference to the final
dimension of an assumed size array is an error in an inquiry
function.
PR fortran/30283
* resolve.c (resolve_function): Make sure that the function
expression has a type.
2007-01-14 Paul Thomas <pault@gcc.gnu.org>
PR fortran/30410
......
......@@ -1501,6 +1501,11 @@ pure_function (gfc_expr * e, const char **name)
{
int pure;
if (e->symtree != NULL
&& e->symtree->n.sym != NULL
&& e->symtree->n.sym->attr.proc == PROC_ST_FUNCTION)
return 1;
if (e->value.function.esym)
{
pure = gfc_pure (e->value.function.esym);
......@@ -1654,9 +1659,15 @@ resolve_function (gfc_expr * expr)
for (arg = expr->value.function.actual; arg; arg = arg->next)
{
if (inquiry && arg->next != NULL && arg->next->expr
&& arg->next->expr->expr_type != EXPR_CONSTANT)
break;
if (inquiry && arg->next != NULL && arg->next->expr)
{
if (arg->next->expr->expr_type != EXPR_CONSTANT)
break;
if ((int)mpz_get_si (arg->next->expr->value.integer)
< arg->expr->rank)
break;
}
if (arg->expr != NULL
&& arg->expr->rank > 0
......@@ -1723,6 +1734,17 @@ resolve_function (gfc_expr * expr)
if (t == SUCCESS)
find_noncopying_intrinsics (expr->value.function.esym,
expr->value.function.actual);
/* Make sure that the expression has a typespec that works. */
if (expr->ts.type == BT_UNKNOWN)
{
if (expr->symtree->n.sym->result
&& expr->symtree->n.sym->result->ts.type != BT_UNKNOWN)
expr->ts = expr->symtree->n.sym->result->ts;
else
expr->ts = expr->symtree->n.sym->result->ts;
}
return t;
}
......
......@@ -349,6 +349,8 @@ gfc_trans_call (gfc_code * code, bool dependency_check)
gcc_assert(select_code->op == EXEC_SELECT);
sym = select_code->expr->symtree->n.sym;
se.expr = convert (gfc_typenode_for_spec (&sym->ts), se.expr);
if (sym->backend_decl == NULL)
sym->backend_decl = gfc_get_symbol_decl (sym);
gfc_add_modify_expr (&se.pre, sym->backend_decl, se.expr);
}
else
......
2007-01-15 Paul Thomas <pault@gcc.gnu.org>
PR fortran/28172
* gfortran.dg/altreturn_4.f90: New test.
PR fortran/29389
* gfortran.dg/stfunc_4.f90: New test.
PR fortran/29712
* gfortran.dg/bound_2.f90: Reinstate commented out line.
* gfortran.dg/initialization_1.f90: Change warning.
PR fortran/30283
* gfortran.dg/specification_type_resolution_2.f90: New test.
2007-01-14 Jan Hubicka <jh@suse.cz>
* gcc.dg/tree-prof/stringop-1.c: Update pattern for memcpy folding.
! { dg-do compile }
! Tests the fix for PR28172, in which an ICE would result from
! the contained call with an alternate retrun.
! Contributed by Tobias Schlüter <tobi@gcc.gnu.org>
program blubb
call otherini(*998)
stop
998 stop
contains
subroutine init
call otherini(*999)
return
999 stop
end subroutine init
end program blubb
......@@ -194,7 +194,7 @@ contains
subroutine foo (x,n)
integer :: x(7,n,2,*), n
!if (ubound(x,1) /= 7 .or. ubound(x,2) /= 4 .or. ubound(x,3) /= 2) call abort
if (ubound(x,1) /= 7 .or. ubound(x,2) /= 4 .or. ubound(x,3) /= 2) call abort
end subroutine foo
subroutine jackal (b, c)
......
......@@ -27,7 +27,7 @@ contains
integer :: l1 = len (ch1) ! { dg-warning "assumed character length variable" }
! These are warnings because they are gfortran extensions.
integer :: m3 = size (x, 1) ! { dg-warning "upper bound in the last dimension" }
integer :: m3 = size (x, 1) ! { dg-warning "Evaluation of nonstandard initialization" }
integer :: m4(2) = shape (z) ! { dg-warning "Evaluation of nonstandard initialization" }
! This does not depend on non-constant properties.
......
! { dg-do compile }
! Tests the fix for PR30283 in which the type of the result
! of bar was getting lost
! Contributed by Harald Anlauf <anlauf@gmx.de>
module gfcbug50
implicit none
contains
subroutine foo (n, y)
integer, intent(in) :: n
integer, dimension(bar (n)) :: y
! Array bound is specification expression, which is allowed (F2003, sect.7.1.6)
end subroutine foo
pure function bar (n) result (l)
integer, intent(in) :: n
integer :: l
l = n
end function bar
end module gfcbug50
! { dg-final { cleanup-modules "gfcbug50" } }
! { dg-do run }
! Tests the fix for PR29389, in which the statement function would not be
! recognised as PURE within a PURE procedure.
! Contributed by Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
INTEGER :: st1, i = 99, a(4), q = 6
st1 (i) = i * i * i
FORALL(i=1:4) a(i) = st1 (i)
FORALL(i=1:4) a(i) = u (a(i)) - a(i)** 2
if (any (a .ne. 0)) call abort ()
if (i .ne. 99) call abort ()
contains
pure integer function u (x)
integer,intent(in) :: x
st2 (i) = i * i
u = st2(x)
end function
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