mirror of git://gcc.gnu.org/git/gcc.git
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
This commit is contained in:
parent
32d6b8aef4
commit
9ebe2d22e7
|
|
@ -1,3 +1,22 @@
|
||||||
|
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>
|
2007-01-14 Paul Thomas <pault@gcc.gnu.org>
|
||||||
|
|
||||||
PR fortran/30410
|
PR fortran/30410
|
||||||
|
|
|
||||||
|
|
@ -1501,6 +1501,11 @@ pure_function (gfc_expr * e, const char **name)
|
||||||
{
|
{
|
||||||
int pure;
|
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)
|
if (e->value.function.esym)
|
||||||
{
|
{
|
||||||
pure = gfc_pure (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)
|
for (arg = expr->value.function.actual; arg; arg = arg->next)
|
||||||
{
|
{
|
||||||
if (inquiry && arg->next != NULL && arg->next->expr
|
if (inquiry && arg->next != NULL && arg->next->expr)
|
||||||
&& arg->next->expr->expr_type != EXPR_CONSTANT)
|
{
|
||||||
break;
|
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
|
if (arg->expr != NULL
|
||||||
&& arg->expr->rank > 0
|
&& arg->expr->rank > 0
|
||||||
|
|
@ -1723,6 +1734,17 @@ resolve_function (gfc_expr * expr)
|
||||||
if (t == SUCCESS)
|
if (t == SUCCESS)
|
||||||
find_noncopying_intrinsics (expr->value.function.esym,
|
find_noncopying_intrinsics (expr->value.function.esym,
|
||||||
expr->value.function.actual);
|
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;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -349,6 +349,8 @@ gfc_trans_call (gfc_code * code, bool dependency_check)
|
||||||
gcc_assert(select_code->op == EXEC_SELECT);
|
gcc_assert(select_code->op == EXEC_SELECT);
|
||||||
sym = select_code->expr->symtree->n.sym;
|
sym = select_code->expr->symtree->n.sym;
|
||||||
se.expr = convert (gfc_typenode_for_spec (&sym->ts), se.expr);
|
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);
|
gfc_add_modify_expr (&se.pre, sym->backend_decl, se.expr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,18 @@
|
||||||
|
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>
|
2007-01-14 Jan Hubicka <jh@suse.cz>
|
||||||
|
|
||||||
* gcc.dg/tree-prof/stringop-1.c: Update pattern for memcpy folding.
|
* gcc.dg/tree-prof/stringop-1.c: Update pattern for memcpy folding.
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
! { 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)
|
subroutine foo (x,n)
|
||||||
integer :: x(7,n,2,*), 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
|
end subroutine foo
|
||||||
|
|
||||||
subroutine jackal (b, c)
|
subroutine jackal (b, c)
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@ contains
|
||||||
integer :: l1 = len (ch1) ! { dg-warning "assumed character length variable" }
|
integer :: l1 = len (ch1) ! { dg-warning "assumed character length variable" }
|
||||||
|
|
||||||
! These are warnings because they are gfortran extensions.
|
! 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" }
|
integer :: m4(2) = shape (z) ! { dg-warning "Evaluation of nonstandard initialization" }
|
||||||
|
|
||||||
! This does not depend on non-constant properties.
|
! This does not depend on non-constant properties.
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
! { 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" } }
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
! { 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
|
||||||
Loading…
Reference in New Issue