diff options
author | janus <janus@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-11-26 11:16:31 +0000 |
---|---|---|
committer | janus <janus@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-11-26 11:16:31 +0000 |
commit | 9e45357a9a3fac1b1d2e7fed97e694f0018f9ca5 (patch) | |
tree | 9eb2f79f7f351d91466677ca64aaf9814e387c4d | |
parent | 07c5a4621f5d3fefd273a03b35b94b53290815ff (diff) | |
download | gcc-9e45357a9a3fac1b1d2e7fed97e694f0018f9ca5.tar.gz |
2012-11-26 Janus Weil <janus@gcc.gnu.org>
PR fortran/54997
* decl.c (match_procedure_decl): Don't set 'referenced' attribute
for PROCEDURE declarations.
* parse.c (gfc_fixup_sibling_symbols,parse_contained): Don't set
'referenced' attribute for all contained procedures.
* trans-decl.c (gfc_get_symbol_decl): Allow for unreferenced procedures.
(build_function_decl): Set TREE_USED for referenced procedures.
2012-11-26 Janus Weil <janus@gcc.gnu.org>
PR fortran/54997
* gfortran.dg/warn_unused_function_2.f90: New.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@193811 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/fortran/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/fortran/decl.c | 2 | ||||
-rw-r--r-- | gcc/fortran/parse.c | 2 | ||||
-rw-r--r-- | gcc/fortran/trans-decl.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/warn_unused_function_2.f90 | 34 |
6 files changed, 57 insertions, 8 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 1223dcb49c1..d6c759c314b 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,5 +1,15 @@ 2012-11-26 Janus Weil <janus@gcc.gnu.org> + PR fortran/54997 + * decl.c (match_procedure_decl): Don't set 'referenced' attribute + for PROCEDURE declarations. + * parse.c (gfc_fixup_sibling_symbols,parse_contained): Don't set + 'referenced' attribute for all contained procedures. + * trans-decl.c (gfc_get_symbol_decl): Allow for unreferenced procedures. + (build_function_decl): Set TREE_USED for referenced procedures. + +2012-11-26 Janus Weil <janus@gcc.gnu.org> + PR fortran/54881 * match.c (select_derived_set_tmp,select_class_set_tmp): Removed and unified into ... diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index 6f609e9a5a7..77ca9930afc 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -4941,8 +4941,6 @@ match_procedure_decl (void) } - gfc_set_sym_referenced (sym); - if (gfc_match_eos () == MATCH_YES) return MATCH_YES; if (gfc_match_char (',') != MATCH_YES) diff --git a/gcc/fortran/parse.c b/gcc/fortran/parse.c index f31e30940b8..659e9fcc34f 100644 --- a/gcc/fortran/parse.c +++ b/gcc/fortran/parse.c @@ -3928,7 +3928,6 @@ gfc_fixup_sibling_symbols (gfc_symbol *sym, gfc_namespace *siblings) gfc_symtree *st; gfc_symbol *old_sym; - sym->attr.referenced = 1; for (ns = siblings; ns; ns = ns->sibling) { st = gfc_find_symtree (ns->sym_root, sym->name); @@ -4050,7 +4049,6 @@ parse_contained (int module) /* Mark this as a contained function, so it isn't replaced by other module functions. */ sym->attr.contained = 1; - sym->attr.referenced = 1; /* Set implicit_pure so that it can be reset if any of the tests for purity fail. This is used for some optimisation diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 6827298b86e..9adcb8bddb2 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -1195,10 +1195,11 @@ gfc_get_symbol_decl (gfc_symbol * sym) bool intrinsic_array_parameter = false; gcc_assert (sym->attr.referenced - || sym->attr.use_assoc - || sym->ns->proc_name->attr.if_source == IFSRC_IFBODY - || (sym->module && sym->attr.if_source != IFSRC_DECL - && sym->backend_decl)); + || sym->attr.flavor == FL_PROCEDURE + || sym->attr.use_assoc + || sym->ns->proc_name->attr.if_source == IFSRC_IFBODY + || (sym->module && sym->attr.if_source != IFSRC_DECL + && sym->backend_decl)); if (sym->ns && sym->ns->proc_name && sym->ns->proc_name->attr.function) byref = gfc_return_by_reference (sym->ns->proc_name); @@ -1851,6 +1852,9 @@ build_function_decl (gfc_symbol * sym, bool global) || sym->attr.public_used)) TREE_PUBLIC (fndecl) = 1; + if (sym->attr.referenced || sym->attr.entry_master) + TREE_USED (fndecl) = 1; + attributes = add_attributes_to_decl (attr, NULL_TREE); decl_attributes (&fndecl, attributes, 0); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f59ff2927d4..ce211d2c511 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2012-11-26 Janus Weil <janus@gcc.gnu.org> + PR fortran/54997 + * gfortran.dg/warn_unused_function_2.f90: New. + +2012-11-26 Janus Weil <janus@gcc.gnu.org> + PR fortran/54881 * gfortran.dg/associated_6.f90: New. * gfortran.dg/select_type_30.f03: New. diff --git a/gcc/testsuite/gfortran.dg/warn_unused_function_2.f90 b/gcc/testsuite/gfortran.dg/warn_unused_function_2.f90 new file mode 100644 index 00000000000..8d65dabef89 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/warn_unused_function_2.f90 @@ -0,0 +1,34 @@ +! { dg-do compile } +! { dg-options "-Wall" } +! +! [4.8 Regression] PR 54997: -Wunused-function gives false warnings +! +! Contributed by Janus Weil <janus@gcc.gnu.org> + +module m + + implicit none + private :: s1,s2,s3 + +contains + + subroutine s1 ! { dg-warning "defined but not used" } + call s2(s3) + end subroutine + + subroutine s2(dummy) ! { dg-warning "Unused dummy argument" } + procedure() :: dummy + end subroutine + + subroutine s3() + end subroutine + +end module + + +subroutine sub +entry en +end subroutine + + +! { dg-final { cleanup-modules "m" } } |