mirror of
https://gcc.gnu.org/git/gcc.git
synced 2026-02-22 12:00:03 -05:00
re PR preprocessor/7358 (Changes to Sun's make Dependencies)
PR preprocessor/7358 PR preprocessor/7357 PR preprocessor/7526 * cppfiles.c (stack_include_file): Ignore main file if appropriate. Correct test of whether a dependency should be output. * cppinit.c (init_dependency_output): Ignore main file for SUNPRO_DEPENDENCIES. (struct lang_flags): Rename trigraphs std. (set_lang): Update. * cpplib.c (run_directive): Kludge so _Pragma dependency works. * cpplib.h (struct cpp_options): New members. * cppmacro.c (collect_args): Flag whether to swallow a possible future comma pasted with varargs. (replace_args): Use this flag. * doc/cpp.texi: Update varargs extension documentation. * doc/cppenv.texi: Update. testsuite: * gcc.dg/cpp/_Pragma3.c, gcc.dg/cpp/vararg3.c, gcc.dg/cpp/vararg4.c: New tests. From-SVN: r56355
This commit is contained in:
@@ -1,3 +1,23 @@
|
||||
2002-08-15 Neil Booth <neil@daikokuya.co.uk>
|
||||
|
||||
PR preprocessor/7358
|
||||
PR preprocessor/7357
|
||||
PR preprocessor/7526
|
||||
* cppfiles.c (stack_include_file): Ignore main file if
|
||||
appropriate. Correct test of whether a dependency should
|
||||
be output.
|
||||
* cppinit.c (init_dependency_output): Ignore main file
|
||||
for SUNPRO_DEPENDENCIES.
|
||||
(struct lang_flags): Rename trigraphs std.
|
||||
(set_lang): Update.
|
||||
* cpplib.c (run_directive): Kludge so _Pragma dependency works.
|
||||
* cpplib.h (struct cpp_options): New members.
|
||||
* cppmacro.c (collect_args): Flag whether to swallow a possible
|
||||
future comma pasted with varargs.
|
||||
(replace_args): Use this flag.
|
||||
* doc/cpp.texi: Update varargs extension documentation.
|
||||
* doc/cppenv.texi: Update.
|
||||
|
||||
2002-08-14 Release Manager
|
||||
|
||||
* GCC 3.2 Released.
|
||||
|
||||
@@ -310,9 +310,12 @@ stack_include_file (pfile, inc)
|
||||
sysp = MAX ((pfile->map ? pfile->map->sysp : 0),
|
||||
(inc->foundhere ? inc->foundhere->sysp : 0));
|
||||
|
||||
/* For -M, add the file to the dependencies on its first inclusion. */
|
||||
if (CPP_OPTION (pfile, print_deps) > sysp && !inc->include_count)
|
||||
deps_add_dep (pfile->deps, inc->name);
|
||||
/* Add the file to the dependencies on its first inclusion. */
|
||||
if (CPP_OPTION (pfile, print_deps) > !!sysp && !inc->include_count)
|
||||
{
|
||||
if (pfile->buffer || CPP_OPTION (pfile, deps_ignore_main_file) == 0)
|
||||
deps_add_dep (pfile->deps, inc->name);
|
||||
}
|
||||
|
||||
/* Not in cache? */
|
||||
if (! inc->buffer)
|
||||
|
||||
@@ -396,7 +396,7 @@ struct lang_flags
|
||||
char objc;
|
||||
char cplusplus;
|
||||
char extended_numbers;
|
||||
char trigraphs;
|
||||
char std;
|
||||
char dollars_in_ident;
|
||||
char cplusplus_comments;
|
||||
char digraphs;
|
||||
@@ -404,7 +404,7 @@ struct lang_flags
|
||||
|
||||
/* ??? Enable $ in identifiers in assembly? */
|
||||
static const struct lang_flags lang_defaults[] =
|
||||
{ /* c99 objc c++ xnum trig dollar c++comm digr */
|
||||
{ /* c99 objc c++ xnum std dollar c++comm digr */
|
||||
/* GNUC89 */ { 0, 0, 0, 1, 0, 1, 1, 1 },
|
||||
/* GNUC99 */ { 1, 0, 0, 1, 0, 1, 1, 1 },
|
||||
/* STDC89 */ { 0, 0, 0, 0, 1, 0, 0, 0 },
|
||||
@@ -431,7 +431,8 @@ set_lang (pfile, lang)
|
||||
CPP_OPTION (pfile, objc) = l->objc;
|
||||
CPP_OPTION (pfile, cplusplus) = l->cplusplus;
|
||||
CPP_OPTION (pfile, extended_numbers) = l->extended_numbers;
|
||||
CPP_OPTION (pfile, trigraphs) = l->trigraphs;
|
||||
CPP_OPTION (pfile, std) = l->std;
|
||||
CPP_OPTION (pfile, trigraphs) = l->std;
|
||||
CPP_OPTION (pfile, dollars_in_ident) = l->dollars_in_ident;
|
||||
CPP_OPTION (pfile, cplusplus_comments) = l->cplusplus_comments;
|
||||
CPP_OPTION (pfile, digraphs) = l->digraphs;
|
||||
@@ -1880,7 +1881,10 @@ init_dependency_output (pfile)
|
||||
{
|
||||
spec = getenv ("SUNPRO_DEPENDENCIES");
|
||||
if (spec)
|
||||
CPP_OPTION (pfile, print_deps) = 2;
|
||||
{
|
||||
CPP_OPTION (pfile, print_deps) = 2;
|
||||
CPP_OPTION (pfile, deps_ignore_main_file) = 1;
|
||||
}
|
||||
else
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -406,12 +406,17 @@ run_directive (pfile, dir_no, buf, count)
|
||||
{
|
||||
cpp_push_buffer (pfile, (const U_CHAR *) buf, count,
|
||||
/* from_stage3 */ true, 1);
|
||||
/* Disgusting hack. */
|
||||
if (dir_no == T_PRAGMA)
|
||||
pfile->buffer->inc = pfile->buffer->prev->inc;
|
||||
start_directive (pfile);
|
||||
/* We don't want a leading # to be interpreted as a directive. */
|
||||
pfile->buffer->saved_flags = 0;
|
||||
pfile->directive = &dtable[dir_no];
|
||||
(void) (*pfile->directive->handler) (pfile);
|
||||
end_directive (pfile, 1);
|
||||
if (dir_no == T_PRAGMA)
|
||||
pfile->buffer->inc = NULL;
|
||||
_cpp_pop_buffer (pfile);
|
||||
}
|
||||
|
||||
|
||||
@@ -279,6 +279,9 @@ struct cpp_options
|
||||
/* If true, fopen (deps_file, "a") else fopen (deps_file, "w"). */
|
||||
unsigned char print_deps_append;
|
||||
|
||||
/* If true, no dependency is generated on the main file. */
|
||||
unsigned char deps_ignore_main_file;
|
||||
|
||||
/* Nonzero means print names of header files (-H). */
|
||||
unsigned char print_include_names;
|
||||
|
||||
@@ -335,6 +338,9 @@ struct cpp_options
|
||||
/* Nonzero for the 1999 C Standard, including corrigenda and amendments. */
|
||||
unsigned char c99;
|
||||
|
||||
/* Nonzero if conforming to some particular standard. */
|
||||
unsigned char std;
|
||||
|
||||
/* Nonzero means give all the error messages the ANSI standard requires. */
|
||||
unsigned char pedantic;
|
||||
|
||||
|
||||
@@ -613,7 +613,20 @@ collect_args (pfile, node)
|
||||
}
|
||||
|
||||
if (!error)
|
||||
return base_buff;
|
||||
{
|
||||
/* GCC has special semantics for , ## b where b is a varargs
|
||||
parameter: we remove the comma if b was omitted entirely.
|
||||
If b was merely an empty argument, the comma is retained.
|
||||
If the macro takes just one (varargs) parameter, then we
|
||||
retain the comma only if we are standards conforming.
|
||||
|
||||
If FIRST is NULL replace_args () swallows the comma. */
|
||||
if (macro->variadic && (argc < macro->paramc
|
||||
|| (argc == 1 && args[0].count == 0
|
||||
&& !CPP_OPTION (pfile, std))))
|
||||
args[macro->paramc - 1].first = NULL;
|
||||
return base_buff;
|
||||
}
|
||||
|
||||
_cpp_release_buff (pfile, base_buff);
|
||||
return NULL;
|
||||
@@ -799,15 +812,13 @@ replace_args (pfile, node, args)
|
||||
count = arg->count, from = arg->first;
|
||||
if (dest != first)
|
||||
{
|
||||
/* GCC has special semantics for , ## b where b is a
|
||||
varargs parameter: the comma disappears if b was
|
||||
given no actual arguments (not merely if b is an
|
||||
empty argument); otherwise the paste flag is removed. */
|
||||
if (dest[-1]->type == CPP_COMMA
|
||||
&& macro->variadic
|
||||
&& src->val.arg_no == macro->paramc)
|
||||
{
|
||||
if (count == 0)
|
||||
/* Swallow a pasted comma if from == NULL, otherwise
|
||||
drop the paste flag. */
|
||||
if (from == NULL)
|
||||
dest--;
|
||||
else
|
||||
paste_flag = dest - 1;
|
||||
|
||||
@@ -1676,6 +1676,15 @@ eprintf ("success!\n")
|
||||
@expansion{} fprintf(stderr, "success!\n");
|
||||
@end example
|
||||
|
||||
@noindent
|
||||
The above explanation is ambiguous about the case where the only macro
|
||||
parameter is a variable arguments parameter, as it is meaningless to
|
||||
try to distinguish whether no argument at all is an empty argument or
|
||||
a missing argument. In this case the C99 standard is clear that the
|
||||
comma must remain, however the existing GCC extension used to swallow
|
||||
the comma. So CPP retains the comma when conforming to a specific C
|
||||
standard, and drops it otherwise.
|
||||
|
||||
C99 mandates that the only place the identifier @code{@w{__VA_ARGS__}}
|
||||
can appear is in the replacement list of a variadic macro. It may not
|
||||
be used as a macro name, macro argument name, or within a different type
|
||||
|
||||
@@ -66,7 +66,8 @@ with an optional @option{-MT} switch too.
|
||||
This variable is the same as the environment variable
|
||||
@env{DEPENDENCIES_OUTPUT} (@pxref{DEPENDENCIES_OUTPUT}), except that
|
||||
system header files are not ignored, so it implies @option{-M} rather
|
||||
than @option{-MM}.
|
||||
than @option{-MM}. However, the dependence on the main input file is
|
||||
omitted.
|
||||
@ifset cppmanual
|
||||
@xref{Invocation}.
|
||||
@end ifset
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
2002-08-15 Neil Booth <neil@daikokuya.co.uk>
|
||||
|
||||
* gcc.dg/cpp/_Pragma3.c, gcc.dg/cpp/vararg3.c, gcc.dg/cpp/vararg4.c:
|
||||
New tests.
|
||||
|
||||
2002-08-14 Release Manager
|
||||
|
||||
* GCC 3.2 Released.
|
||||
|
||||
Reference in New Issue
Block a user