Commit 4ea60a39 by Thomas Koenig

re PR fortran/71544 (gfortran compiler optimization bug when dealing with c-style pointers)

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

	PR fortran/71544
	* 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-09  Thomas Koenig  <tkoenig@gcc.gnu.org>

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

From-SVN: r269532
parent e6780631
2019-03-09 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/71544
* 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-09 Janus Weil <janus@gcc.gnu.org> 2019-03-09 Janus Weil <janus@gcc.gnu.org>
PR fortran/84504 PR fortran/84504
......
...@@ -1177,6 +1177,7 @@ gfc_typenode_for_spec (gfc_typespec * spec, int codim) ...@@ -1177,6 +1177,7 @@ gfc_typenode_for_spec (gfc_typespec * spec, int codim)
spec->type = BT_INTEGER; spec->type = BT_INTEGER;
spec->kind = gfc_index_integer_kind; 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; break;
case BT_VOID: case BT_VOID:
...@@ -2957,7 +2958,8 @@ create_fn_spec (gfc_symbol *sym, tree fntype) ...@@ -2957,7 +2958,8 @@ create_fn_spec (gfc_symbol *sym, tree fntype)
|| f->sym->ts.u.derived->attr.pointer_comp)) || f->sym->ts.u.derived->attr.pointer_comp))
|| (f->sym->ts.type == BT_CLASS || (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.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++] = '.'; spec[spec_len++] = '.';
else if (f->sym->attr.intent == INTENT_IN) else if (f->sym->attr.intent == INTENT_IN)
spec[spec_len++] = 'r'; spec[spec_len++] = 'r';
......
2019-03-09 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/71544
* gfortran.dg/c_ptr_tests_19.f90: New test.
2019-03-09 John David Anglin <dave.anglin@bell.net> 2019-03-09 John David Anglin <dave.anglin@bell.net>
* gnat.dg/debug11.adb: Skip on 32-bit hppa*-*-hpux*. * gnat.dg/debug11.adb: Skip on 32-bit hppa*-*-hpux*.
......
! { 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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment