diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 93f775ee095..b0fa324f984 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +2007-11-23 Tobias Burnus + + PR fortran/34187 + * module.c (load_needed): Ensure binding_label is not lost. + + * decl.c (set_binding_label,gfc_match_bind_c): Replace + strncpy by strcpy. + 2007-11-23 Tobias Burnus Steven G. Kargl diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index 78b05c4af1e..d66ea533ca7 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -3126,15 +3126,14 @@ set_binding_label (char *dest_label, const char *sym_name, int num_idents) if (curr_binding_label[0] != '\0') { /* Binding label given; store in temp holder til have sym. */ - strncpy (dest_label, curr_binding_label, - strlen (curr_binding_label) + 1); + strcpy (dest_label, curr_binding_label); } else { /* No binding label given, and the NAME= specifier did not exist, which means there was no NAME="". */ if (sym_name != NULL && has_name_equals == 0) - strncpy (dest_label, sym_name, strlen (sym_name) + 1); + strcpy (dest_label, sym_name); } return SUCCESS; @@ -4736,12 +4735,10 @@ gfc_match_bind_c (gfc_symbol *sym) { if (sym != NULL) { - strncpy (sym->binding_label, binding_label, - strlen (binding_label)+1); + strcpy (sym->binding_label, binding_label); } else - strncpy (curr_binding_label, binding_label, - strlen (binding_label) + 1); + strcpy (curr_binding_label, binding_label); } else { diff --git a/gcc/fortran/module.c b/gcc/fortran/module.c index b0962e0b542..00b9e259546 100644 --- a/gcc/fortran/module.c +++ b/gcc/fortran/module.c @@ -3419,6 +3419,7 @@ load_needed (pointer_info *p) sym = gfc_new_symbol (p->u.rsym.true_name, ns); sym->module = gfc_get_string (p->u.rsym.module); + strcpy (sym->binding_label, p->u.rsym.binding_label); associate_integer_pointer (p, sym); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d87601f419d..ee015a29f00 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-11-23 Tobias Burnus + + PR fortran/34187 + * gfortran.dg/bind_c_usage_15.f90: New. + 2007-11-23 Tobias Burnus PR fortran/34192 diff --git a/gcc/testsuite/gfortran.dg/bind_c_usage_15.f90 b/gcc/testsuite/gfortran.dg/bind_c_usage_15.f90 new file mode 100644 index 00000000000..c5201a634db --- /dev/null +++ b/gcc/testsuite/gfortran.dg/bind_c_usage_15.f90 @@ -0,0 +1,29 @@ +! { dg-do run } +! +! PR fortran/34187 +! The binding label was not exported for private procedures +! with public generic interfaces. +! +module mod + use iso_c_binding, only: c_int + implicit none + private + public :: gen, c_int + interface gen + module procedure test + end interface gen +contains + subroutine test(a) bind(c, name="myFunc") + integer(c_int), intent(out) :: a + a = 17 + end subroutine test +end module mod + +program main + use mod + implicit none + integer(c_int) :: x + x = -44 + call gen(x) + if(x /= 17) call abort() +end program main