https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61968

--- Comment #7 from Thomas Koenig <tkoenig at gcc dot gnu.org> ---
Hmm... some analysis.  This is a strange piece of code...

  interface
    subroutine test_lib (a, len) bind(C, name="test")
      use iso_c_binding, only: c_size_t
      !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
      type(*), dimension(*) :: a

OK, so type(*) in a C binding just means a void * pointer on
the C side.  But that does not matter: If the BIND(C) is removed,
the assembly failure still happens.

The failure does _not_ happen with

  interface test
    procedure :: test_32
!    procedure :: test_array
  end interface test

And if we replace the call to the generic "test" with
a call to the non-generic test_32, all is well.

With the following diff

--- pr1.f90     2019-05-01 22:05:46.317369154 +0200
+++ pr2.f90     2019-05-01 22:05:42.829339353 +0200
@@ -36,5 +36,5 @@
     use testmod
     type(*), dimension(*) :: a
     integer(c_int32_t), value :: len
-    call test (a, len)
+    call test_32 (a, len)
   end subroutine

between two files (pr1 calls the generic function, pr2 the
non-generic one) we get the following diff in the dumps:

--- pr1.dump    2019-05-01 22:06:07.257548088 +0200
+++ pr2.dump    2019-05-01 22:06:14.577610648 +0200
@@ -137,24 +137,10 @@
   symtree: '__iso_c_binding'|| symbol: '__iso_c_binding' 
     type spec : (UNKNOWN 0)
     attributes: (MODULE  INTRINSIC)
-  symtree: '__vtab_TYPE(*)_0_'|| symbol: '__vtab_TYPE(*)_0_' 
-    type spec : (DERIVED __vtype_TYPE(*)_0_)
-    attributes: (VARIABLE PUBLIC IMPLICIT-SAVE TARGET)
-    value: __vtype_TYPE(*)_0_(49723565 , 8_8 , NULL() , NULL() ,
__copy_TYPE(*)_0_:__copy_TYPE(*)_0_ , NULL())
   symtree: '__vtab__STAR'|| symbol: '__vtab__STAR' 
     type spec : (DERIVED __vtype__STAR)
     attributes: (VARIABLE IMPLICIT-SAVE TARGET USE-ASSOC(testmod))
     value: __vtype__STAR(0 , () , () , () , () , NULL() , ())
-  symtree: '__vtype_TYPE(*)_0_'|| symbol: '__vtype_TYPE(*)_0_' 
-    type spec : (UNKNOWN 0)
-    attributes: (DERIVED PUBLIC )
-    components: 
-    (_hash (INTEGER 4) () PRIVATE) 
-    (_size (INTEGER 8) () PRIVATE) 
-    (_extends (VOID 0) POINTER () PRIVATE) 
-    (_def_init (VOID 0) POINTER () PRIVATE) 
-    (_copy (UNKNOWN 0) PPC () PRIVATE) 
-    (_final (UNKNOWN 0) PPC () PRIVATE)
   symtree: '__vtype__STAR'|| symbol: '__vtype__STAR' 
     type spec : (UNKNOWN 0)
     attributes: (DERIVED  USE-ASSOC(testmod))
@@ -212,23 +198,5 @@
   code:
   CALL test_32 ((test_32_:a(FULL)) (test_32_:len))

-CONTAINS
-
-  Namespace: A-H: (REAL 4) I-N: (INTEGER 4) O-Z: (REAL 4)
-  procedure name = __copy_TYPE(*)_0_
-    symtree: '__copy_TYPE(*)_0_'|| symbol: '__copy_TYPE(*)_0_' 
-      type spec : (UNKNOWN 0)
-      attributes: (PROCEDURE  SUBROUTINE ELEMENTAL PURE)
-      Formal arglist: src dst
-    symtree: 'dst'         || symbol: 'dst'          
-      type spec : (TYPE(*))
-      attributes: (VARIABLE  DUMMY(INOUT))
-    symtree: 'src'         || symbol: 'src'          
-      type spec : (TYPE(*))
-      attributes: (VARIABLE  DUMMY(IN))
-
-    code:
-    ASSIGN __copy_TYPE(*)_0_:dst __copy_TYPE(*)_0_:src
-

so there is indeed a bogus vtab being generated somewhere and
somehow.

Reply via email to