+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
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)
tail = tail->next;
}
+loop_continue:
if (dummy_arg != NULL)
dummy_arg = dummy_arg->next;
}
+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
--- /dev/null
+! { 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