This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug fortran/34079] Bind(C): Don't pass the string length as argument (for STDCALL)



------- Comment #1 from burnus at gcc dot gnu dot org  2007-11-13 14:39 -------
Example:

interface
  subroutine subiso(x) bind(c)
    use iso_c_binding
    character(kind=c_char,len=1), dimension(*) :: x
  end subroutine subiso
  subroutine subiso2(x) bind(c) ! { dg-warning "may not be C interoperable" }
    character(len=1), dimension(*) :: x
  end subroutine subiso2
  subroutine sub(x)
    use iso_c_binding
    character(kind=c_char,len=1), dimension(*) :: x
  end subroutine sub
end interface
call sub    ("abcdef")
call subiso ("ABCDEF")
call subiso2("AbCdEf")
end

Dumped tree should look like:
  sub (&"abcdef"[1]{lb: 1 sz: 1}, 6);
  subiso (&"ABCDEF"[1]{lb: 1 sz: 1});
  subiso2 (&"ABCDEF"[1]{lb: 1 sz: 1});


Draft of a patch:

Index: gcc/fortran/trans-expr.c
===================================================================
--- gcc/fortran/trans-expr.c    (Revision 130131)
+++ gcc/fortran/trans-expr.c    (Arbeitskopie)
@@ -2390,8 +2390,8 @@ gfc_conv_function_call (gfc_se * se, gfc
         }

       /* Character strings are passed as two parameters, a length and a
-         pointer.  */
-      if (parmse.string_length != NULL_TREE)
+         pointer - except for Bind(c) which only passes the pointer.  */
+      if (parmse.string_length != NULL_TREE && !sym->attr.is_bind_c)
         stringargs = gfc_chainon_list (stringargs, parmse.string_length);

       arglist = gfc_chainon_list (arglist, parmse.expr);


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34079


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]