cppinit.c (struct lang_flags): Rename trigraphs std.
authorNeil Booth <neil@daikokuya.co.uk>
Tue, 6 Aug 2002 20:35:46 +0000 (20:35 +0000)
committerNeil Booth <neil@gcc.gnu.org>
Tue, 6 Aug 2002 20:35:46 +0000 (20:35 +0000)
* cppinit.c (struct lang_flags): Rename trigraphs std.
(set_lang): Update.
* cpplib.h (struct cpp_options): New member std.
* cppmacro.c (_cpp_builtin_macro_text): Use std.
(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.
testsuite:
* gcc.dg/cpp/vararg3.c, gcc.dg/cpp/vararg4.c: New tests.

From-SVN: r56077

gcc/ChangeLog
gcc/cppinit.c
gcc/cpplib.h
gcc/cppmacro.c
gcc/doc/cpp.texi
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/cpp/vararg3.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/cpp/vararg4.c [new file with mode: 0644]

index 185da67d8f92d07c10b36080778bef264258bf8b..e0356589b87f939464529ec28edd0e182a534114 100644 (file)
@@ -1,3 +1,14 @@
+2002-08-06  Neil Booth  <neil@daikokuya.co.uk>
+
+       * cppinit.c (struct lang_flags): Rename trigraphs std.
+       (set_lang): Update.
+       * cpplib.h (struct cpp_options): New member std.
+       * cppmacro.c (_cpp_builtin_macro_text): Use std.
+       (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.
+
 2002-08-06  Jakub Jelinek  <jakub@redhat.com>
 
        * config/i386/mmintrin.h (__m64): Make the type 64-bit aligned.
index 03f04c1a5d680279f1b86330667fc26937c7374f..a7ffeb03d9ab8442826897cadf7e9b17aec34c7b 100644 (file)
@@ -384,7 +384,7 @@ struct lang_flags
   char c99;
   char cplusplus;
   char extended_numbers;
-  char trigraphs;
+  char std;
   char dollars_in_ident;
   char cplusplus_comments;
   char digraphs;
@@ -392,7 +392,7 @@ struct lang_flags
 
 /* ??? Enable $ in identifiers in assembly? */
 static const struct lang_flags lang_defaults[] =
-{ /*              c99 c++ xnum trig dollar c++comm digr  */
+{ /*              c99 c++ xnum std dollar c++comm digr  */
   /* GNUC89 */  { 0,  0,  1,   0,   1,     1,      1     },
   /* GNUC99 */  { 1,  0,  1,   0,   1,     1,      1     },
   /* STDC89 */  { 0,  0,  0,   1,   0,     0,      0     },
@@ -416,7 +416,8 @@ set_lang (pfile, lang)
   CPP_OPTION (pfile, c99)               = l->c99;
   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;
index 8902f536902980f95ed74888b11cb0345c6e5c0b..7282df7f07d639460c2be5c0410f362c096f4a74 100644 (file)
@@ -367,6 +367,9 @@ struct cpp_options
   /* Nonzero for the 1999 C Standard, including corrigenda and amendments.  */
   unsigned char c99;
 
+  /* Nonzero if we are conforming to a specific C or C++ standard.  */
+  unsigned char std;
+
   /* Nonzero means give all the error messages the ANSI standard requires.  */
   unsigned char pedantic;
 
index f0986b353cba4303dc7a9edb3a156ecd9e59774d..76030903089766f2714c948872798170070db989 100644 (file)
@@ -191,8 +191,7 @@ _cpp_builtin_macro_text (pfile, node)
        enum c_lang lang = CPP_OPTION (pfile, lang);
        if (CPP_IN_SYSTEM_HEADER (pfile)
            && CPP_OPTION (pfile, stdc_0_in_system_headers)
-           && !(lang == CLK_STDC89 || lang == CLK_STDC94
-                || lang == CLK_STDC99))  /* || lang == CLK_CXX98 ? */
+           && !CPP_OPTION (pfile,std))
          number = 0;
        else
          number = 1;
@@ -672,7 +671,20 @@ collect_args (pfile, node)
       if (argc == 1 && macro->paramc == 0 && args[0].count == 0)
        argc = 0;
       if (_cpp_arguments_ok (pfile, macro, node, argc))
-       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;
+       }
     }
 
   /* An error occurred.  */
@@ -861,15 +873,13 @@ replace_args (pfile, node, macro, 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 73785c13794a2b3bb90cb1d0eeb022ed3cd54d72..e8107f2acc48ba4ee673de8e8693191c61ec1aa4 100644 (file)
@@ -1620,7 +1620,7 @@ The @code{eprintf} macro above could be written
 @end example
 
 @noindent
-using this extension.  You cannot use @code{__VA_ARGS__} and this
+using this extension.  You cannot use @code{@w{__VA_ARGS__}} and this
 extension in the same macro.
 
 You can have named arguments as well as variable arguments in a variadic
@@ -1670,6 +1670,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 016152af1d1387b83977a36a541c45fb48c8b92d..55fd9a1aeb26a0ab819befa1974f927a0ba874de 100644 (file)
@@ -1,3 +1,7 @@
+2002-08-06  Neil Booth  <neil@daikokuya.co.uk>
+
+       * gcc.dg/cpp/vararg3.c, gcc.dg/cpp/vararg4.c: New tests.
+
 2002-08-06  Jakub Jelinek  <jakub@redhat.com>
 
        * g++.dg/abi/bitfield3.C: New test.
diff --git a/gcc/testsuite/gcc.dg/cpp/vararg3.c b/gcc/testsuite/gcc.dg/cpp/vararg3.c
new file mode 100644 (file)
index 0000000..b17afd8
--- /dev/null
@@ -0,0 +1,17 @@
+/* Copyright (C) 2002 Free Software Foundation, Inc.  */
+
+/* { dg-do preprocess } */
+/* { dg-options "-std=c99" } */
+
+/* Source: Neil Booth, 6 Aug 2002.
+
+   Tests that we DTRT with varargs commas for a single-parameter macro
+   when in standards-conforming mode.  */
+
+#define f(...) , ## __VA_ARGS__
+
+/* The comma from f's expansion should be retained (standards
+   conforming mode only).  Tests that it isn't in non-standards mode
+   include macro8.c and vararg1.c.  */
+#if 2 f() 3              /* { dg-bogus "missing binary operator" } */
+#endif
diff --git a/gcc/testsuite/gcc.dg/cpp/vararg4.c b/gcc/testsuite/gcc.dg/cpp/vararg4.c
new file mode 100644 (file)
index 0000000..460cebf
--- /dev/null
@@ -0,0 +1,14 @@
+/* Copyright (C) 2002 Free Software Foundation, Inc.  */
+
+/* { dg-do preprocess } */
+/* { dg-options -std=gnu99 } */
+
+/* Source: Neil Booth, 6 Aug 2002.
+
+   Tests that we DTRT with varargs commas.  */
+
+#define g(a, ...) a , ## __VA_ARGS__
+
+/* The comma from g's expansion should be retained.  */
+#if g (2, ) 3            /* { dg-bogus "missing binary operator" } */
+#endif