Fortran] PR 92872 – Fix get_CFI_desc
authorTobias Burnus <tobias@codesourcery.com>
Tue, 10 Dec 2019 10:32:12 +0000 (10:32 +0000)
committerTobias Burnus <burnus@gcc.gnu.org>
Tue, 10 Dec 2019 10:32:12 +0000 (11:32 +0100)
        PR fortran/92872
        * trans-array.c (get_CFI_desc): Fix cond whether saved desc exists.

        PR fortran/92872
        * gfortran.dg/bind_c_optional-1.f90: New.

From-SVN: r279160

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

index bbc00aec2bc4c1c56672ed03647dd9c72f5154d3..86a1a148c5d4282730d44e0b1c166309d82cbe8b 100644 (file)
@@ -1,3 +1,8 @@
+2019-12-10  Tobias Burnus  <tobias@codesourcery.com>
+
+       PR fortran/92872
+       * trans-array.c (get_CFI_desc): Fix cond whether saved desc exists.
+
 2019-12-09  David Malcolm  <dmalcolm@redhat.com>
 
        * error.c (gfc_diagnostic_starter): Add pp_newline call before
index 5c27c065ff02959cdbc7dcbf49fcefa41d13cc22..1b779988616a9b4d3574ff53d972d0510d91b2ea 100644 (file)
@@ -882,7 +882,7 @@ get_CFI_desc (gfc_symbol *sym, gfc_expr *expr,
   else
     tmp = sym->backend_decl;
 
-  if (tmp && DECL_LANG_SPECIFIC (tmp))
+  if (tmp && DECL_LANG_SPECIFIC (tmp) && GFC_DECL_SAVED_DESCRIPTOR (tmp))
     tmp = GFC_DECL_SAVED_DESCRIPTOR (tmp);
 
   *desc = tmp;
index 7ba847da113deaaf258332af520954ff4e4df76f..b43497cc2b3af8c304b25f666742a9df060a6d16 100644 (file)
@@ -1,3 +1,8 @@
+2019-12-10  Tobias Burnus  <tobias@codesourcery.com>
+
+       PR fortran/92872
+       * gfortran.dg/bind_c_optional-1.f90: New.
+
 2019-12-10  Richard Sandiford  <richard.sandiford@arm.com>
 
        * gcc.dg/lto/tag-1_0.c, gcc.dg/lto/tag-1_1.c: New test.
diff --git a/gcc/testsuite/gfortran.dg/bind_c_optional-1.f90 b/gcc/testsuite/gfortran.dg/bind_c_optional-1.f90
new file mode 100644 (file)
index 0000000..9940920
--- /dev/null
@@ -0,0 +1,22 @@
+! { dg-do run }
+!
+! PR fortran/92872
+!
+! Contributed by G. Steinmetz
+!
+module m
+contains
+subroutine s(x) bind(c)
+   integer, allocatable, optional :: x(:)
+   x = [1, 2, 3]
+end
+end
+
+use m
+integer, allocatable :: y(:)
+! NOTE: starting at 0, otherwise it will fail due to PR 92189
+allocate(y(0:2))
+y = [9, 8, 7]
+call s(y)
+if (any (y /= [1, 2, 3])) stop 1
+end