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:
Mikael Morin 2015-05-08 14:53:20 +00:00
parent 2a812183d6
commit 4a8108f0ab
4 changed files with 49 additions and 1 deletions

View File

@ -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

View File

@ -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;
}

View File

@ -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

View 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