re PR fortran/34187 (BIND(C): Public generic with private bind(c) specific does not use bind(C) name)

2007-11-23  Tobias Burnus  <burnus@net-b.de>

        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  <burnus@net-b.de>

        PR fortran/34187
        * gfortran.dg/bind_c_usage_15.f90: New.

From-SVN: r130386
This commit is contained in:
Tobias Burnus 2007-11-24 01:11:38 +01:00 committed by Tobias Burnus
parent 88df9da158
commit c5b5a17a92
5 changed files with 47 additions and 7 deletions

View File

@ -1,3 +1,11 @@
2007-11-23 Tobias Burnus <burnus@net-b.de>
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 <burnus@net-b.de>
Steven G. Kargl <kargl@gcc.gnu.org>

View File

@ -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
{

View File

@ -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);
}

View File

@ -1,3 +1,8 @@
2007-11-23 Tobias Burnus <burnus@net-b.de>
PR fortran/34187
* gfortran.dg/bind_c_usage_15.f90: New.
2007-11-23 Tobias Burnus <burnus@net-b.de>
PR fortran/34192

View File

@ -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