[Bug fortran/34079] Bind(C): Don't pass the string length as argument (for STDCALL)
burnus at gcc dot gnu dot org
gcc-bugzilla@gcc.gnu.org
Tue Nov 13 14:39:00 GMT 2007
------- 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
More information about the Gcc-bugs
mailing list