OSDN Git Service

2012-01-09 Mikael Morin <mikael@gcc.gnu.org>
authormikael <mikael@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 9 Jan 2012 19:01:34 +0000 (19:01 +0000)
committermikael <mikael@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 9 Jan 2012 19:01:34 +0000 (19:01 +0000)
PR fortran/51758
* trans-array.c (gfc_walk_elemental_function_args):
Skip over NULL() actual arguments.

2012-01-09  Tobias Burnus  <burnus@net-b.de>

PR fortran/51758
* gfortran.dg/optional_absent_2.f90: New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@183024 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/trans-array.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/optional_absent_2.f90 [new file with mode: 0644]

index 29e8cab..755e11e 100644 (file)
@@ -1,3 +1,9 @@
+2012-01-09  Mikael Morin  <mikael@gcc.gnu.org>
+
+       PR fortran/51758
+       * trans-array.c (gfc_walk_elemental_function_args):
+       Skip over NULL() actual arguments.
+
 2012-01-09  Tobias Burnus  <burnus@net-b.de>
 
        * gfortran.texi: Bump copyright year.
 2012-01-09  Tobias Burnus  <burnus@net-b.de>
 
        * gfortran.texi: Bump copyright year.
index b9902b9..1fd8dcb 100644 (file)
@@ -8369,7 +8369,7 @@ gfc_walk_elemental_function_args (gfc_ss * ss, gfc_actual_arglist *arg,
   scalar = 1;
   for (; arg; arg = arg->next)
     {
   scalar = 1;
   for (; arg; arg = arg->next)
     {
-      if (!arg->expr)
+      if (!arg->expr || arg->expr->expr_type == EXPR_NULL)
        continue;
 
       newss = gfc_walk_subexpr (head, arg->expr);
        continue;
 
       newss = gfc_walk_subexpr (head, arg->expr);
index bab4f89..565aec5 100644 (file)
@@ -1,5 +1,10 @@
 2012-01-09  Tobias Burnus  <burnus@net-b.de>
 
 2012-01-09  Tobias Burnus  <burnus@net-b.de>
 
+       PR fortran/51758
+       * gfortran.dg/optional_absent_2.f90: New.
+
+2012-01-09  Tobias Burnus  <burnus@net-b.de>
+
        PR fortran/51578
        * gfortran.dg/use_17.f90: New.
 
        PR fortran/51578
        * gfortran.dg/use_17.f90: New.
 
diff --git a/gcc/testsuite/gfortran.dg/optional_absent_2.f90 b/gcc/testsuite/gfortran.dg/optional_absent_2.f90
new file mode 100644 (file)
index 0000000..717bab7
--- /dev/null
@@ -0,0 +1,53 @@
+! { dg-do run }
+!
+! PR fortran/51758
+!
+! Contributed by Mikael Morin
+!
+! Check whether passing NULL() to an elemental procedure works,
+! where NULL() denotes an absent optional argument.
+!
+program p
+
+  integer :: a(2)
+  integer :: b
+
+  a = 0
+  a = foo((/ 1, 1 /), null())
+!  print *, a
+  if (any(a /= 2)) call abort
+
+  a = 0
+  a = bar((/ 1, 1 /), null())
+!  print *, a
+  if (any(a /= 2)) call abort
+
+  b = 0
+  b = bar(1, null())
+!  print *, b
+  if (b /= 2) call abort
+
+contains
+
+  function foo(a, b)
+    integer           :: a(:)
+    integer, optional :: b(:)
+    integer           :: foo(size(a))
+
+    if (present(b)) call abort
+
+    foo = 2
+  end function foo
+
+  elemental function bar(a, b)
+    integer, intent(in)           :: a
+    integer, intent(in), optional :: b
+    integer                       :: bar
+
+    bar = 2
+
+    if (present(b)) bar = 1
+
+  end function bar
+
+end program p