diff options
author | Tobias Burnus <burnus@gcc.gnu.org> | 2008-05-18 13:10:11 +0200 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2008-05-18 13:10:11 +0200 |
commit | e7bff0d1d5a2ca472ab99eba22e006a34ad37c56 (patch) | |
tree | b5aae94d05b87de03144816296f9b337ec01f650 | |
parent | e29cc9b40265813f66eaf8a0e783d7a8a0c5037d (diff) | |
download | gcc-e7bff0d1d5a2ca472ab99eba22e006a34ad37c56.zip gcc-e7bff0d1d5a2ca472ab99eba22e006a34ad37c56.tar.gz gcc-e7bff0d1d5a2ca472ab99eba22e006a34ad37c56.tar.bz2 |
re PR fortran/36251 (PUBLIC and PRIVATE abuse)
2008-05-18 Steven G. Kargl <kargls@comcast.net>
PR fortran/36251
* symbol.c (check_conflict): Issue errors for abuse of PUBLIC,
* PRIVATE,
and BIND(C).
* resolve.c (gfc_verify_binding_labels): Fix NULL pointer
* dereference.
2008-05-18 Steven G. Kargl <kargls@comcast.net>
PR fortran/36251
gfortran.dg/public_private_module.f90: new test.
gfortran.dg/bind_c_module.f90: new test.
From-SVN: r135495
-rw-r--r-- | gcc/fortran/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/fortran/resolve.c | 8 | ||||
-rw-r--r-- | gcc/fortran/symbol.c | 18 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/bind_c_module.f90 | 22 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/public_private_module.f90 | 19 |
6 files changed, 77 insertions, 7 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 38cdafc..35c564c 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,11 +1,18 @@ -2008-05-16 Tobias Burnus <burnus@net-b.de> +2008-05-18 Steven G. Kargl <kargls@comcast.net> + + PR fortran/36251 + * symbol.c (check_conflict): Issue errors for abuse of PUBLIC, PRIVATE, + and BIND(C). + * resolve.c (gfc_verify_binding_labels): Fix NULL pointer dereference. + +2008-05-17 Tobias Burnus <burnus@net-b.de> * intrinsic.texi: Correct description of GET_COMMAND_ARGUMENT and GET_ENVIRONMENT_VARIABLE; fix keyword= name for GETENV, GETLOG, GMTIME, HOSTNM, IRAND, ITIME, KILL. Move LOG_GAMMA after LOG10. -2008-05-16 Tobias Burnus <burnus@net-b.de> +2008-05-17 Tobias Burnus <burnus@net-b.de> * intrinsic.c (add_functions): Change FLUSH(C) to FLUSH(UNIT). * intrinsic.texi: Change INTEGER(*) to INTEGER; fix keyword= name for diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index bf88624..dd251af 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -6612,10 +6612,10 @@ gfc_verify_binding_labels (gfc_symbol *sym) has_error = 1; } else if (sym->attr.contained == 0 - && (sym->attr.if_source == IFSRC_UNKNOWN)) - if ((sym->attr.use_assoc - && (strcmp (bind_c_sym->mod_name, sym->module) != 0)) - || sym->attr.use_assoc == 0) + && sym->attr.if_source == IFSRC_UNKNOWN) + if ((sym->attr.use_assoc && bind_c_sym->mod_name + && strcmp (bind_c_sym->mod_name, sym->module) != 0) + || sym->attr.use_assoc == 0) { gfc_error ("Binding label '%s' at %L collides with global " "entity '%s' at %L", sym->binding_label, diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c index 7f79ee3..431b651 100644 --- a/gcc/fortran/symbol.c +++ b/gcc/fortran/symbol.c @@ -595,6 +595,21 @@ check_conflict (symbol_attribute *attr, const char *name, locus *where) conf2 (function); conf2 (subroutine); conf2 (threadprivate); + + if (attr->access == ACCESS_PUBLIC || attr->access == ACCESS_PRIVATE) + { + a2 = attr->access == ACCESS_PUBLIC ? public : private; + gfc_error ("%s attribute applied to %s %s at %L", a2, a1, + name, where); + return FAILURE; + } + + if (attr->is_bind_c) + { + gfc_error_now ("BIND(C) applied to %s %s at %L", a1, name, where); + return FAILURE; + } + break; case FL_VARIABLE: @@ -3625,7 +3640,8 @@ add_proc_interface (gfc_symbol *sym, ifsrc source, declaration statement (see match_proc_decl()) to create the formal args based on the args of a given named interface. */ -void copy_formal_args (gfc_symbol *dest, gfc_symbol *src) +void +copy_formal_args (gfc_symbol *dest, gfc_symbol *src) { gfc_formal_arglist *head = NULL; gfc_formal_arglist *tail = NULL; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 65aa1e2..d7ad2ec 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2008-05-18 Steven G. Kargl <kargls@comcast.net> + + PR fortran/36251 + gfortran.dg/public_private_module.f90: new test. + gfortran.dg/bind_c_module.f90: new test. + 2008-05-17 Xinliang David Li <davidxl@google.com> * gcc.dg/cdce1.c: New test diff --git a/gcc/testsuite/gfortran.dg/bind_c_module.f90 b/gcc/testsuite/gfortran.dg/bind_c_module.f90 new file mode 100644 index 0000000..58aba2b --- /dev/null +++ b/gcc/testsuite/gfortran.dg/bind_c_module.f90 @@ -0,0 +1,22 @@ +! { dg-do compile } +! See PR fortran/36251. +module a + implicit none + integer :: i = 42 +end module a + +! Causes ICE +module b + use iso_c_binding + use a + implicit none + bind(c) :: a ! { dg-error "attribute applied to" } +end module b + +! Causes ICE +module d + use a + implicit none + bind(c) :: a ! { dg-error "attribute applied to" } +end module d +! { dg-final { cleanup-modules "a" } } diff --git a/gcc/testsuite/gfortran.dg/public_private_module.f90 b/gcc/testsuite/gfortran.dg/public_private_module.f90 new file mode 100644 index 0000000..ca1ab48 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/public_private_module.f90 @@ -0,0 +1,19 @@ +! { dg-do compile } +! See PR fortran/36251. +module a + implicit none + integer :: i = 42 +end module a + +module b + use a + implicit none + public a ! { dg-warning "attribute applied to" } +end module b + +module d + use a + implicit none + private a ! { dg-warning "attribute applied to" } +end module d +! { dg-final { cleanup-modules "a" } } |