]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/71544 (gfortran compiler optimization bug when dealing with c-style...
authorThomas Koenig <tkoenig@gcc.gnu.org>
Sun, 10 Mar 2019 11:26:25 +0000 (11:26 +0000)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Sun, 10 Mar 2019 11:26:25 +0000 (11:26 +0000)
2019-03-10  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR fortran/71544
Backport from trunk
* trans-types.c (gfc_typenode_for_spec) Set ts->is_c_interop of
C_PTR and C_FUNPTR.
(create_fn_spec): Mark argument as escaping if ts->is_c_interop is set.

2019-03-10  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR fortran/71544
Backport from trunk
* gfortran.dg/c_ptr_tests_19.f90: New test.

From-SVN: r269552

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

index 12fd22b974b8bac26dadc859275fa48463f57e91..1346f4a5d36cd4ece89c05651a86c42e33230b40 100644 (file)
@@ -1,3 +1,11 @@
+2019-03-10  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR fortran/71544
+       Backport from trunk
+       * trans-types.c (gfc_typenode_for_spec) Set ts->is_c_interop of
+       C_PTR and C_FUNPTR.
+       (create_fn_spec): Mark argument as escaping if ts->is_c_interop is set.
+
 2019-03-10  Thomas Koenig  <tkoenig@gcc.gnu.org>
        Steven G. Kargl  <kargl@gcc.gnu.org>
 
index 6f8bcfdaaca12235976b0ca4281e45984b61aad2..385be8a2c97dfd2a6e39b8cfe650eca47ac2c14b 100644 (file)
@@ -1139,7 +1139,8 @@ gfc_typenode_for_spec (gfc_typespec * spec, int codim)
         {
           spec->type = BT_INTEGER;
           spec->kind = gfc_index_integer_kind;
-          spec->f90_type = BT_VOID;
+         spec->f90_type = BT_VOID;
+         spec->is_c_interop = 1;  /* Mark as escaping later.  */
         }
       break;
     case BT_VOID:
@@ -2884,7 +2885,8 @@ create_fn_spec (gfc_symbol *sym, tree fntype)
                    || f->sym->ts.u.derived->attr.pointer_comp))
            || (f->sym->ts.type == BT_CLASS
                && (CLASS_DATA (f->sym)->ts.u.derived->attr.proc_pointer_comp
-                   || CLASS_DATA (f->sym)->ts.u.derived->attr.pointer_comp)))
+                   || CLASS_DATA (f->sym)->ts.u.derived->attr.pointer_comp))
+           || (f->sym->ts.type == BT_INTEGER && f->sym->ts.is_c_interop))
          spec[spec_len++] = '.';
        else if (f->sym->attr.intent == INTENT_IN)
          spec[spec_len++] = 'r';
index a878fd58fab774ef8ec24b716c8f8cf50d40685c..c7bfd6d27bd96e67ecb3f2d83faee9b6545a35cd 100644 (file)
@@ -1,3 +1,9 @@
+2019-03-10  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR fortran/71544
+       Backport from trunk
+       * gfortran.dg/c_ptr_tests_19.f90: New test.
+
 2019-03-10  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        PR fortran/87734
diff --git a/gcc/testsuite/gfortran.dg/c_ptr_tests_19.f90 b/gcc/testsuite/gfortran.dg/c_ptr_tests_19.f90
new file mode 100644 (file)
index 0000000..2cb0b18
--- /dev/null
@@ -0,0 +1,36 @@
+! { dg-do run }
+
+! PR 71544 - this failed with some optimization options due to a
+! pointer not being marked as escaping.
+
+module store_cptr
+    use, intrinsic :: iso_c_binding
+    implicit none
+    public
+    type(c_ptr), save :: cptr
+end module store_cptr
+
+subroutine init()
+    use, intrinsic :: iso_c_binding
+    implicit none
+    integer(c_int), pointer :: a
+    allocate(a)
+    call save_cptr(c_loc(a))
+    a = 100
+end subroutine init
+
+subroutine save_cptr(cptr_in)
+    use store_cptr
+    implicit none
+    type(c_ptr), intent(in) :: cptr_in
+    cptr = cptr_in
+end subroutine save_cptr
+
+program init_fails
+    use store_cptr
+    implicit none
+    integer(c_int), pointer :: val
+    call init()
+    call c_f_pointer(cptr,val)
+    if (val /= 100) stop 1
+end program init_fails