Added __attribute__((deprecated)) patches.
From-SVN: r48743
This commit is contained in:
parent
47073a3824
commit
e23bd2185f
@ -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. */
|
||||
|
||||
|
33
gcc/c-decl.c
33
gcc/c-decl.c
@ -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])
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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. */
|
||||
|
@ -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;
|
||||
|
||||
/* 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]
|
||||
|
@ -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).
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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))
|
||||
|
@ -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") }
|
||||
};
|
||||
|
@ -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
|
||||
|
13
gcc/tree.h
13
gcc/tree.h
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user