+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
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);
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;
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)
check_sym_interfaces (gfc_symbol * sym)
{
char interface_name[100];
- int k;
+ bool k;
if (sym->ns != gfc_current_ns)
return;
continue;
check_interface1 (uop->operator, uop2->operator, 0,
- interface_name, 1);
+ interface_name, true);
}
}
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;
}
+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,
--- /dev/null
+! { 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" } }
! { 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)