Added __attribute__((deprecated)) patches.
authorIra Ruben <ira@gcc.gnu.org>
Thu, 10 Jan 2002 18:51:24 +0000 (18:51 +0000)
committerIra Ruben <ira@gcc.gnu.org>
Thu, 10 Jan 2002 18:51:24 +0000 (18:51 +0000)
From-SVN: r48743

17 files changed:
gcc/attribs.c
gcc/c-decl.c
gcc/c-typeck.c
gcc/cp/call.c
gcc/cp/class.c
gcc/cp/cp-tree.h
gcc/cp/decl.c
gcc/cp/lex.c
gcc/cp/typeck.c
gcc/diagnostic.c
gcc/doc/extend.texi
gcc/doc/invoke.texi
gcc/flags.h
gcc/print-tree.c
gcc/toplev.c
gcc/toplev.h
gcc/tree.h

index 19e99ad305592d8e9abff921ec8201fadbc782af..f342cd16bf3c50029d9d0c7b15b1300d60062368 100644 (file)
@@ -82,6 +82,8 @@ static tree handle_no_limit_stack_attribute PARAMS ((tree *, tree, tree, int,
                                                     bool *));
 static tree handle_pure_attribute      PARAMS ((tree *, tree, tree, int,
                                                 bool *));
+static tree handle_deprecated_attribute        PARAMS ((tree *, tree, tree, int,
+                                                bool *));
 static tree handle_vector_size_attribute PARAMS ((tree *, tree, tree, int,
                                                  bool *));
 static tree vector_size_helper PARAMS ((tree, tree));
@@ -138,6 +140,8 @@ static const struct attribute_spec c_common_attribute_table[] =
                              handle_no_limit_stack_attribute },
   { "pure",                   0, 0, true,  false, false,
                              handle_pure_attribute },
+  { "deprecated",             0, 0, false, false, false,
+                             handle_deprecated_attribute },
   { "vector_size",           1, 1, false, true, false,
                              handle_vector_size_attribute },
   { NULL,                     0, 0, false, false, false, NULL }
@@ -1131,6 +1135,67 @@ handle_pure_attribute (node, name, args, flags, no_add_attrs)
   return NULL_TREE;
 }
 
+/* Handle a "deprecated" attribute; arguments as in
+   struct attribute_spec.handler.  */
+   
+static tree
+handle_deprecated_attribute (node, name, args, flags, no_add_attrs)
+     tree *node;
+     tree name;
+     tree args ATTRIBUTE_UNUSED;
+     int flags;
+     bool *no_add_attrs;
+{
+  tree type = NULL_TREE;
+  int warn = 0;
+  char *what = NULL;
+  
+  if (DECL_P (*node))
+    {
+      tree decl = *node;
+      type = TREE_TYPE (decl);
+      
+      if (TREE_CODE (decl) == TYPE_DECL
+         || TREE_CODE (decl) == PARM_DECL
+         || TREE_CODE (decl) == VAR_DECL
+         || TREE_CODE (decl) == FUNCTION_DECL
+         || TREE_CODE (decl) == FIELD_DECL)
+       TREE_DEPRECATED (decl) = 1;
+      else
+       warn = 1;
+    }
+  else if (TYPE_P (*node))
+    {
+      if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
+       *node = build_type_copy (*node);
+      TREE_DEPRECATED (*node) = 1;
+      type = *node;
+    }
+  else
+    warn = 1;
+  
+  if (warn)
+    {
+      *no_add_attrs = true;
+      if (type && TYPE_NAME (type))
+       {
+         if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
+           what = IDENTIFIER_POINTER (TYPE_NAME (*node));
+         else if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
+                  && DECL_NAME (TYPE_NAME (type)))
+           what = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)));
+       }
+      if (what)
+       warning ("`%s' attribute ignored for `%s'",
+                 IDENTIFIER_POINTER (name), what);
+      else
+       warning ("`%s' attribute ignored", 
+                     IDENTIFIER_POINTER (name));
+    }
+
+  return NULL_TREE;
+}
+
 /* Handle a "vector_size" attribute; arguments as in
    struct attribute_spec.handler.  */
 
index d6e8ac33469b64f0700f0c7fe59502c31bb9fc0e..206c7718ba13103c0e3cb12c2f708794049cee7c 100644 (file)
@@ -439,6 +439,18 @@ int warn_multichar = 1;
 #endif
 int dollars_in_ident = DOLLARS_IN_IDENTIFIERS;
 
+/* States indicating how grokdeclarator() should handle declspecs marked
+   with __attribute__((deprecated)).  An object declared as
+   __attribute__((deprecated)) suppresses warnings of uses of other
+   deprecated items.  */
+   
+enum deprecated_states {
+  DEPRECATED_NORMAL,
+  DEPRECATED_SUPPRESS
+};
+
+static enum deprecated_states deprecated_state = DEPRECATED_NORMAL;
+
 /* Decode the string P as a language-specific option for C.
    Return the number of strings consumed.  Should not complain
    if it does not recognise the option.  */
@@ -3420,9 +3432,18 @@ start_decl (declarator, declspecs, initialized, attributes)
      int initialized;
      tree attributes;
 {
-  tree decl = grokdeclarator (declarator, declspecs,
-                             NORMAL, initialized);
+  tree decl;
   tree tem;
+  
+  /* An object declared as __attribute__((deprecated)) suppresses
+     warnings of uses of other deprecated items.  */
+  if (lookup_attribute ("deprecated", attributes))
+    deprecated_state = DEPRECATED_SUPPRESS;
+
+  decl = grokdeclarator (declarator, declspecs,
+                        NORMAL, initialized);
+  
+  deprecated_state = DEPRECATED_NORMAL;
 
   if (warn_main > 0 && TREE_CODE (decl) != FUNCTION_DECL
       && MAIN_NAME_P (DECL_NAME (decl)))
@@ -4091,6 +4112,14 @@ grokdeclarator (declarator, declspecs, decl_context, initialized)
     {
       tree id = TREE_VALUE (spec);
 
+      /* If the entire declaration is itself tagged as deprecated then
+         suppress reports of deprecated items.  */
+      if (id && TREE_DEPRECATED (id))
+        {
+         if (deprecated_state != DEPRECATED_SUPPRESS)
+           warn_deprecated_use (id);
+        }
+
       if (id == ridpointers[(int) RID_INT])
        explicit_int = 1;
       if (id == ridpointers[(int) RID_CHAR])
index cf3a387e99fb336c5d15a1f37298820aaa5d1ce1..2c476989c681e82e27e68fac13006e699e709379 100644 (file)
@@ -1199,6 +1199,10 @@ build_component_ref (datum, component)
            TREE_READONLY (ref) = 1;
          if (TREE_THIS_VOLATILE (datum) || TREE_THIS_VOLATILE (subdatum))
            TREE_THIS_VOLATILE (ref) = 1;
+
+         if (TREE_DEPRECATED (subdatum))
+           warn_deprecated_use (subdatum);
+
          datum = ref;
        }
 
@@ -1415,6 +1419,9 @@ build_external_ref (id, fun)
   tree decl = lookup_name (id);
   tree objc_ivar = lookup_objc_ivar (id);
 
+  if (decl && TREE_DEPRECATED (decl))
+    warn_deprecated_use (decl);
+
   if (!decl || decl == error_mark_node || C_DECL_ANTICIPATED (decl))
     {
       if (objc_ivar)
index dfdf1aac8679036bba0a9131e70b7eb9f9282bc3..0b8ec03375e7e9bd0f2b1089cd1976c27fdd264e 100644 (file)
@@ -407,7 +407,10 @@ build_call (function, parms)
      throw without being declared throw().  */
   nothrow = ((decl && TREE_NOTHROW (decl))
             || TYPE_NOTHROW_P (TREE_TYPE (TREE_TYPE (function))));
-  
+
+  if (decl && TREE_DEPRECATED (decl))
+    warn_deprecated_use (decl);
+
   if (decl && DECL_CONSTRUCTOR_P (decl))
     is_constructor = 1;
 
index a1817e32809d5b4c6f29a2ca826c494483869888..6e9e34e8fafe9f1eb905056db9a876f57c449a23 100644 (file)
@@ -2926,6 +2926,8 @@ add_implicitly_declared_members (t, cant_have_default_ctor,
   tree virtual_dtor = NULL_TREE;
   tree *f;
 
+  ++adding_implicit_members;
+
   /* Destructor.  */
   if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t) && !TYPE_HAS_DESTRUCTOR (t))
     {
@@ -2985,6 +2987,8 @@ add_implicitly_declared_members (t, cant_have_default_ctor,
   *f = TYPE_METHODS (t);
   TYPE_METHODS (t) = implicit_fns;
 
+  --adding_implicit_members;
+
   return virtual_dtor;
 }
 
index 9538921a2eb9d399cdec4d031d9a8df33214ee50..c157466a5726dd38bc086fdf4660ffcddfd0fc21 100644 (file)
@@ -3108,6 +3108,11 @@ extern int warn_overloaded_virtual;
 /* Nonzero means warn about use of multicharacter literals.  */
 extern int warn_multichar;
 
+/* Set by add_implicitly_declared_members() to keep those members from
+   being flagged as deprecated or reported as using deprecated
+   types.  */
+extern int adding_implicit_members;
+
 /* Non-zero means warn if a non-templatized friend function is
    declared in a templatized class. This behavior is warned about with
    flag_guiding_decls in do_friend. */
index 944fe93161b7d2e6df3913f51c304384f34fb470..ed163fdece747b3f22e0de1a2767ea02f2dcc2fb 100644 (file)
@@ -302,6 +302,23 @@ tree anonymous_namespace_name;
    (Zero if we are at namespace scope, one inside the body of a
    function, two inside the body of a function in a local class, etc.)  */
 int function_depth;
+
+/* States indicating how grokdeclarator() should handle declspecs marked
+   with __attribute__((deprecated)).  An object declared as
+   __attribute__((deprecated)) suppresses warnings of uses of other
+   deprecated items.  */
+   
+enum deprecated_states {
+  DEPRECATED_NORMAL,
+  DEPRECATED_SUPPRESS
+};
+
+static enum deprecated_states deprecated_state = DEPRECATED_NORMAL;
+
+/* Set by add_implicitly_declared_members() to keep those members from
+   being flagged as deprecated or reported as using deprecated
+   types.  */
+int adding_implicit_members = 0;
 \f
 /* For each binding contour we allocate a binding_level structure
    which records the names defined in that contour.
@@ -7161,11 +7178,18 @@ start_decl (declarator, declspecs, initialized, attributes, prefix_attributes)
       used_extern_spec = 1;
     }
 
+  /* An object declared as __attribute__((deprecated)) suppresses
+     warnings of uses of other deprecated items.  */
+  if (lookup_attribute ("deprecated", attributes))
+    deprecated_state = DEPRECATED_SUPPRESS;
+
   attributes = chainon (attributes, prefix_attributes);
 
   decl = grokdeclarator (declarator, declspecs, NORMAL, initialized,
                         &attributes);
 
+  deprecated_state = DEPRECATED_NORMAL;
+
   if (decl == NULL_TREE || TREE_CODE (decl) == VOID_TYPE)
     return NULL_TREE;
 
@@ -9992,6 +10016,14 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
 
       id = TREE_VALUE (spec);
 
+      /* If the entire declaration is itself tagged as deprecated then
+         suppress reports of deprecated items.  */
+      if (!adding_implicit_members && id && TREE_DEPRECATED (id))
+        {
+         if (deprecated_state != DEPRECATED_SUPPRESS)
+           warn_deprecated_use (id);
+        }
+
       if (TREE_CODE (id) == IDENTIFIER_NODE)
        {
          if (id == ridpointers[(int) RID_INT]
index 82b14ae5623d2f50dc59ebff2e8da7ef41023e5c..a6d983a1012e413da81936e6fe7deee47aafa74d 100644 (file)
@@ -1215,6 +1215,9 @@ do_identifier (token, parsing, args)
   else
     id = lastiddecl;
 
+  if (lexing && id && TREE_DEPRECATED (id))
+    warn_deprecated_use (id);
+
   /* Do Koenig lookup if appropriate (inside templates we build lookup
      expressions instead).
 
index b939de7044710a3d87b1451dddac9904e11ebda9..c189b6d37c89e2224f5dc70066bbee7b6c8d3f7c 100644 (file)
@@ -2199,6 +2199,9 @@ build_component_ref (datum, component, basetype_path, protect)
        }
     }
 
+  if (TREE_DEPRECATED (field))
+    warn_deprecated_use (field);
+
   /* See if we have to do any conversions so that we pick up the field from the
      right context.  */
   if (DECL_FIELD_CONTEXT (field) != basetype)
index d566401597988c5f83f81e847676462e19eb92ef..ac3539beda1abb579aa8fcf75ba631317be2c23d 100644 (file)
@@ -1520,3 +1520,44 @@ default_diagnostic_finalizer (buffer, dc)
 {
   output_destroy_prefix (buffer);
 }
+
+void 
+warn_deprecated_use (node)
+     tree node;
+{
+  if (node && warn_deprecated_decl)
+    if (DECL_P (node))
+      {
+       warning ("`%s' is deprecated (declared at %s:%d)",
+                IDENTIFIER_POINTER (DECL_NAME (node)),
+                DECL_SOURCE_FILE (node), DECL_SOURCE_LINE (node));
+      }
+    else if (TYPE_P (node))
+      {
+       char *what = NULL;
+       tree decl = TYPE_STUB_DECL (node);
+       
+       if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
+         what = IDENTIFIER_POINTER (TYPE_NAME (node));
+       else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
+                && DECL_NAME (TYPE_NAME (node)))
+         what = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (node)));
+       
+       if (what)
+         {
+           if (decl)
+             warning ("`%s' is deprecated (declared at %s:%d)", what,
+                      DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl));
+           else
+             warning ("`%s' is deprecated", what);
+         }
+       else
+         {
+           if (decl)
+             warning ("type is deprecated (declared at %s:%d)",
+                      DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl));
+           else
+             warning ("type is deprecated");
+         }
+      }
+}
index 2e22c1b7d9b410ba72485d2b0853ba4f9f7b0cf9..63095ba3c0f2022f80039761fb9b495df1b97a61 100644 (file)
@@ -1882,11 +1882,11 @@ attributes are currently defined for functions on all targets:
 @code{noreturn}, @code{noinline}, @code{pure}, @code{const},
 @code{format}, @code{format_arg}, @code{no_instrument_function},
 @code{section}, @code{constructor}, @code{destructor}, @code{used},
-@code{unused}, @code{weak}, @code{malloc}, and @code{alias}.  Several
-other attributes are defined for functions on particular target systems.
-Other attributes, including @code{section} are supported for variables
-declarations (@pxref{Variable Attributes}) and for types (@pxref{Type
-Attributes}).
+@code{unused}, @code{deprecated}, @code{weak}, @code{malloc}, and
+@code{alias}.  Several other attributes are defined for functions on
+particular target systems.  Other attributes, including @code{section}
+are supported for variables declarations (@pxref{Variable Attributes})
+and for types (@pxref{Type Attributes}).
 
 You may also specify attributes with @samp{__} preceding and following
 each keyword.  This allows you to use them in header files without
@@ -2147,6 +2147,27 @@ for the function even if it appears that the function is not referenced.
 This is useful, for example, when the function is referenced only in
 inline assembly.
 
+@cindex @code{deprecated} attribute.
+@item deprecated
+The @code{deprecated} attribute results in a warning if the function
+is used anywhere in the source file.  This is useful when identifying
+functions that are expected to be removed in a future version of a
+program.  The warning also includes the location of the declaration
+of the deprecated function, to enable users to easily find further
+information about why the function is deprecated, or what they should
+do instead.  Note that the warnings only occurs for uses:
+
+@smallexample
+int old_fn () __attribute__ ((deprecated));
+int old_fn ();
+int (*fn_ptr)() = old_fn;
+@end smallexample
+
+results in a warning on line 3 but not line 2.
+
+The @code{deprecated} attribute can also be used for variables and
+types (@pxref{Variable Attributes}, @pxref{Type Attributes}.)
+
 @item weak
 @cindex @code{weak} attribute
 The @code{weak} attribute causes the declaration to be emitted as a weak
@@ -2760,15 +2781,15 @@ section.
 
 The keyword @code{__attribute__} allows you to specify special
 attributes of variables or structure fields.  This keyword is followed
-by an attribute specification inside double parentheses.  Nine
+by an attribute specification inside double parentheses.  Ten
 attributes are currently defined for variables: @code{aligned},
 @code{mode}, @code{nocommon}, @code{packed}, @code{section},
-@code{transparent_union}, @code{unused}, @code{vector_size}, and
-@code{weak}.  Some other attributes are defined for variables on
-particular target systems.  Other attributes are available for functions
-(@pxref{Function Attributes}) and for types (@pxref{Type Attributes}).
-Other front ends might define more attributes (@pxref{C++
-Extensions,,Extensions to the C++ Language}).
+@code{transparent_union}, @code{unused}, @code{deprecated},
+@code{vector_size}, and @code{weak}.  Some other attributes are defined
+for variables on particular target systems.  Other attributes are
+available for functions (@pxref{Function Attributes}) and for types
+(@pxref{Type Attributes}).  Other front ends might define more
+attributes (@pxref{C++ Extensions,,Extensions to the C++ Language}).
 
 You may also specify attributes with @samp{__} preceding and following
 each keyword.  This allows you to use them in header files without
@@ -2970,6 +2991,26 @@ This attribute, attached to a variable, means that the variable is meant
 to be possibly unused.  GCC will not produce a warning for this
 variable.
 
+@item deprecated
+The @code{deprecated} attribute results in a warning if the variable
+is used anywhere in the source file.  This is useful when identifying
+variables that are expected to be removed in a future version of a
+program.  The warning also includes the location of the declaration
+of the deprecated variable, to enable users to easily find further
+information about why the variable is deprecated, or what they should
+do instead.  Note that the warnings only occurs for uses:
+
+@smallexample
+extern int old_var __attribute__ ((deprecated));
+extern int old_var;
+int new_fn () @{ return old_var; @}
+@end smallexample
+
+results in a warning on line 3 but not line 2.
+
+The @code{deprecated} attribute can also be used for functions and
+types (@pxref{Function Attributes}, @pxref{Type Attributes}.)
+
 @item vector_size (@var{bytes})
 This attribute specifies the vector size for the variable, measured in
 bytes.  For example, the declaration:
@@ -3029,10 +3070,10 @@ packed))}.
 The keyword @code{__attribute__} allows you to specify special
 attributes of @code{struct} and @code{union} types when you define such
 types.  This keyword is followed by an attribute specification inside
-double parentheses.  Four attributes are currently defined for types:
-@code{aligned}, @code{packed}, @code{transparent_union}, and @code{unused}.
-Other attributes are defined for functions (@pxref{Function Attributes}) and
-for variables (@pxref{Variable Attributes}).
+double parentheses.  Five attributes are currently defined for types:
+@code{aligned}, @code{packed}, @code{transparent_union}, @code{unused},
+and @code{deprecated}.  Other attributes are defined for functions
+(@pxref{Function Attributes}) and for variables (@pxref{Variable Attributes}).
 
 You may also specify any one of these attributes with @samp{__}
 preceding and following its keyword.  This allows you to use these
@@ -3215,6 +3256,34 @@ the case with lock or thread classes, which are usually defined and then
 not referenced, but contain constructors and destructors that have
 nontrivial bookkeeping functions.
 
+@item deprecated
+The @code{deprecated} attribute results in a warning if the type
+is used anywhere in the source file.  This is useful when identifying
+types that are expected to be removed in a future version of a program.
+If possible, the warning also includes the location of the declaration
+of the deprecated type, to enable users to easily find further
+information about why the type is deprecated, or what they should do
+instead.  Note that the warnings only occur for uses and then only
+if the type is being applied to a identifier that itself is not being
+declared as deprecated.
+
+@smallexample
+typedef int T1 __attribute__ ((deprecated));
+T1 x;
+typedef T1 T2;
+T2 y;
+typedef T1 T3 __attribute__ ((deprecated));
+T3 z __attribute__ ((deprecated));
+@end smallexample
+
+results in a warning on line 2 and 3 but not lines 4, 5, or 6.  No
+warning is issued for line 4 because T2 is not explicitly
+deprecated.  Line 5 has no warning because T3 is explicitly
+deprecated.  Similarly for line 6.
+
+The @code{deprecated} attribute can also be used for functions and
+variables (@pxref{Function Attributes}, @pxref{Variable Attributes}.)
+
 @end table
 
 To specify multiple attributes, separate them by commas within the
index d5eaeefe9b5d06b2ddc9f9d72889c786913aab67..9fac575ae78ff89d02c64e5d4f15e80eeb494ffc 100644 (file)
@@ -213,7 +213,8 @@ in the following sections.
 -fsyntax-only  -pedantic  -pedantic-errors @gol
 -w  -W  -Wall  -Waggregate-return @gol
 -Wcast-align  -Wcast-qual  -Wchar-subscripts  -Wcomment @gol
--Wconversion  -Wdisabled-optimization  -Wdiv-by-zero  -Werror @gol
+-Wconversion  -Wno-deprecated-declarations @gol
+-Wdisabled-optimization  -Wdiv-by-zero  -Werror @gol
 -Wfloat-equal  -Wformat  -Wformat=2 @gol
 -Wformat-nonliteral  -Wformat-security @gol
 -Wimplicit  -Wimplicit-int  @gol
@@ -2506,6 +2507,13 @@ case, and some functions for which @code{format} attributes are
 appropriate may not be detected.  This option has no effect unless
 @option{-Wformat} is enabled (possibly by @option{-Wall}).
 
+@item -Wno-deprecated-declarations
+@opindex Wno-deprecated-declarations
+Do not warn about uses of functions, variables, and types marked as
+deprecated by using the @code{deprecated} attribute. 
+(@pxref{Function Attributes}, @pxref{Variable Attributes},
+@pxref{Type Attributes}.)
+
 @item -Wpacked
 @opindex Wpacked
 Warn if a structure is given the packed attribute, but the packed
index 49fdaa0aa35a0bcca0ea738fb93739b794b3f26b..65353e61677f71b9b3deb2aa7bec16ce5d631fa3 100644 (file)
@@ -169,6 +169,11 @@ extern int warn_padded;
 
 extern int warn_disabled_optimization;
 
+/* Nonzero means warn about uses of __attribute__((deprecated)) 
+   declarations.  */
+
+extern int warn_deprecated_decl;
+
 /* Nonzero if generating code to do profiling.  */
 
 extern int profile_flag;
index 4cef3f5e7a58f7186489182e4d0d8cbd381c6ee2..669c03e499dcc9c32555e1d6f2d64710c1542029 100644 (file)
@@ -294,6 +294,8 @@ print_node (file, prefix, node, indent)
     fputs (" protected", file);
   if (TREE_STATIC (node))
     fputs (" static", file);
+  if (TREE_DEPRECATED (node))
+    fputs (" deprecated", file);
   if (TREE_LANG_FLAG_0 (node))
     fputs (" tree_0", file);
   if (TREE_LANG_FLAG_1 (node))
index da508a763f23c5e56e5fd1ba13314b1cf606dcd8..4d0e4b5c5acdbf7c79651fc6ad064071ea132ef7 100644 (file)
@@ -1464,6 +1464,11 @@ int warn_disabled_optimization;
 
 int warn_missing_noreturn;
 
+/* Nonzero means warn about uses of __attribute__((deprecated)) 
+   declarations.  */
+
+int warn_deprecated_decl = 1;
+
 /* Likewise for -W.  */
 
 static const lang_independent_options W_options[] =
@@ -1502,6 +1507,8 @@ static const lang_independent_options W_options[] =
    N_("Warn when padding is required to align struct members") },
   {"disabled-optimization", &warn_disabled_optimization, 1,
    N_("Warn when an optimization pass is disabled") },
+  {"deprecated-declarations", &warn_deprecated_decl, 1,
+   N_("Warn about uses of __attribute__((deprecated)) declarations") },
   {"missing-noreturn", &warn_missing_noreturn, 1,
    N_("Warn about functions which might be candidates for attribute noreturn") }
 };
index 15cc264bbbdbd71fb5ee69b794a542fc84e45a5a..41ccedc46d09991b1841cabbb5f047f93e3d2825 100644 (file)
@@ -87,6 +87,7 @@ extern void error_for_asm             PARAMS ((struct rtx_def *,
                                                 const char *, ...));
 extern void warning_for_asm            PARAMS ((struct rtx_def *,
                                                 const char *, ...));
+extern void warn_deprecated_use                PARAMS ((union tree_node *));
 extern int do_float_handler PARAMS ((void (*) (PTR), PTR));
 
 #ifdef BUFSIZ
index 642b55543892e54353a82de7f864bd486a71cde0..adcb0f23621f805f83717faf0fd87f4f2a233141 100644 (file)
@@ -139,6 +139,7 @@ struct tree_common
   unsigned private_flag : 1;
   unsigned protected_flag : 1;
   unsigned bounded_flag : 1;
+  unsigned deprecated_flag : 1;
 
   unsigned lang_flag_0 : 1;
   unsigned lang_flag_1 : 1;
@@ -260,7 +261,13 @@ struct tree_common
           expressions, VAR_DECL, PARM_DECL, FIELD_DECL, FUNCTION_DECL,
           IDENTIFIER_NODE
        TYPE_BOUNDED in
-          ..._TYPE */
+          ..._TYPE
+
+   deprecated_flag:
+
+       TREE_DEPRECATED in
+          ..._DECL
+*/
 
 /* Define accessors for the fields that all tree nodes have
    (though some fields are not used for all kinds of nodes).  */
@@ -651,6 +658,10 @@ extern void tree_class_check_failed PARAMS ((const tree, int,
 
 #define TREE_BOUNDED(NODE) ((NODE)->common.bounded_flag)
 
+/* Nonzero in a IDENTIFIER_NODE if the use of the name is defined as a
+   deprecated feature by __attribute__((deprecated)).  */
+#define TREE_DEPRECATED(NODE) ((NODE)->common.deprecated_flag)
+
 /* These flags are available for each language front end to use internally.  */
 #define TREE_LANG_FLAG_0(NODE) ((NODE)->common.lang_flag_0)
 #define TREE_LANG_FLAG_1(NODE) ((NODE)->common.lang_flag_1)