]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: [multiple changes]
authorMikael Morin <mikael@gcc.gnu.org>
Sat, 14 Jul 2012 15:24:12 +0000 (15:24 +0000)
committerMikael Morin <mikael@gcc.gnu.org>
Sat, 14 Jul 2012 15:24:12 +0000 (15:24 +0000)
2012-07-14  Mikael Morin  <mikael@gcc.gnu.org>

Backport from trunk:
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-07-14  Mikael Morin  <mikael.morin@gcc.gnu.org>

Backport from trunk:
2012-01-09  Tobias Burnus  <burnus@net-b.de>

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

From-SVN: r189480

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 b752efb264d3b386fa3f32be97da59ccbd3fa801..28f27db020e68658e97b41bd62f7290ce3e02b5b 100644 (file)
@@ -1,3 +1,12 @@
+2012-07-14  Mikael Morin  <mikael@gcc.gnu.org>
+
+       Backport from trunk:
+       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-06-14  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/53597
index d0d0900eb1d6b1513793efc8aac8af651382f645..ce8985c23406af01c1abaa58308b3bdc7e2bbe9f 100644 (file)
@@ -7553,7 +7553,7 @@ gfc_walk_elemental_function_args (gfc_ss * ss, gfc_actual_arglist *arg,
   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);
index 559c44e291049d49880acfe00fdbfa31561e2331..409314516bfc7884b0118be62353bac9f0fb87fd 100644 (file)
@@ -1,3 +1,11 @@
+2012-07-14  Mikael Morin  <mikael.morin@gcc.gnu.org>
+
+       Backport from trunk:
+       2012-01-09  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/51758
+       * gfortran.dg/optional_absent_2.f90: New.
+
 2012-07-03  Michael Hope  <michael.hope@linaro.org>
 
        PR c++/53814
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