From d7ddbe241a953a4ba9adae1f3a38ade24f9121f0 Mon Sep 17 00:00:00 2001
From: Richard Henderson <rth@gcc.gnu.org>
Date: Tue, 18 Feb 2003 18:07:06 -0800
Subject: [PATCH] c-common.c (handle_used_attribute): Accept static data too.

        * c-common.c (handle_used_attribute): Accept static data too.

        * gcc.dg/attr-invalid.c: Allow __used__ on static data.
        * gcc.dg/attr-used-2.c: New.

From-SVN: r63082
---
 gcc/ChangeLog                       |  6 +++++-
 gcc/c-common.c                      | 13 ++++++++-----
 gcc/testsuite/ChangeLog             |  5 +++++
 gcc/testsuite/gcc.dg/attr-invalid.c |  4 ++--
 gcc/testsuite/gcc.dg/attr-used-2.c  | 11 +++++++++++
 5 files changed, 31 insertions(+), 8 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/attr-used-2.c

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index cc6839a6fcfc..04b7f814bd41 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,4 +1,8 @@
-003-02-18  Nick Clifton  <nickc@redhat.com>
+2003-02-18  Richard Henderson  <rth@redhat.com>
+
+	* c-common.c (handle_used_attribute): Accept static data too.
+
+2003-02-18  Nick Clifton  <nickc@redhat.com>
             Aldy Hernandez  <aldyh@redhat.com>
 
         * testsuite/gcc.dg/20030218-1.c: New.
diff --git a/gcc/c-common.c b/gcc/c-common.c
index c78692fd9591..b49dc25f43dd 100644
--- a/gcc/c-common.c
+++ b/gcc/c-common.c
@@ -5415,16 +5415,19 @@ handle_always_inline_attribute (node, name, args, flags, no_add_attrs)
    struct attribute_spec.handler.  */
 
 static tree
-handle_used_attribute (node, name, args, flags, no_add_attrs)
-     tree *node;
+handle_used_attribute (pnode, name, args, flags, no_add_attrs)
+     tree *pnode;
      tree name;
      tree args ATTRIBUTE_UNUSED;
      int flags ATTRIBUTE_UNUSED;
      bool *no_add_attrs;
 {
-  if (TREE_CODE (*node) == FUNCTION_DECL)
-    TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (*node))
-      = TREE_USED (*node) = 1;
+  tree node = *pnode;
+
+  if (TREE_CODE (node) == FUNCTION_DECL
+      || (TREE_CODE (node) == VAR_DECL && TREE_STATIC (node)))
+    TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (node))
+      = TREE_USED (node) = 1;
   else
     {
       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 220c69643e4e..4c7b8b38e1cf 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2003-02-18  Richard Henderson  <rth@redhat.com>
+
+	* gcc.dg/attr-invalid.c: Allow __used__ on static data.
+	* gcc.dg/attr-used-2.c: New.
+
 2003-02-18  Mark Mitchell  <mark@codesourcery.com>
 
 	PR c++/9704
diff --git a/gcc/testsuite/gcc.dg/attr-invalid.c b/gcc/testsuite/gcc.dg/attr-invalid.c
index a999c267c3ab..9cb645415480 100644
--- a/gcc/testsuite/gcc.dg/attr-invalid.c
+++ b/gcc/testsuite/gcc.dg/attr-invalid.c
@@ -43,7 +43,7 @@ struct ATSYM(struct) {
   char dummy ATTR; /* { dg-warning "attribute ignored" "" } */
 } ATTR; /* { dg-warning "does not apply to types" "" } */
 
-int ATSYM(var) ATTR;  /* { dg-warning "attribute ignored" "" } */
+int ATSYM(var) ATTR;
 
 int ATSYM(fn_knrarg) (arg)
   int arg ATTR; /* { dg-warning "attribute ignored" "" } */
@@ -52,7 +52,7 @@ int ATSYM(fn_knrarg) (arg)
 int ATSYM(fn_isoarg) (int arg ATTR) { return 0; } /* { dg-warning "attribute ignored" "" } */
 
 int ATSYM(fn_vars) (void) {
-  static int svar ATTR; /* { dg-warning "attribute ignored" "" } */
+  static int svar ATTR;
   auto int lvar ATTR; /* { dg-warning "attribute ignored" "" } */
   return 0;
 }
diff --git a/gcc/testsuite/gcc.dg/attr-used-2.c b/gcc/testsuite/gcc.dg/attr-used-2.c
new file mode 100644
index 000000000000..f78b94b53a94
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/attr-used-2.c
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-Wall -O2" } */
+
+static int xyzzy __attribute__((__used__)) = 1; 
+
+void foo()
+{
+  int x __attribute__((__used__)); /* { dg-warning "attribute ignored|unused variable" } */
+}
+
+/* { dg-final { scan-assembler "xyzzy" } } */
-- 
GitLab