re PR fortran/54997 (-Wunused-function gives false warnings)
authorJanus Weil <janus@gcc.gnu.org>
Mon, 26 Nov 2012 11:16:31 +0000 (12:16 +0100)
committerJanus Weil <janus@gcc.gnu.org>
Mon, 26 Nov 2012 11:16:31 +0000 (12:16 +0100)
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.

From-SVN: r193811

gcc/fortran/ChangeLog
gcc/fortran/decl.c
gcc/fortran/parse.c
gcc/fortran/trans-decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/warn_unused_function_2.f90 [new file with mode: 0644]

index 1223dcb49c18c7b45d36f2e51f8b10e770d94911..d6c759c314b2735bc263fe03f7bc0b10f8cbf7a1 100644 (file)
@@ -1,3 +1,13 @@
+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
index 6f609e9a5a79fe2e67a50de60820ab634f2a880b..77ca9930afc4034b8f1ac3b304be7bdee7170099 100644 (file)
@@ -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)
index f31e30940b8ee655b14f8d2327627a544a69e407..659e9fcc34fefa4bbe6b50504200b942cd3c7d2d 100644 (file)
@@ -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
index 6827298b86efd37fb4eb52e90899f84144e39b19..9adcb8bddb27eb34919b9408e860ef5eb30d4b4f 100644 (file)
@@ -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);
 
index f59ff2927d48f0b893941ccfc2a8ff6def57000a..ce211d2c51164addb051a70b84b174251d6c3ce5 100644 (file)
@@ -1,3 +1,8 @@
+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
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 (file)
index 0000000..8d65dab
--- /dev/null
@@ -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" } }