We were failing to give "defined but not used" warning for functions marked
with the attribute noreturn/volatile.  The problem is that for functions the
TREE_THIS_VOLATILE flag means something different than for decls.  The fix is
to check the flag only for VAR_DECLs, as suggested by Richi in the PR.

Bootstrapped/regtested on x86_64-linux, ok for trunk?

2015-12-01  Marek Polacek  <pola...@redhat.com>

        PR middle-end/68582
        * cgraphunit.c (check_global_declaration): Only depend on 
TREE_THIS_VOLATILE
        for VAR_DECLs.

        * c-c++-common/pr68582.c: New test.

diff --git gcc/cgraphunit.c gcc/cgraphunit.c
index f73d9a7..4ce5f9b 100644
--- gcc/cgraphunit.c
+++ gcc/cgraphunit.c
@@ -956,7 +956,7 @@ check_global_declaration (symtab_node *snode)
       && ! DECL_ABSTRACT_ORIGIN (decl)
       && ! TREE_PUBLIC (decl)
       /* A volatile variable might be used in some non-obvious way.  */
-      && ! TREE_THIS_VOLATILE (decl)
+      && (! VAR_P (decl) || ! TREE_THIS_VOLATILE (decl))
       /* Global register variables must be declared to reserve them.  */
       && ! (TREE_CODE (decl) == VAR_DECL && DECL_REGISTER (decl))
       /* Global ctors and dtors are called by the runtime.  */
diff --git gcc/testsuite/c-c++-common/pr68582.c 
gcc/testsuite/c-c++-common/pr68582.c
index e69de29..95ca9a4 100644
--- gcc/testsuite/c-c++-common/pr68582.c
+++ gcc/testsuite/c-c++-common/pr68582.c
@@ -0,0 +1,25 @@
+/* PR middle-end/68582 */
+/* { dg-do compile } */
+/* { dg-options "-Wunused-function" } */
+
+/* We failed to give the warning for functions with TREE_THIS_VOLATILE set.  */
+
+static void
+fn1 (void) /* { dg-warning "defined but not used" } */
+{
+  __builtin_abort ();
+}
+
+__attribute__ ((noreturn))
+static void
+fn2 (void) /* { dg-warning "defined but not used" } */
+{
+  __builtin_abort ();
+}
+
+__attribute__ ((volatile))
+static void
+fn3 (void) /* { dg-warning "defined but not used" } */
+{
+  __builtin_abort ();
+}

        Marek

Reply via email to