trans-array.c (gfc_walk_elemental_function_args): Don't skip the advance to the next dummy argument when...
gcc/fortran/ * trans-array.c (gfc_walk_elemental_function_args): Don't skip the advance to the next dummy argument when skipping absent optional args. gcc/testsuite/ * gfortran.dg/elemental_optional_args_7.f90: New. From-SVN: r222913
This commit is contained in:
parent
2a812183d6
commit
4a8108f0ab
@ -1,3 +1,9 @@
|
||||
2015-05-08 Mikael Morin <mikael@gcc.gnu.org>
|
||||
|
||||
* trans-array.c (gfc_walk_elemental_function_args):
|
||||
Don't skip the advance to the next dummy argument when skipping
|
||||
absent optional args.
|
||||
|
||||
2015-05-05 David Malcolm <dmalcolm@redhat.com>
|
||||
|
||||
* expr.c (check_inquiry): Fix indentation so that it reflects the
|
||||
|
@ -9092,7 +9092,7 @@ gfc_walk_elemental_function_args (gfc_ss * ss, gfc_actual_arglist *arg,
|
||||
for (; arg; arg = arg->next)
|
||||
{
|
||||
if (!arg->expr || arg->expr->expr_type == EXPR_NULL)
|
||||
continue;
|
||||
goto loop_continue;
|
||||
|
||||
newss = gfc_walk_subexpr (head, arg->expr);
|
||||
if (newss == head)
|
||||
@ -9122,6 +9122,7 @@ gfc_walk_elemental_function_args (gfc_ss * ss, gfc_actual_arglist *arg,
|
||||
tail = tail->next;
|
||||
}
|
||||
|
||||
loop_continue:
|
||||
if (dummy_arg != NULL)
|
||||
dummy_arg = dummy_arg->next;
|
||||
}
|
||||
|
@ -1,3 +1,7 @@
|
||||
2015-05-08 Mikael Morin <mikael@gcc.gnu.org>
|
||||
|
||||
* gfortran.dg/elemental_optional_args_7.f90: New.
|
||||
|
||||
2015-05-08 Alan Lawrence <alan.lawrence@arm.com>
|
||||
|
||||
* gcc.target/aarch64/singleton_intrinsics_1.c: Generalize regex to
|
||||
|
37
gcc/testsuite/gfortran.dg/elemental_optional_args_7.f90
Normal file
37
gcc/testsuite/gfortran.dg/elemental_optional_args_7.f90
Normal file
@ -0,0 +1,37 @@
|
||||
! { dg-do run }
|
||||
!
|
||||
! The handling of scalar optional arguments passed to elemental procedure
|
||||
! did not keep actual arguments and dummy arguments synchronized while
|
||||
! walking them in gfc_walk_elemental_function_args, leading to a
|
||||
! null pointer dereference in the generated code.
|
||||
!
|
||||
implicit none
|
||||
|
||||
integer, parameter :: n = 3
|
||||
|
||||
call do_test
|
||||
|
||||
contains
|
||||
|
||||
elemental function five(nonopt1, opt1, nonopt2, opt2)
|
||||
integer, intent(in), optional :: opt1, opt2
|
||||
integer, intent(in) :: nonopt1, nonopt2
|
||||
integer :: five
|
||||
|
||||
if (.not. present(opt1) .and. .not. present(opt2)) then
|
||||
five = 5
|
||||
else
|
||||
five = -7
|
||||
end if
|
||||
end function five
|
||||
|
||||
subroutine do_test(opt)
|
||||
integer, optional :: opt
|
||||
integer :: i = -1, a(n) = (/ (i, i=1,n) /)
|
||||
integer :: b(n)
|
||||
|
||||
b = five(a, nonopt2=i, opt2=opt)
|
||||
if (any(b /= 5)) call abort
|
||||
end subroutine do_test
|
||||
|
||||
end
|
Loading…
Reference in New Issue
Block a user