diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 0916029f448..5700f0fbddd 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2008-08-24 Tobias Burnus + + PR fortran/37201 + * trans-expr.c (gfc_conv_function_call): Add string_length + for character-returning bind(C) functions. + 2008-08-24 Daniel Kraft * gfortran.h (gfc_typebound_proc): New struct. diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index c85cbb26219..e91434f43d9 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -2677,7 +2677,9 @@ gfc_conv_function_call (gfc_se * se, gfc_symbol * sym, gfc_finish_interface_mapping (&mapping, &se->pre, &se->post); ts = sym->ts; - if (ts.type == BT_CHARACTER && !sym->attr.is_bind_c) + if (ts.type == BT_CHARACTER && sym->attr.is_bind_c) + se->string_length = build_int_cst (gfc_charlen_type_node, 1); + else if (ts.type == BT_CHARACTER) { if (sym->ts.cl->length == NULL) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 29593bc9c41..c0597790972 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2008-08-24 Tobias Burnus + + PR fortran/37201 + * gfortran.dg/bind_c_usage_17.f90: New. + * gfortran.dg/bind_c_usage_17_c.c: New. + 2008-08-24 Daniel Kraft * gfortran.dg/finalize_5.f03: Adapted expected error message to changes diff --git a/gcc/testsuite/gfortran.dg/bind_c_usage_17.f90 b/gcc/testsuite/gfortran.dg/bind_c_usage_17.f90 new file mode 100644 index 00000000000..ba342755c38 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/bind_c_usage_17.f90 @@ -0,0 +1,38 @@ +! { dg-do run } +! { dg-additional-sources bind_c_usage_17_c.c } +! +! PR fortran/37201 +! +! +! +MODULE mod + INTERFACE + FUNCTION cdir() BIND(C,name="cdir") RESULT(r) + USE iso_c_binding + CHARACTER(kind=C_CHAR) :: r + END FUNCTION + END INTERFACE +END MODULE + +PROGRAM test + USE mod + integer :: i = -43 + character(len=1) :: str1 + character(len=4) :: str4 + str1 = 'x' + str4 = 'xyzz' + str1 = cdir() + if(str1 /= '/') call abort() + str4 = cdir() + if(str4 /= '/' .or. ichar(str4(2:2)) /= 32) call abort() + i = ICHAR(cdir()) + if (i /= 47) call abort() + str4 = 'xyzz' + WRITE(str4,'(a)') cdir() + if(str4 /= '/' .or. ichar(str4(2:2)) /= 32) call abort() + str4 = 'xyzz' + WRITE(str4,'(i0)') ICHAR(cdir()) + if(str4 /= '47' .or. ichar(str4(3:3)) /= 32) call abort() +END PROGRAM + +! { dg-final { cleanup-modules "mod" } } diff --git a/gcc/testsuite/gfortran.dg/bind_c_usage_17_c.c b/gcc/testsuite/gfortran.dg/bind_c_usage_17_c.c new file mode 100644 index 00000000000..456d542af8d --- /dev/null +++ b/gcc/testsuite/gfortran.dg/bind_c_usage_17_c.c @@ -0,0 +1,4 @@ +/* PR fortran/37201. + Linked with bind_c_usage_17.f90. */ + +char cdir(void){return '/';}