]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR preprocessor/7358 (Changes to Sun's make Dependencies)
authorNeil Booth <neil@daikokuya.co.uk>
Thu, 15 Aug 2002 19:47:44 +0000 (19:47 +0000)
committerNeil Booth <neil@gcc.gnu.org>
Thu, 15 Aug 2002 19:47:44 +0000 (19:47 +0000)
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

gcc/ChangeLog
gcc/cppfiles.c
gcc/cppinit.c
gcc/cpplib.c
gcc/cpplib.h
gcc/cppmacro.c
gcc/doc/cpp.texi
gcc/doc/cppenv.texi
gcc/testsuite/ChangeLog

index fa392bc602af99394717d9cea9dd10bef07690a5..d1b684c643994ced9e9ce1ab9ee5dd9c7eaf4a27 100644 (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.
index 4c595a857055d48e5d41ece898662774282f9c2c..cad35c2c5b332d01e7d56551386464543bc6b4f1 100644 (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)
index 7e04c3acc55bbe0081101bbd5b758508195e5de4..4b4e7899dc17c27fb958fde999123743e8bcd1a3 100644 (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;
        }
index 69e90443b6d6e32dc35ec647b3d070da2016b74e..096a7113960fd0a847f8787642de896de2fdd052 100644 (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);
 }
 
index edd4b5a45729fad19ce8a204dc203205897b6ac8..c21ada05cfd4e6c7ed8cca9e1233cd602d68f1d8 100644 (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;
 
index 5a979d28b36550dcecfdf28f9ac3a8d2bd80339b..c85ac21cce14a95908882d20951376029075e0df 100644 (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;
index 808f3c47ef601e6026dac16827a528d6ca5b48c5..8e829d8c9a6185f2a5bcb13ecec3928163f7f7d4 100644 (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
index 31407bdfd8b6f8146f314386fe2019197b78eab3..d60f7eef84cdb21d9e0a57069cc2d170daa94f55 100644 (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
index f6502b36bc532400e9afa9588c82f92ab09a9019..b15075dbac50e3de23754115adcc1f5028b25ddb 100644 (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.