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-29 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@127898
138bc75d-0d04-0410-961f-
82ee72b054a4
+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-29 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
* trans-array.c (gfc_grow_array): Use gfc_call_realloc.
{
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;
}
}
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);
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. */
+2007-08-29 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.
+
2007-08-29 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
* gfortran.dg/alloc_comp_basics_1.f90: Update check.
PR c++/32596
* g++.dg/ext/visibility/anon5.C: New test.
-2007-07-28 Dominique d'Humieres <dominiq@lps.ens.fr>
+2007-08-28 Dominique d'Humieres <dominiq@lps.ens.fr>
* gfortran.dg/gamma_4.f90: Fix large-real kind selection.
--- /dev/null
+! { 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
+
--- /dev/null
+! { 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
+ if (a /= 5 .or. b /= -5) call abort()
+end program prog
+! { dg-final { cleanup-modules "m n" } }