From: Neil Booth Date: Thu, 15 Aug 2002 19:47:44 +0000 (+0000) Subject: re PR preprocessor/7358 (Changes to Sun's make Dependencies) X-Git-Tag: releases/gcc-3.2.1~382 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e9b2e28afb2c09ac95f679f137345ca5cd1c39fa;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fa392bc602af..d1b684c64399 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,23 @@ +2002-08-15 Neil Booth + + 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. diff --git a/gcc/cppfiles.c b/gcc/cppfiles.c index 4c595a857055..cad35c2c5b33 100644 --- a/gcc/cppfiles.c +++ b/gcc/cppfiles.c @@ -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) diff --git a/gcc/cppinit.c b/gcc/cppinit.c index 7e04c3acc55b..4b4e7899dc17 100644 --- a/gcc/cppinit.c +++ b/gcc/cppinit.c @@ -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; } diff --git a/gcc/cpplib.c b/gcc/cpplib.c index 69e90443b6d6..096a7113960f 100644 --- a/gcc/cpplib.c +++ b/gcc/cpplib.c @@ -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); } diff --git a/gcc/cpplib.h b/gcc/cpplib.h index edd4b5a45729..c21ada05cfd4 100644 --- a/gcc/cpplib.h +++ b/gcc/cpplib.h @@ -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; diff --git a/gcc/cppmacro.c b/gcc/cppmacro.c index 5a979d28b365..c85ac21cce14 100644 --- a/gcc/cppmacro.c +++ b/gcc/cppmacro.c @@ -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; diff --git a/gcc/doc/cpp.texi b/gcc/doc/cpp.texi index 808f3c47ef60..8e829d8c9a61 100644 --- a/gcc/doc/cpp.texi +++ b/gcc/doc/cpp.texi @@ -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 diff --git a/gcc/doc/cppenv.texi b/gcc/doc/cppenv.texi index 31407bdfd8b6..d60f7eef84cd 100644 --- a/gcc/doc/cppenv.texi +++ b/gcc/doc/cppenv.texi @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f6502b36bc53..b15075dbac50 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2002-08-15 Neil Booth + + * 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.