aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/fortran/ChangeLog8
-rw-r--r--gcc/fortran/decl.c11
-rw-r--r--gcc/fortran/module.c1
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/bind_c_usage_15.f9029
5 files changed, 47 insertions, 7 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 93f775e..b0fa324 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,4 +1,12 @@
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>
PR fortran/34192
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
index 78b05c4..d66ea53 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 b0962e0..00b9e25 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 d87601f..ee015a2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
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
* gfortran.dg/nearest_2.f90: New.
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 0000000..c5201a6
--- /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