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>
|
2015-05-05 David Malcolm <dmalcolm@redhat.com>
|
||||||
|
|
||||||
* expr.c (check_inquiry): Fix indentation so that it reflects the
|
* 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)
|
for (; arg; arg = arg->next)
|
||||||
{
|
{
|
||||||
if (!arg->expr || arg->expr->expr_type == EXPR_NULL)
|
if (!arg->expr || arg->expr->expr_type == EXPR_NULL)
|
||||||
continue;
|
goto loop_continue;
|
||||||
|
|
||||||
newss = gfc_walk_subexpr (head, arg->expr);
|
newss = gfc_walk_subexpr (head, arg->expr);
|
||||||
if (newss == head)
|
if (newss == head)
|
||||||
|
@ -9122,6 +9122,7 @@ gfc_walk_elemental_function_args (gfc_ss * ss, gfc_actual_arglist *arg,
|
||||||
tail = tail->next;
|
tail = tail->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
loop_continue:
|
||||||
if (dummy_arg != NULL)
|
if (dummy_arg != NULL)
|
||||||
dummy_arg = dummy_arg->next;
|
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>
|
2015-05-08 Alan Lawrence <alan.lawrence@arm.com>
|
||||||
|
|
||||||
* gcc.target/aarch64/singleton_intrinsics_1.c: Generalize regex to
|
* gcc.target/aarch64/singleton_intrinsics_1.c: Generalize regex to
|
||||||
|
|
|
@ -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