+2019-01-29 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR fortran/57048
+ * interface.c (gfc_compare_types): If a derived type and an
+ integer both have a derived type, and they are identical,
+ this is a C binding type and compares equal.
+
2019-01-26 Harald Anlauf <anlauf@gmx.de>
PR fortran/57553
if (ts1->type == BT_VOID || ts2->type == BT_VOID)
return true;
+ /* Special case for our C interop types. FIXME: There should be a
+ better way of doing this. When ISO C binding is cleared up,
+ this can probably be removed. See PR 57048. */
+
+ if (((ts1->type == BT_INTEGER && ts2->type == BT_DERIVED)
+ || (ts1->type == BT_DERIVED && ts2->type == BT_INTEGER))
+ && ts1->u.derived && ts2->u.derived
+ && ts1->u.derived == ts2->u.derived)
+ return true;
+
/* The _data component is not always present, therefore check for its
presence before assuming, that its derived->attr is available.
When the _data component is not present, then nevertheless the
+2019-01-29 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR fortran/57048
+ * gfortran.dg/c_funptr_1.f90: New file.
+ * gfortran.dg/c_funptr_1_mod.f90: New file.
+
2019-01-29 Jakub Jelinek <jakub@redhat.com>
PR c++/66676
--- /dev/null
+! { dg-do preprocess }
+! { dg-additional-options "-cpp" }
+! PR 57048 - this used not to compile. Original test case by Angelo
+! Graziosi. Only works if compiled c_funptr_1_mod.f90, hence the
+! do-nothing directive above.
+module procs
+
+ implicit none
+ private
+
+ public WndProc
+
+contains
+ function WndProc()
+ integer :: WndProc
+
+ WndProc = 0
+ end function WndProc
+end module procs
+
+function WinMain()
+ use, intrinsic :: iso_c_binding, only: C_INT,c_sizeof,c_funloc
+ use win32_types
+ use procs
+ implicit none
+
+ integer :: WinMain
+
+ type(WNDCLASSEX_T) :: WndClass
+
+ WndClass%cbSize = int(c_sizeof(Wndclass),C_INT)
+ WndClass%lpfnWndProc = c_funloc(WndProc)
+
+ WinMain = 0
+end function WinMain
+
+program main
+end
--- /dev/null
+! { dg-do run }
+! { dg-additional-sources c_funptr_1.f90 }
+! Additional module to go with c_funptr_1.f90
+module win32_types
+ use, intrinsic :: iso_c_binding, only: C_INT,C_FUNPTR
+ implicit none
+ private
+
+ public WNDCLASSEX_T
+ type, bind(C) :: WNDCLASSEX_T
+ integer(C_INT) :: cbSize
+ type(C_FUNPTR) :: lpfnWndProc
+
+ end type WNDCLASSEX_T
+
+end module win32_types