[PATCH,fortran]: Fix PR 33215
Christopher D. Rickett
crickett@lanl.gov
Wed Aug 29 03:58:00 GMT 2007
hi all,
the attached patch fixes PR 33215 and includes a couple testcases from
the code snippets on the bugzilla page. bootstrapped and regtested on x86
linux with no new failures (i'm seeing the same 32 unexpected failures as
those already listed by others on gcc-testresults).
thanks.
Chris
:ADDPATCH fortran:
ChangeLog entry:
2007-08-28 Christopher D. Rickett <crickett@lanl.gov>
PR fortran/33215
* decl.c (build_sym): Pass number of identifiers on line to
set_binding_label.
(set_binding_label): Verify that only one identifier given if
NAME= specified, even if the given binding label has zero length.
(gfc_match_bind_c): Remove declaration for has_name_equals because
it hides the static global one that is needed.
2007-08-28 Christopher D. Rickett <crickett@lanl.gov>
PR fortran/33215
* gfortran.dg/binding_label_tests_15.f03: New test case.
* gfortran.dg/binding_label_tests_16.f03: Ditto.
-------------- next part --------------
Index: gcc/testsuite/gfortran.dg/binding_label_tests_15.f03
===================================================================
--- gcc/testsuite/gfortran.dg/binding_label_tests_15.f03 (revision 0)
+++ gcc/testsuite/gfortran.dg/binding_label_tests_15.f03 (revision 0)
@@ -0,0 +1,12 @@
+! { dg-do compile }
+! Verify that an error is correctly reported if multiple identifiers are given
+! with a bind(c) statement that has a NAME= specifier.
+module m
+ use iso_c_binding
+ implicit none
+ integer(c_int), bind(C, name="") :: a,b ! { dg-error "Multiple identifiers" }
+ integer(c_int), bind(C, name="bob") :: c,d ! { dg-error "Multiple identifiers" }
+ integer(c_int) :: e,f
+ bind(c, name="foo") :: e,f ! { dg-error "Multiple identifiers" }
+end module m
+
Index: gcc/testsuite/gfortran.dg/binding_label_tests_16.f03
===================================================================
--- gcc/testsuite/gfortran.dg/binding_label_tests_16.f03 (revision 0)
+++ gcc/testsuite/gfortran.dg/binding_label_tests_16.f03 (revision 0)
@@ -0,0 +1,21 @@
+! { dg-do run }
+! Verify that the variables 'a' in both modules don't collide.
+module m
+ use iso_c_binding
+ implicit none
+ integer(c_int), save, bind(C, name="") :: a = 5
+end module m
+
+module n
+ use iso_c_binding
+ implicit none
+ integer(c_int), save, bind(C,name="") :: a = -5
+end module n
+
+program prog
+use m
+use n, b=>a
+implicit none
+ print *, a, b
+end program prog
+! { dg-final { cleanup-modules "m n" } }
Index: gcc/fortran/decl.c
===================================================================
--- gcc/fortran/decl.c (revision 127869)
+++ gcc/fortran/decl.c (working copy)
@@ -980,9 +980,10 @@ build_sym (const char *name, gfc_charlen
{
if (sym->binding_label[0] == '\0')
{
- /* Here, we're not checking the numIdents (the last param).
- This could be an error we're letting slip through! */
- if (set_binding_label (sym->binding_label, sym->name, 1) == FAILURE)
+ /* Set the binding label and verify that if a NAME= was specified
+ then only one identifier was in the entity-decl-list. */
+ if (set_binding_label (sym->binding_label, sym->name,
+ num_idents_on_line) == FAILURE)
return FAILURE;
}
}
@@ -2847,15 +2848,15 @@ cleanup:
try
set_binding_label (char *dest_label, const char *sym_name, int num_idents)
{
- if (curr_binding_label[0] != '\0')
+ if (num_idents > 1 && has_name_equals)
{
- if (num_idents > 1 || num_idents_on_line > 1)
- {
- gfc_error ("Multiple identifiers provided with "
- "single NAME= specifier at %C");
- return FAILURE;
- }
+ gfc_error ("Multiple identifiers provided with "
+ "single NAME= specifier at %C");
+ return FAILURE;
+ }
+ 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);
@@ -4084,7 +4085,6 @@ gfc_match_bind_c (gfc_symbol *sym)
char binding_label[GFC_MAX_SYMBOL_LEN + 1];
match double_quote;
match single_quote;
- int has_name_equals = 0;
/* Initialize the flag that specifies whether we encountered a NAME=
specifier or not. */
More information about the Fortran
mailing list