re PR fortran/30236 ([4.1 only]alternate-return subroutine in generic interface causes ice/segfault)
2006-12-19 Paul Thomas <pault@gcc.gnu.org> PR fortran/30236 * interface.c (compare_interfaces): Handle NULL symbols. (count_types_test): Count NULL symbols, which correspond to alternate returns. (check_interface1): Change final argument from int to bool in the function and all references. 2006-12-19 Paul Thomas <pault@gcc.gnu.org> PR fortran/30236 * gfortran.dg/altreturn_3.f90: New test. * gfortran.dg/char_result_12.f90: Fix comment typos. From-SVN: r120052
This commit is contained in:
parent
400ebff494
commit
26f2ca2b6f
@ -1,3 +1,13 @@
|
||||
2006-12-19 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/30236
|
||||
* interface.c (compare_interfaces): Handle NULL symbols.
|
||||
(count_types_test): Count NULL symbols, which correspond to
|
||||
alternate returns.
|
||||
|
||||
(check_interface1): Change final argument from int to bool
|
||||
in the function and all references.
|
||||
|
||||
2006-12-18 Roger Sayle <roger@eyesopen.com>
|
||||
|
||||
* trans-array.c (gfc_conv_array_index_offset): Avoid multiplying
|
||||
|
@ -443,6 +443,8 @@ static int compare_interfaces (gfc_symbol *, gfc_symbol *, int);
|
||||
static int
|
||||
compare_type_rank_if (gfc_symbol * s1, gfc_symbol * s2)
|
||||
{
|
||||
if (s1 == NULL || s2 == NULL)
|
||||
return s1 == s2 ? 1 : 0;
|
||||
|
||||
if (s1->attr.flavor != FL_PROCEDURE && s2->attr.flavor != FL_PROCEDURE)
|
||||
return compare_type_rank (s1, s2);
|
||||
@ -731,14 +733,14 @@ count_types_test (gfc_formal_arglist * f1, gfc_formal_arglist * f2)
|
||||
if (arg[i].flag != -1)
|
||||
continue;
|
||||
|
||||
if (arg[i].sym->attr.optional)
|
||||
if (arg[i].sym && arg[i].sym->attr.optional)
|
||||
continue; /* Skip optional arguments */
|
||||
|
||||
arg[i].flag = k;
|
||||
|
||||
/* Find other nonoptional arguments of the same type/rank. */
|
||||
for (j = i + 1; j < n1; j++)
|
||||
if (!arg[j].sym->attr.optional
|
||||
if ((arg[j].sym == NULL || !arg[j].sym->attr.optional)
|
||||
&& compare_type_rank_if (arg[i].sym, arg[j].sym))
|
||||
arg[j].flag = k;
|
||||
|
||||
@ -968,7 +970,7 @@ check_interface0 (gfc_interface * p, const char *interface_name)
|
||||
static int
|
||||
check_interface1 (gfc_interface * p, gfc_interface * q0,
|
||||
int generic_flag, const char *interface_name,
|
||||
int referenced)
|
||||
bool referenced)
|
||||
{
|
||||
gfc_interface * q;
|
||||
for (; p; p = p->next)
|
||||
@ -1008,7 +1010,7 @@ static void
|
||||
check_sym_interfaces (gfc_symbol * sym)
|
||||
{
|
||||
char interface_name[100];
|
||||
int k;
|
||||
bool k;
|
||||
|
||||
if (sym->ns != gfc_current_ns)
|
||||
return;
|
||||
@ -1048,7 +1050,7 @@ check_uop_interfaces (gfc_user_op * uop)
|
||||
continue;
|
||||
|
||||
check_interface1 (uop->operator, uop2->operator, 0,
|
||||
interface_name, 1);
|
||||
interface_name, true);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1090,7 +1092,7 @@ gfc_check_interfaces (gfc_namespace * ns)
|
||||
|
||||
for (ns2 = ns->parent; ns2; ns2 = ns2->parent)
|
||||
if (check_interface1 (ns->operator[i], ns2->operator[i], 0,
|
||||
interface_name, 1))
|
||||
interface_name, true))
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1,3 +1,10 @@
|
||||
2006-12-19 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/30236
|
||||
* gfortran.dg/altreturn_3.f90: New test.
|
||||
|
||||
* gfortran.dg/char_result_12.f90: Fix comment typos.
|
||||
|
||||
2006-12-19 Ben Elliston <bje@au.ibm.com>
|
||||
|
||||
* gcc.dg/cpp/trad/include.c: #include stdlib.h instead of stdio.h,
|
||||
|
43
gcc/testsuite/gfortran.dg/altreturn_3.f90
Normal file
43
gcc/testsuite/gfortran.dg/altreturn_3.f90
Normal file
@ -0,0 +1,43 @@
|
||||
! { dg-do run}
|
||||
! Tests the fix for PR30236, which was due to alternate returns
|
||||
! in generic interfaces causing a segfault. They now work
|
||||
! correctly.
|
||||
!
|
||||
! Contributed by Brooks Moses <brooks@gcc.gnu.org>
|
||||
!
|
||||
module arswitch
|
||||
implicit none
|
||||
interface gen
|
||||
module procedure with
|
||||
module procedure without
|
||||
end interface
|
||||
contains
|
||||
subroutine with(i,*)
|
||||
integer i
|
||||
if (i>0) then
|
||||
i = -1
|
||||
return 1
|
||||
else
|
||||
i = -2
|
||||
return
|
||||
end if
|
||||
end subroutine
|
||||
subroutine without()
|
||||
return
|
||||
end subroutine
|
||||
end module
|
||||
|
||||
program test
|
||||
use arswitch
|
||||
implicit none
|
||||
integer :: i = 0
|
||||
call gen (i, *10)
|
||||
if (i /= -2) call abort ()
|
||||
i = 2
|
||||
call gen (i, *20)
|
||||
10 continue
|
||||
call abort()
|
||||
20 continue
|
||||
if (i /= -1) call abort ()
|
||||
end
|
||||
! { dg-final { cleanup-modules "arswitch" } }
|
@ -1,8 +1,8 @@
|
||||
! { dg-do run }
|
||||
! Tests the fix for PR29912, in which the call to JETTER
|
||||
! would cause a segfault beause a temporary was not being written.
|
||||
! would cause a segfault because a temporary was not being written.
|
||||
!
|
||||
! COntributed by Philip Mason <pmason@ricardo.com>
|
||||
! Contributed by Philip Mason <pmason@ricardo.com>
|
||||
!
|
||||
program testat
|
||||
character(len=4) :: ctemp(2)
|
||||
|
Loading…
Reference in New Issue
Block a user