Commit 58551c23 by Neil Booth Committed by Neil Booth

cppinit.c (struct lang_flags): Rename trigraphs std.

	* 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
parent daeabcd0
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> 2002-08-06 Jakub Jelinek <jakub@redhat.com>
* config/i386/mmintrin.h (__m64): Make the type 64-bit aligned. * config/i386/mmintrin.h (__m64): Make the type 64-bit aligned.
......
...@@ -384,7 +384,7 @@ struct lang_flags ...@@ -384,7 +384,7 @@ struct lang_flags
char c99; char c99;
char cplusplus; char cplusplus;
char extended_numbers; char extended_numbers;
char trigraphs; char std;
char dollars_in_ident; char dollars_in_ident;
char cplusplus_comments; char cplusplus_comments;
char digraphs; char digraphs;
...@@ -392,7 +392,7 @@ struct lang_flags ...@@ -392,7 +392,7 @@ struct lang_flags
/* ??? Enable $ in identifiers in assembly? */ /* ??? Enable $ in identifiers in assembly? */
static const struct lang_flags lang_defaults[] = 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 }, /* GNUC89 */ { 0, 0, 1, 0, 1, 1, 1 },
/* GNUC99 */ { 1, 0, 1, 0, 1, 1, 1 }, /* GNUC99 */ { 1, 0, 1, 0, 1, 1, 1 },
/* STDC89 */ { 0, 0, 0, 1, 0, 0, 0 }, /* STDC89 */ { 0, 0, 0, 1, 0, 0, 0 },
...@@ -416,7 +416,8 @@ set_lang (pfile, lang) ...@@ -416,7 +416,8 @@ set_lang (pfile, lang)
CPP_OPTION (pfile, c99) = l->c99; CPP_OPTION (pfile, c99) = l->c99;
CPP_OPTION (pfile, cplusplus) = l->cplusplus; CPP_OPTION (pfile, cplusplus) = l->cplusplus;
CPP_OPTION (pfile, extended_numbers) = l->extended_numbers; 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, dollars_in_ident) = l->dollars_in_ident;
CPP_OPTION (pfile, cplusplus_comments) = l->cplusplus_comments; CPP_OPTION (pfile, cplusplus_comments) = l->cplusplus_comments;
CPP_OPTION (pfile, digraphs) = l->digraphs; CPP_OPTION (pfile, digraphs) = l->digraphs;
......
...@@ -367,6 +367,9 @@ struct cpp_options ...@@ -367,6 +367,9 @@ struct cpp_options
/* Nonzero for the 1999 C Standard, including corrigenda and amendments. */ /* Nonzero for the 1999 C Standard, including corrigenda and amendments. */
unsigned char c99; 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. */ /* Nonzero means give all the error messages the ANSI standard requires. */
unsigned char pedantic; unsigned char pedantic;
......
...@@ -191,8 +191,7 @@ _cpp_builtin_macro_text (pfile, node) ...@@ -191,8 +191,7 @@ _cpp_builtin_macro_text (pfile, node)
enum c_lang lang = CPP_OPTION (pfile, lang); enum c_lang lang = CPP_OPTION (pfile, lang);
if (CPP_IN_SYSTEM_HEADER (pfile) if (CPP_IN_SYSTEM_HEADER (pfile)
&& CPP_OPTION (pfile, stdc_0_in_system_headers) && CPP_OPTION (pfile, stdc_0_in_system_headers)
&& !(lang == CLK_STDC89 || lang == CLK_STDC94 && !CPP_OPTION (pfile,std))
|| lang == CLK_STDC99)) /* || lang == CLK_CXX98 ? */
number = 0; number = 0;
else else
number = 1; number = 1;
...@@ -672,8 +671,21 @@ collect_args (pfile, node) ...@@ -672,8 +671,21 @@ collect_args (pfile, node)
if (argc == 1 && macro->paramc == 0 && args[0].count == 0) if (argc == 1 && macro->paramc == 0 && args[0].count == 0)
argc = 0; argc = 0;
if (_cpp_arguments_ok (pfile, macro, node, argc)) if (_cpp_arguments_ok (pfile, macro, node, argc))
{
/* 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; return base_buff;
} }
}
/* An error occurred. */ /* An error occurred. */
_cpp_release_buff (pfile, base_buff); _cpp_release_buff (pfile, base_buff);
...@@ -861,15 +873,13 @@ replace_args (pfile, node, macro, args) ...@@ -861,15 +873,13 @@ replace_args (pfile, node, macro, args)
count = arg->count, from = arg->first; count = arg->count, from = arg->first;
if (dest != 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 if (dest[-1]->type == CPP_COMMA
&& macro->variadic && macro->variadic
&& src->val.arg_no == macro->paramc) && 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--; dest--;
else else
paste_flag = dest - 1; paste_flag = dest - 1;
......
...@@ -1620,7 +1620,7 @@ The @code{eprintf} macro above could be written ...@@ -1620,7 +1620,7 @@ The @code{eprintf} macro above could be written
@end example @end example
@noindent @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. extension in the same macro.
You can have named arguments as well as variable arguments in a variadic You can have named arguments as well as variable arguments in a variadic
...@@ -1670,6 +1670,15 @@ eprintf ("success!\n") ...@@ -1670,6 +1670,15 @@ eprintf ("success!\n")
@expansion{} fprintf(stderr, "success!\n"); @expansion{} fprintf(stderr, "success!\n");
@end example @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__}} 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 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 be used as a macro name, macro argument name, or within a different type
......
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> 2002-08-06 Jakub Jelinek <jakub@redhat.com>
* g++.dg/abi/bitfield3.C: New test. * g++.dg/abi/bitfield3.C: New test.
......
/* 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
/* 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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment