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:
Neil Booth
2002-08-15 19:47:44 +00:00
committed by Neil Booth
parent 851653a88a
commit e9b2e28afb
9 changed files with 78 additions and 14 deletions

View File

@@ -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.

View File

@@ -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)

View File

@@ -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;
}

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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

View File

@@ -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

View File

@@ -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.