[RFA] Fix __CHAR_UNSIGNED__ issues
Neil Booth
neil@daikokuya.demon.co.uk
Fri Feb 1 20:44:00 GMT 2002
This patch fixed PR 1609, where -funsigned-char -fsigned-char would
define the macro __CHAR_UNSIGNED__ (a specs nastiness issue), and
also fixes a bug pointed out by Zem where cpplib tests for signedness
of charconsts based upon whether this macro is defined, but because
it doesn't define any macros with -fpreprocessed, it always treats
chars as signed if -fpreprocessed.
The fix to the first issue was to not let specs decide whether to define
__CHAR_UNSIGNED__, but instead to leave this decision to cpplib. This
means that cpplib has to recognise the -fsigned-char and -funsigned-char
flags, so it keeps a char-signedness flag internally, and uses this
rather than a macro to decide whether chars are signed or not. I've
fixed tradcpp too.
Since the driver does not decide about __CHAR_UNSIGNED__ any more, that
makes SIGNED_CHAR_SPEC useless. The new preprocessor code uses the target
macro DEFAULT_SIGNED_CHAR to determine whether chars are signed or not
by default, which is a nice cleanup and removal of redundancy. Only 1
target overrode SIGNED_CHAR_SPEC non-redundantly, and that was i390.
It has the property that options beginning with "mic" imply signed chars
by default. Judicious moving of this logic to CPP_SPEC and CC1_SPEC
solves this issue more cleanly; and command-line overrides still work
since the -f options are processed afterwards. I've poisoned the macro
and removed the documentation.
I cannot see any evidence that either bug is a regression from 2.95,
so I don't think a back-port to 3.0 is necessary.
The patch includes 3 new testcases that fail with 3.0 and current
mainline. Bootstrapped x86 Linux without regressions. OK to commit?
Neil.
* cpphash.h (struct spec_nodes): Remove n__CHAR_UNSIGNED__.
* cpphash.c (_cpp_init_hashtable): Similarly.
* cppinit.c (cpp_create_reader): Default the signed_char flag.
(init_builtins): Define __CHAR_UNSIGNED__ appropriately.
(COMMAND_LINE_OPTIONS): Recognise -f{un,}signed-char.
(cpp_handle_option): Handle the new options.
* cpplex.c (cpp_interpret_charconst): Use new flag.
* cpplib.h (struct cpp_options): New member signed_char.
* gcc.c (cpp_unique_options): Remove %c spec and documentation.
(cpp_options): Handle -fsigned-char and -funsigned-char.
(static_specs): Remove signed_char_spec.
(do_spec1): Don't handle %c.
* system.h: Poison SIGNED_CHAR_SPEC.
* tradcif.y (yylex): Use flag_signed_char.
* tradcpp.h (flag_signed_char): New.
* tradcpp.c (flag_signed_char): New.
(main): Handle new command-line options.
(initialize_builtins): Define __CHAR_UNSIGNED__ if appropriate.
config:
* alpha/alpha.h (SIGNED_CHAR_SPEC): Remove.
* avr/avr.h: Remove old comments.
* i960/i960.h (CPP_SPEC): Pass -fsigned-char if -mic*.
(CC1_SPEC): Pass -fsigned-char if -mic*.
(SIGNED_CHAR_SPEC): Remove.
doc:
* tm.texi (SIGNED_CHAR_SPEC): Remove documentation.
testsuite:
* gcc.dg/cpp/uchar-1.c, uchar-2.c, uchar-3.c: New tests.
============================================================
Index: gcc/cpphash.c
--- gcc/cpphash.c 2002/01/03 21:43:02 1.117
+++ gcc/cpphash.c 2002/02/02 04:10:41
@@ -73,7 +73,6 @@ _cpp_init_hashtable (pfile, table)
s->n_true = cpp_lookup (pfile, DSC("true"));
s->n_false = cpp_lookup (pfile, DSC("false"));
s->n__STRICT_ANSI__ = cpp_lookup (pfile, DSC("__STRICT_ANSI__"));
- s->n__CHAR_UNSIGNED__ = cpp_lookup (pfile, DSC("__CHAR_UNSIGNED__"));
s->n__VA_ARGS__ = cpp_lookup (pfile, DSC("__VA_ARGS__"));
s->n__VA_ARGS__->flags |= NODE_DIAGNOSTIC;
}
============================================================
Index: gcc/cpphash.h
--- gcc/cpphash.h 2002/01/03 21:43:06 1.139
+++ gcc/cpphash.h 2002/02/02 04:10:42
@@ -164,7 +164,6 @@ struct spec_nodes
cpp_hashnode *n_true; /* C++ keyword true */
cpp_hashnode *n_false; /* C++ keyword false */
cpp_hashnode *n__STRICT_ANSI__; /* STDC_0_IN_SYSTEM_HEADERS */
- cpp_hashnode *n__CHAR_UNSIGNED__; /* plain char is unsigned */
cpp_hashnode *n__VA_ARGS__; /* C99 vararg macros */
};
============================================================
Index: gcc/cppinit.c
--- gcc/cppinit.c 2002/01/29 12:09:21 1.198
+++ gcc/cppinit.c 2002/02/02 04:11:13
@@ -490,6 +490,11 @@ cpp_create_reader (lang)
CPP_OPTION (pfile, show_column) = 1;
CPP_OPTION (pfile, tabstop) = 8;
CPP_OPTION (pfile, operator_names) = 1;
+#if DEFAULT_SIGNED_CHAR
+ CPP_OPTION (pfile, signed_char) = 1;
+#else
+ CPP_OPTION (pfile, signed_char) = 0;
+#endif
CPP_OPTION (pfile, pending) =
(struct cpp_pending *) xcalloc (1, sizeof (struct cpp_pending));
@@ -761,6 +766,9 @@ init_builtins (pfile)
else if (CPP_OPTION (pfile, c99))
_cpp_define_builtin (pfile, "__STDC_VERSION__ 199901L");
+ if (CPP_OPTION (pfile, signed_char) == 0)
+ _cpp_define_builtin (pfile, "__CHAR_UNSIGNED__ 1");
+
if (CPP_OPTION (pfile, lang) == CLK_STDC89
|| CPP_OPTION (pfile, lang) == CLK_STDC94
|| CPP_OPTION (pfile, lang) == CLK_STDC99)
@@ -1186,7 +1194,9 @@ new_pending_directive (pend, text, handl
DEF_OPT("fno-show-column", 0, OPT_fno_show_column) \
DEF_OPT("fpreprocessed", 0, OPT_fpreprocessed) \
DEF_OPT("fshow-column", 0, OPT_fshow_column) \
+ DEF_OPT("fsigned-char", 0, OPT_fsigned_char) \
DEF_OPT("ftabstop=", no_num, OPT_ftabstop) \
+ DEF_OPT("funsigned-char", 0, OPT_funsigned_char) \
DEF_OPT("h", 0, OPT_h) \
DEF_OPT("idirafter", no_dir, OPT_idirafter) \
DEF_OPT("imacros", no_fil, OPT_imacros) \
@@ -1394,6 +1404,12 @@ cpp_handle_option (pfile, argc, argv, ig
break;
case OPT_fno_show_column:
CPP_OPTION (pfile, show_column) = 0;
+ break;
+ case OPT_fsigned_char:
+ CPP_OPTION (pfile, signed_char) = 1;
+ break;
+ case OPT_funsigned_char:
+ CPP_OPTION (pfile, signed_char) = 0;
break;
case OPT_ftabstop:
/* Silently ignore empty string, non-longs and silly values. */
============================================================
Index: gcc/cpplex.c
--- gcc/cpplex.c 2002/01/03 21:43:03 1.186
+++ gcc/cpplex.c 2002/02/02 04:11:18
@@ -1903,14 +1903,13 @@ cpp_interpret_charconst (pfile, token, w
else if (chars_seen > 1 && !traditional && warn_multi)
cpp_warning (pfile, "multi-character character constant");
- /* If char type is signed, sign-extend the constant. The
- __CHAR_UNSIGNED__ macro is set by the driver if appropriate. */
+ /* If char type is signed, sign-extend the constant. */
if (token->type == CPP_CHAR && chars_seen)
{
unsigned int nbits = chars_seen * width;
mask = (unsigned HOST_WIDE_INT) ~0 >> (HOST_BITS_PER_WIDE_INT - nbits);
- if (pfile->spec_nodes.n__CHAR_UNSIGNED__->type == NT_MACRO
+ if (CPP_OPTION (pfile, signed_char) == 0
|| ((result >> (nbits - 1)) & 1) == 0)
result &= mask;
else
============================================================
Index: gcc/cpplib.h
--- gcc/cpplib.h 2002/01/29 12:09:23 1.200
+++ gcc/cpplib.h 2002/02/02 04:11:20
@@ -240,6 +240,9 @@ struct cpp_options
/* Non-0 means -v, so print the full set of include dirs. */
unsigned char verbose;
+ /* Nonzero means chars are signed. */
+ unsigned char signed_char;
+
/* Nonzero means use extra default include directories for C++. */
unsigned char cplusplus;
============================================================
Index: gcc/gcc.c
--- gcc/gcc.c 2002/01/29 12:09:21 1.288
+++ gcc/gcc.c 2002/02/02 04:11:36
@@ -445,7 +445,6 @@ or with constant text in a single argume
if multilib_dir is not set or is ".", output "".
%S process STARTFILE_SPEC as a spec. A capital S is actually used here.
%E process ENDFILE_SPEC as a spec. A capital E is actually used here.
- %c process SIGNED_CHAR_SPEC as a spec.
%C process CPP_SPEC as a spec.
%1 process CC1_SPEC as a spec.
%2 process CC1PLUS_SPEC as a spec.
@@ -511,7 +510,7 @@ CC also knows implicitly that arguments
treated as compiler output files, and passed to the linker in their
proper position among the other output files. */
-/* Define the macros used for specs %a, %l, %L, %S, %c, %C, %1. */
+/* Define the macros used for specs %a, %l, %L, %S, %C, %1. */
/* config.h can define ASM_SPEC to provide extra args to the assembler
or extra switch-translations. */
@@ -582,17 +581,6 @@ proper position among the other output f
#define ENDFILE_SPEC ""
#endif
-/* This spec is used for telling cpp whether char is signed or not. */
-#ifndef SIGNED_CHAR_SPEC
-/* Use #if rather than ?:
- because MIPS C compiler rejects like ?: in initializers. */
-#if DEFAULT_SIGNED_CHAR
-#define SIGNED_CHAR_SPEC "%{funsigned-char:-D__CHAR_UNSIGNED__}"
-#else
-#define SIGNED_CHAR_SPEC "%{!fsigned-char:-D__CHAR_UNSIGNED__}"
-#endif
-#endif
-
#ifndef LINKER_NAME
#define LINKER_NAME "collect2"
#endif
@@ -651,7 +639,6 @@ static const char *cpp_spec = CPP_SPEC;
static const char *cpp_predefines = CPP_PREDEFINES;
static const char *cc1_spec = CC1_SPEC;
static const char *cc1plus_spec = CC1PLUS_SPEC;
-static const char *signed_char_spec = SIGNED_CHAR_SPEC;
static const char *asm_spec = ASM_SPEC;
static const char *asm_final_spec = ASM_FINAL_SPEC;
static const char *link_spec = LINK_SPEC;
@@ -681,7 +668,7 @@ static const char *cpp_unique_options =
%{M} %{MM} %W{MF*} %{MG} %{MP} %{MQ*} %{MT*} %{M|MD|MM|MMD:%{o*:-MQ %*}}\
%{!no-gcc:-D__GNUC__=%v1 -D__GNUC_MINOR__=%v2 -D__GNUC_PATCHLEVEL__=%v3}\
%{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs}\
- %c %{Os:-D__OPTIMIZE_SIZE__} %{O*:%{!O0:-D__OPTIMIZE__}}\
+ %{Os:-D__OPTIMIZE_SIZE__} %{O*:%{!O0:-D__OPTIMIZE__}}\
%{fno-inline|O0|!O*:-D__NO_INLINE__} %{ffast-math:-D__FAST_MATH__}\
%{fshort-wchar:-U__WCHAR_TYPE__ -D__WCHAR_TYPE__=short\\ unsigned\\ int}\
%{ffreestanding:-D__STDC_HOSTED__=0} %{fno-hosted:-D__STDC_HOSTED__=0}\
@@ -694,6 +681,7 @@ static const char *cpp_unique_options =
static const char *cpp_options =
"%(cpp_unique_options) %{std*} %{d*} %{W*} %{w} %{pedantic*}\
%{fshow-column} %{fno-show-column}\
+ %{fsigned-char&funsigned-char}\
%{fleading-underscore} %{fno-leading-underscore}\
%{fno-operator-names} %{ftabstop=*}";
@@ -1382,7 +1370,6 @@ static struct spec_list static_specs[] =
INIT_STATIC_SPEC ("libgcc", &libgcc_spec),
INIT_STATIC_SPEC ("startfile", &startfile_spec),
INIT_STATIC_SPEC ("switches_need_spaces", &switches_need_spaces),
- INIT_STATIC_SPEC ("signed_char", &signed_char_spec),
INIT_STATIC_SPEC ("predefines", &cpp_predefines),
INIT_STATIC_SPEC ("cross_compile", &cross_compile),
INIT_STATIC_SPEC ("version", &compiler_version),
@@ -1785,7 +1772,7 @@ load_specs (filename)
A suffix which starts with `*' is a definition for
one of the machine-specific sub-specs. The "suffix" should be
- *asm, *cc1, *cpp, *link, *startfile, *signed_char, etc.
+ *asm, *cc1, *cpp, *link, *startfile, etc.
The corresponding spec is stored in asm_spec, etc.,
rather than in the `compilers' vector.
@@ -4779,12 +4766,6 @@ do_spec_1 (spec, inswitch, soft_matched_
case 'A':
value = do_spec_1 (asm_final_spec, 0, NULL);
- if (value != 0)
- return value;
- break;
-
- case 'c':
- value = do_spec_1 (signed_char_spec, 0, NULL);
if (value != 0)
return value;
break;
============================================================
Index: gcc/system.h
--- gcc/system.h 2002/01/31 23:29:08 1.117
+++ gcc/system.h 2002/02/02 04:11:39
@@ -594,7 +594,7 @@ typedef char _Bool;
SET_DEFAULT_TYPE_ATTRIBUTES SET_DEFAULT_DECL_ATTRIBUTES \
MERGE_MACHINE_TYPE_ATTRIBUTES MERGE_MACHINE_DECL_ATTRIBUTES \
MD_INIT_BUILTINS MD_EXPAND_BUILTIN ASM_OUTPUT_CONSTRUCTOR \
- ASM_OUTPUT_DESTRUCTOR
+ ASM_OUTPUT_DESTRUCTOR SIGNED_CHAR_SPEC
/* And other obsolete target macros, or macros that used to be in target
headers and were not used, and may be obsolete or may never have
============================================================
Index: gcc/tradcif.y
--- gcc/tradcif.y 2001/12/02 00:04:23 1.15
+++ gcc/tradcif.y 2002/02/02 04:11:40
@@ -344,8 +344,7 @@ yylex ()
/* Sign-extend the constant if chars are signed on target machine. */
{
- if (lookup ((const unsigned char *)"__CHAR_UNSIGNED__",
- sizeof ("__CHAR_UNSIGNED__")-1, -1)
+ if (flag_signed_char == 0
|| ((c >> (CHAR_TYPE_SIZE - 1)) & 1) == 0)
yylval.integer.value = c & ((1 << CHAR_TYPE_SIZE) - 1);
else
============================================================
Index: gcc/tradcpp.c
--- gcc/tradcpp.c 2001/12/23 16:07:07 1.46
+++ gcc/tradcpp.c 2002/02/02 04:11:52
@@ -86,6 +86,13 @@ int inhibit_warnings = 0;
/* Non-0 means don't output the preprocessed program. */
int inhibit_output = 0;
+/* Nonzero means chars are signed. */
+#if DEFAULT_SIGNED_CHAR
+int flag_signed_char = 1;
+#else
+int flag_signed_char = 0;
+#endif
+
/* Nonzero means warn if slash-star appears in a comment. */
int warn_comments;
@@ -627,6 +634,10 @@ main (argc, argv)
user_label_prefix = "_";
else if (!strcmp (argv[i], "-fno-leading-underscore"))
user_label_prefix = "";
+ else if (!strcmp (argv[i], "-fsigned-char"))
+ flag_signed_char = 1;
+ else if (!strcmp (argv[i], "-funsigned-char"))
+ flag_signed_char = 0;
break;
case 'M':
@@ -5105,6 +5116,9 @@ initialize_builtins ()
#endif
install_value ("__REGISTER_PREFIX__", REGISTER_PREFIX);
install_value ("__USER_LABEL_PREFIX__", user_label_prefix);
+
+ if (flag_signed_char == 0)
+ install_value ("__CHAR_UNSIGNED__", "1");
}
#undef DSC
#undef install_spec
============================================================
Index: gcc/tradcpp.h
--- gcc/tradcpp.h 2001/05/26 01:31:35 1.5
+++ gcc/tradcpp.h 2002/02/02 04:11:53
@@ -35,6 +35,7 @@ extern void fancy_abort PARAMS ((int, co
extern struct hashnode *lookup PARAMS ((const unsigned char *, int, int));
extern int parse_c_expression PARAMS ((const char *)); /* in tradcif.y */
extern int test_assertion PARAMS ((unsigned char **));
+extern int flag_signed_char;
#define is_idchar(x) ISIDNUM(x)
#define is_idstart(x) ISIDST(x)
============================================================
Index: gcc/config/alpha/alpha.h
--- gcc/config/alpha/alpha.h 2002/01/22 23:23:46 1.152
+++ gcc/config/alpha/alpha.h 2002/02/02 04:12:00
@@ -43,12 +43,6 @@ Boston, MA 02111-1307, USA. */
#define CPP_SUBTARGET_SPEC ""
#endif
-/* Set the spec to use for signed char. The default tests the above macro
- but DEC's compiler can't handle the conditional in a "constant"
- operand. */
-
-#define SIGNED_CHAR_SPEC "%{funsigned-char:-D__CHAR_UNSIGNED__}"
-
#define WORD_SWITCH_TAKES_ARG(STR) \
(!strcmp (STR, "rpath") || DEFAULT_WORD_SWITCH_TAKES_ARG(STR))
============================================================
Index: gcc/config/avr/avr.h
--- gcc/config/avr/avr.h 2002/01/21 06:22:02 1.41
+++ gcc/config/avr/avr.h 2002/02/02 04:12:12
@@ -2688,16 +2688,7 @@ extern int avr_case_values_threshold;
This should be defined if `PTRDIFF_TYPE' depends on target
dependent flags which are not accessible to the preprocessor.
- Otherwise, it should not be defined.
-
- `SIGNED_CHAR_SPEC'
- A C string constant that tells the GNU CC driver program options to
- pass to CPP. By default, this macro is defined to pass the option
- `-D__CHAR_UNSIGNED__' to CPP if `char' will be treated as
- `unsigned char' by `cc1'.
-
- Do not define this macro unless you need to override the default
- definition. */
+ Otherwise, it should not be defined. */
#define CC1_SPEC "%{profile:-p}"
/* A C string constant that tells the GNU CC driver program options to
============================================================
Index: gcc/config/i960/i960.h
--- gcc/config/i960/i960.h 2002/01/08 22:51:32 1.50
+++ gcc/config/i960/i960.h 2002/02/02 04:12:18
@@ -30,8 +30,9 @@ Boston, MA 02111-1307, USA. */
/* Names to predefine in the preprocessor for this target machine. */
#define CPP_PREDEFINES "-Di960 -Di80960 -DI960 -DI80960 -Acpu=i960 -Amachine=i960"
-/* Name to predefine in the preprocessor for processor variations. */
-#define CPP_SPEC "%{mic*:-D__i960\
+/* Name to predefine in the preprocessor for processor variations.
+ -mic* options make characters signed by default. */
+#define CPP_SPEC "%{mic*:-D__i960 -fsigned-char\
%{mka:-D__i960KA}%{mkb:-D__i960KB}\
%{mja:-D__i960JA}%{mjd:-D__i960JD}%{mjf:-D__i960JF}\
%{mrp:-D__i960RP}\
@@ -52,20 +53,13 @@ Boston, MA 02111-1307, USA. */
%{!mcc:%{!mcf:-D__i960_KB -D__i960KB__ %{mic*:-D__i960KB}}}}}}}}}\
%{mlong-double-64:-D__LONG_DOUBLE_64__}"
-/* -mic* options make characters signed by default. */
-/* Use #if rather than ?: because MIPS C compiler rejects ?: in
- initializers. */
-#if DEFAULT_SIGNED_CHAR
-#define SIGNED_CHAR_SPEC "%{funsigned-char:-D__CHAR_UNSIGNED__}"
-#else
-#define SIGNED_CHAR_SPEC "%{!fsigned-char:%{!mic*:-D__CHAR_UNSIGNED__}}"
-#endif
-
/* Specs for the compiler, to handle processor variations.
If the user gives an explicit -gstabs or -gcoff option, then do not
- try to add an implicit one, as this will fail. */
+ try to add an implicit one, as this will fail.
+ -mic* options make characters signed by default. */
#define CC1_SPEC \
- "%{!mka:%{!mkb:%{!msa:%{!msb:%{!mmc:%{!mca:%{!mcc:%{!mcf:%{!mja:%{!mjd:%{!mjf:%{!mrp:-mka}}}}}}}}}}}}\
+ "%{mic*:-fsigned-char}\
+%{!mka:%{!mkb:%{!msa:%{!msb:%{!mmc:%{!mca:%{!mcc:%{!mcf:%{!mja:%{!mjd:%{!mjf:%{!mrp:-mka}}}}}}}}}}}}\
%{!gs*:%{!gc*:%{mbout:%{g*:-gstabs}}\
%{mcoff:%{g*:-gcoff}}\
%{!mbout:%{!mcoff:%{g*:-gstabs}}}}}"
============================================================
Index: gcc/doc/tm.texi
--- gcc/doc/tm.texi 2002/01/31 23:29:09 1.96
+++ gcc/doc/tm.texi 2002/02/02 04:12:49
@@ -216,16 +216,6 @@ This should be defined if @code{WINT_TYP
which are not accessible to the preprocessor. Otherwise, it should not
be defined.
-@findex SIGNED_CHAR_SPEC
-@item SIGNED_CHAR_SPEC
-A C string constant that tells the GCC driver program options to
-pass to CPP@. By default, this macro is defined to pass the option
-@option{-D__CHAR_UNSIGNED__} to CPP if @code{char} will be treated as
-@code{unsigned char} by @code{cc1}.
-
-Do not define this macro unless you need to override the default
-definition.
-
@findex CC1_SPEC
@item CC1_SPEC
A C string constant that tells the GCC driver program options to
============================================================
Index: gcc/testsuite/gcc.dg/cpp/uchar-1.c
--- /dev/null Tue May 5 13:32:27 1998
+++ gcc/testsuite/gcc.dg/cpp/uchar-1.c Fri Feb 1 20:12:49 2002
@@ -0,0 +1,8 @@
+/* Copyright (C) 2002 Free Software Foundation, Inc. */
+
+/* { dg-do preprocess } */
+/* { dg-options "-funsigned-char -fsigned-char" } */
+
+#if defined (__CHAR_UNSIGNED__)
+# error __CHAR_UNSIGNED__ defined
+#endif
============================================================
Index: gcc/testsuite/gcc.dg/cpp/uchar-2.c
--- /dev/null Tue May 5 13:32:27 1998
+++ gcc/testsuite/gcc.dg/cpp/uchar-2.c Fri Feb 1 20:12:49 2002
@@ -0,0 +1,8 @@
+/* Copyright (C) 2002 Free Software Foundation, Inc. */
+
+/* { dg-do preprocess } */
+/* { dg-options "-funsigned-char -fsigned-char -traditional" } */
+
+#if defined (__CHAR_UNSIGNED__)
+# error __CHAR_UNSIGNED__ defined
+#endif
============================================================
Index: gcc/testsuite/gcc.dg/cpp/uchar-3.c
--- /dev/null Tue May 5 13:32:27 1998
+++ gcc/testsuite/gcc.dg/cpp/uchar-3.c Fri Feb 1 20:12:49 2002
@@ -0,0 +1,17 @@
+/* Copyright (C) 2002 Free Software Foundation, Inc. */
+
+/* { dg-do compile } */
+/* { dg-options "-funsigned-char -fpreprocessed" } */
+
+/* Source: Ziemowit Laski. -fpreprocessed doesn't define macros, but
+ CPP would interpret charconsts based upon whether __CHAR_UNSIGNED__
+ was defined. */
+
+int foo()
+{
+ char f = 0x83;
+ if (f == '\x83') /* { dg-bogus "always false" } */
+ f = 0;
+
+ return 0;
+}
More information about the Gcc-patches
mailing list