Commit 7065e130 by Neil Booth Committed by Neil Booth

c-lex.c (lex_number): Only warn traditionally for U suffix outside system macros.

        * c-lex.c (lex_number): Only warn traditionally for U suffix
        outside system macros.
        * cppexp.c (parse_number): Similarly.
        * cpplib.h (NODE_SYSHDR, cpp_sys_objmacro_p): New.
        * cppmacro.c (struct cpp_macro): New member node.
        (parse_args): Only warn about missing rest args if not
        a system macro.
        (funlike_invocation_p): Similarly for uninvoked funlike macros.
        (cpp_sys_objmacro_p): New.
        (_cpp_create_definition): Store the node with the macro defn.
        Remember if the macro is defined in a system header.

From-SVN: r39661
parent 52682a1b
2001-02-14 Neil Booth <neil@daikokuya.demon.co.uk>
* c-lex.c (lex_number): Only warn traditionally for U suffix
outside system macros.
* cppexp.c (parse_number): Similarly.
* cpplib.h (NODE_SYSHDR, cpp_sys_objmacro_p): New.
* cppmacro.c (struct cpp_macro): New member node.
(parse_args): Only warn about missing rest args if not
a system macro.
(funlike_invocation_p): Similarly for uninvoked funlike macros.
(cpp_sys_objmacro_p): New.
(_cpp_create_definition): Store the node with the macro defn.
Remember if the macro is defined in a system header.
2001-02-13 DJ Delorie <dj@redhat.com> 2001-02-13 DJ Delorie <dj@redhat.com>
* configure.in (check_languages): determine languages to check * configure.in (check_languages): determine languages to check
......
...@@ -1225,7 +1225,8 @@ lex_number (str, len) ...@@ -1225,7 +1225,8 @@ lex_number (str, len)
case 'f': case 'F': case 'f': case 'F':
if (fflag) if (fflag)
ERROR ("more than one 'f' suffix on floating constant"); ERROR ("more than one 'f' suffix on floating constant");
else if (warn_traditional && !in_system_header) else if (warn_traditional && !in_system_header
&& ! cpp_sys_objmacro_p (parse_in))
warning ("traditional C rejects the 'f' suffix"); warning ("traditional C rejects the 'f' suffix");
fflag = 1; fflag = 1;
...@@ -1234,7 +1235,8 @@ lex_number (str, len) ...@@ -1234,7 +1235,8 @@ lex_number (str, len)
case 'l': case 'L': case 'l': case 'L':
if (lflag) if (lflag)
ERROR ("more than one 'l' suffix on floating constant"); ERROR ("more than one 'l' suffix on floating constant");
else if (warn_traditional && !in_system_header) else if (warn_traditional && !in_system_header
&& ! cpp_sys_objmacro_p (parse_in))
warning ("traditional C rejects the 'l' suffix"); warning ("traditional C rejects the 'l' suffix");
lflag = 1; lflag = 1;
...@@ -1309,7 +1311,8 @@ lex_number (str, len) ...@@ -1309,7 +1311,8 @@ lex_number (str, len)
case 'u': case 'U': case 'u': case 'U':
if (spec_unsigned) if (spec_unsigned)
error ("two 'u' suffixes on integer constant"); error ("two 'u' suffixes on integer constant");
else if (warn_traditional && !in_system_header) else if (warn_traditional && !in_system_header
&& ! cpp_sys_objmacro_p (parse_in))
warning ("traditional C rejects the 'u' suffix"); warning ("traditional C rejects the 'u' suffix");
spec_unsigned = 1; spec_unsigned = 1;
......
...@@ -203,7 +203,9 @@ parse_number (pfile, tok) ...@@ -203,7 +203,9 @@ parse_number (pfile, tok)
goto invalid_suffix; goto invalid_suffix;
op.unsignedp = sufftab[i].u; op.unsignedp = sufftab[i].u;
if (CPP_WTRADITIONAL (pfile) && sufftab[i].u) if (CPP_WTRADITIONAL (pfile)
&& sufftab[i].u
&& ! cpp_sys_objmacro_p (pfile))
cpp_warning (pfile, "traditional C rejects the `U' suffix"); cpp_warning (pfile, "traditional C rejects the `U' suffix");
if (sufftab[i].l == 2 && CPP_OPTION (pfile, pedantic) if (sufftab[i].l == 2 && CPP_OPTION (pfile, pedantic)
&& ! CPP_OPTION (pfile, c99)) && ! CPP_OPTION (pfile, c99))
......
...@@ -604,6 +604,7 @@ extern void cpp_forall_identifiers PARAMS ((cpp_reader *, ...@@ -604,6 +604,7 @@ extern void cpp_forall_identifiers PARAMS ((cpp_reader *,
extern void cpp_scan_buffer_nooutput PARAMS ((cpp_reader *, int)); extern void cpp_scan_buffer_nooutput PARAMS ((cpp_reader *, int));
extern void cpp_start_lookahead PARAMS ((cpp_reader *)); extern void cpp_start_lookahead PARAMS ((cpp_reader *));
extern void cpp_stop_lookahead PARAMS ((cpp_reader *, int)); extern void cpp_stop_lookahead PARAMS ((cpp_reader *, int));
extern int cpp_sys_objmacro_p PARAMS ((cpp_reader *));
/* In cppfiles.c */ /* In cppfiles.c */
extern int cpp_included PARAMS ((cpp_reader *, const char *)); extern int cpp_included PARAMS ((cpp_reader *, const char *));
......
...@@ -44,6 +44,7 @@ struct cpp_macro ...@@ -44,6 +44,7 @@ struct cpp_macro
unsigned int fun_like : 1; /* If a function-like macro. */ unsigned int fun_like : 1; /* If a function-like macro. */
unsigned int variadic : 1; /* If a variadic macro. */ unsigned int variadic : 1; /* If a variadic macro. */
unsigned int disabled : 1; /* If macro is disabled. */ unsigned int disabled : 1; /* If macro is disabled. */
unsigned int syshdr : 1; /* If macro defined in system header. */
}; };
typedef struct macro_arg macro_arg; typedef struct macro_arg macro_arg;
...@@ -562,7 +563,7 @@ parse_args (pfile, node) ...@@ -562,7 +563,7 @@ parse_args (pfile, node)
if (argc + 1 == macro->paramc && macro->variadic) if (argc + 1 == macro->paramc && macro->variadic)
{ {
if (CPP_PEDANTIC (pfile)) if (CPP_PEDANTIC (pfile) && ! macro->syshdr)
cpp_pedwarn (pfile, "ISO C99 requires rest arguments to be used"); cpp_pedwarn (pfile, "ISO C99 requires rest arguments to be used");
} }
else else
...@@ -616,7 +617,7 @@ funlike_invocation_p (pfile, node, list) ...@@ -616,7 +617,7 @@ funlike_invocation_p (pfile, node, list)
if (maybe_paren.type == CPP_OPEN_PAREN) if (maybe_paren.type == CPP_OPEN_PAREN)
args = parse_args (pfile, node); args = parse_args (pfile, node);
else if (CPP_WTRADITIONAL (pfile)) else if (CPP_WTRADITIONAL (pfile) && ! node->value.macro->syshdr)
cpp_warning (pfile, cpp_warning (pfile,
"function-like macro \"%s\" must be used with arguments in traditional C", "function-like macro \"%s\" must be used with arguments in traditional C",
node->name); node->name);
...@@ -995,6 +996,18 @@ cpp_get_token (pfile, token) ...@@ -995,6 +996,18 @@ cpp_get_token (pfile, token)
save_lookahead_token (pfile, token); save_lookahead_token (pfile, token);
} }
/* Returns true if we're expanding an object-like macro that was
defined in a system header. Just checks the macro at the top of
the stack. Used for diagnostic suppression. */
int
cpp_sys_objmacro_p (pfile)
cpp_reader *pfile;
{
cpp_macro *macro = pfile->context->macro;
return macro && ! macro->fun_like && macro->syshdr;
}
/* Read each token in, until EOF. Directives are transparently /* Read each token in, until EOF. Directives are transparently
processed. */ processed. */
void void
...@@ -1453,6 +1466,9 @@ _cpp_create_definition (pfile, node) ...@@ -1453,6 +1466,9 @@ _cpp_create_definition (pfile, node)
&& macro->expansion[0].type == CPP_NAME && macro->expansion[0].type == CPP_NAME
&& macro->expansion[0].val.node == node); && macro->expansion[0].val.node == node);
/* To suppress some diagnostics. */
macro->syshdr = pfile->buffer->sysp != 0;
/* Commit the memory. */ /* Commit the memory. */
POOL_COMMIT (&pfile->macro_pool, macro->count * sizeof (cpp_token)); POOL_COMMIT (&pfile->macro_pool, macro->count * sizeof (cpp_token));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment