Hi Dominique,
Not for me, I still get
% gfc pr61968.f90 -c -O3
pr61968.f90:32:0:
32 | call test_lib (a, int (sizeof (a), kind=c_size_t))
|
internal compiler error: in gfc_trans_create_temp_array, at
fortran/trans-array.c:1265
You're right, I will clear this up separately.
In the meantime, here is the one-line patch with the test case above
with -O3 added, so any failure will be noted soon.
OK for trunk?
Regards
Thomas
2019-05-02 Thomas Koenig <[email protected]>
PR fortran/61968
* interface.c (compare_actual_formal): Do not create a vtab if
the actual argument is assumed type.
2019-05-02 Thomas Koenig <[email protected]>
PR fortran/61968
* gfortran.dg/assumed_type_10.f90: New test case.
* gfortran.dg/assumed_type_11.f90: New test case.
! { dg-do compile }
! { dg-options "-O3 -fdump-tree-original" }
! PR 61968 - this used to generate invalid assembler containing
! TYPE(*).
module testmod
use iso_c_binding, only: c_size_t, c_int32_t, c_int64_t
implicit none
interface test
procedure :: test_32
procedure :: test_array
end interface test
interface
subroutine test_lib (a, len) bind(C, name="xxx")
use iso_c_binding, only: c_size_t
type(*), dimension(*) :: a
integer(c_size_t), value :: len
end subroutine
end interface
contains
subroutine test_32 (a, len)
type(*), dimension(*) :: a
integer(c_int32_t), value :: len
call test_lib (a, int (len, kind=c_size_t))
end subroutine
subroutine test_array (a)
use iso_c_binding, only: c_size_t
class(*), dimension(..), target :: a
call test_lib (a, int (sizeof (a), kind=c_size_t))
end subroutine
end module
subroutine test_32_ (a, len)
use iso_c_binding, only: c_int32_t
use testmod
type(*), dimension(*) :: a
integer(c_int32_t), value :: len
call test (a, len)
end subroutine
! { dg-final { scan-tree-dump-not "! __vtype_TYPE\\(*\\)" "original" } }
! { dg-do compile }
! { dg-options "-O0 -fdump-tree-original" }
! PR 61968 - this used to generate invalid assembler containing
! TYPE(*).
module testmod
use iso_c_binding, only: c_size_t, c_int32_t, c_int64_t
implicit none
interface test
procedure :: test_32
procedure :: test_array
end interface test
interface
subroutine test_lib (a, len) bind(C, name="xxx")
use iso_c_binding, only: c_size_t
type(*), dimension(*) :: a
integer(c_size_t), value :: len
end subroutine
end interface
contains
subroutine test_32 (a, len)
type(*), dimension(*) :: a
integer(c_int32_t), value :: len
call test_lib (a, int (len, kind=c_size_t))
end subroutine
subroutine test_array (a)
use iso_c_binding, only: c_size_t
class(*), dimension(..), target :: a
call test_lib (a, int (sizeof (a), kind=c_size_t))
end subroutine
end module
subroutine test_32_ (a, len)
use iso_c_binding, only: c_int32_t
use testmod
type(*), dimension(*) :: a
integer(c_int32_t), value :: len
call test (a, len)
end subroutine
! { dg-final { scan-tree-dump-not "! __vtype_TYPE\\(*\\)" "original" } }
Index: interface.c
===================================================================
--- interface.c (Revision 270622)
+++ interface.c (Arbeitskopie)
@@ -2989,7 +2989,8 @@ compare_actual_formal (gfc_actual_arglist **ap, gf
polymorphic formal arguments. */
if (UNLIMITED_POLY (f->sym)
&& a->expr->ts.type != BT_DERIVED
- && a->expr->ts.type != BT_CLASS)
+ && a->expr->ts.type != BT_CLASS
+ && a->expr->ts.type != BT_ASSUMED)
gfc_find_vtab (&a->expr->ts);
if (a->expr->expr_type == EXPR_NULL