summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2010-04-25 22:54:22 +0100
committerJoseph Myers <jsm28@gcc.gnu.org>2010-04-25 22:54:22 +0100
commit2778d7667c9ef15520b1679417467934e24ffa0f (patch)
treefeff2a16895d1da5319551fc1b48b05b2a464692
parent045d4002b76c990d99a66dc6f6c1c014808a2e79 (diff)
downloadgcc-2778d7667c9ef15520b1679417467934e24ffa0f.tar.gz
c-common.c (flag_isoc1x): New.
gcc: * c-common.c (flag_isoc1x): New. (flag_isoc99): Update comment. * c-common.h (flag_isoc1x): New. (flag_isoc99): Update comment. * c-cppbuiltin.c (builtin_define_float_constants): Also define __<type>_DECIMAL_DIG__. * c-opts.c (set_std_c1x): New. (c_common_handle_option): Handle -std=c1x and -std=gnu1x. (set_std_c89, set_std_c99): Also set flag_isoc1x to 0. * c.opt (-std=c1x, -std=gnu1x): New options. * doc/cpp.texi: Mention -std=c1x. * doc/cppopts.texi (-std=c1x, -std=gnu1x): Document. * doc/extend.texi: Mention -std=c1x and -std=gnu1x. * doc/invoke.texi (-std=c1x, -std=gnu1x): Document. * doc/standards.texi: Mention C1X. * ginclude/float.h (FLT_DECIMAL_DIG, DBL_DECIMAL_DIG, LDBL_DECIMAL_DIG, FLT_HAS_SUBNORM, DBL_HAS_SUBNORM, LDBL_HAS_SUBNORM, FLT_TRUE_MIN, DBL_TRUE_MIN, LDBL_TRUE_MIN): Define for C1X. gcc/testsuite: * gcc.dg/c90-float-1.c: Also test that C1X macros are not defined. * gcc.dg/c99-float-1.c: Also test that C1X macros are not defined. * gcc.dg/c1x-float-1.c: New test. libcpp: * include/cpplib.h (enum c_lang): Add CLK_GNUC1X and CLK_STDC1X. * init.c (lang_defaults): Add entries for new language variants. (cpp_init_builtins): Define __STDC_VERSION__ to 201000L for C1X variants. From-SVN: r158711
-rw-r--r--gcc/ChangeLog22
-rw-r--r--gcc/c-common.c6
-rw-r--r--gcc/c-common.h6
-rw-r--r--gcc/c-cppbuiltin.c13
-rw-r--r--gcc/c-opts.c26
-rw-r--r--gcc/c.opt8
-rw-r--r--gcc/doc/cpp.texi3
-rw-r--r--gcc/doc/cppopts.texi7
-rw-r--r--gcc/doc/extend.texi16
-rw-r--r--gcc/doc/invoke.texi11
-rw-r--r--gcc/doc/standards.texi11
-rw-r--r--gcc/ginclude/float.h39
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/c1x-float-1.c169
-rw-r--r--gcc/testsuite/gcc.dg/c90-float-1.c40
-rw-r--r--gcc/testsuite/gcc.dg/c99-float-1.c38
-rw-r--r--libcpp/ChangeLog7
-rw-r--r--libcpp/include/cpplib.h3
-rw-r--r--libcpp/init.c5
19 files changed, 421 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8ee8c208976..a6fd13b1782 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,25 @@
+2010-04-25 Joseph Myers <joseph@codesourcery.com>
+
+ * c-common.c (flag_isoc1x): New.
+ (flag_isoc99): Update comment.
+ * c-common.h (flag_isoc1x): New.
+ (flag_isoc99): Update comment.
+ * c-cppbuiltin.c (builtin_define_float_constants): Also define
+ __<type>_DECIMAL_DIG__.
+ * c-opts.c (set_std_c1x): New.
+ (c_common_handle_option): Handle -std=c1x and -std=gnu1x.
+ (set_std_c89, set_std_c99): Also set flag_isoc1x to 0.
+ * c.opt (-std=c1x, -std=gnu1x): New options.
+ * doc/cpp.texi: Mention -std=c1x.
+ * doc/cppopts.texi (-std=c1x, -std=gnu1x): Document.
+ * doc/extend.texi: Mention -std=c1x and -std=gnu1x.
+ * doc/invoke.texi (-std=c1x, -std=gnu1x): Document.
+ * doc/standards.texi: Mention C1X.
+ * ginclude/float.h (FLT_DECIMAL_DIG, DBL_DECIMAL_DIG,
+ LDBL_DECIMAL_DIG, FLT_HAS_SUBNORM, DBL_HAS_SUBNORM,
+ LDBL_HAS_SUBNORM, FLT_TRUE_MIN, DBL_TRUE_MIN, LDBL_TRUE_MIN):
+ Define for C1X.
+
2010-04-25 Uros Bizjak <ubizjak@gmail.com>
* config/i386/gmon-sol2.c (_mcleanup): Change format string
diff --git a/gcc/c-common.c b/gcc/c-common.c
index ac113676d51..25ce2d704a6 100644
--- a/gcc/c-common.c
+++ b/gcc/c-common.c
@@ -280,10 +280,14 @@ int flag_cond_mismatch;
int flag_isoc94;
-/* Nonzero means use the ISO C99 dialect of C. */
+/* Nonzero means use the ISO C99 (or C1X) dialect of C. */
int flag_isoc99;
+/* Nonzero means use the ISO C1X dialect of C. */
+
+int flag_isoc1x;
+
/* Nonzero means that we have builtin functions, and main is an int. */
int flag_hosted = 1;
diff --git a/gcc/c-common.h b/gcc/c-common.h
index 6ed38490cb6..8dadc247f86 100644
--- a/gcc/c-common.h
+++ b/gcc/c-common.h
@@ -595,10 +595,14 @@ extern int flag_cond_mismatch;
extern int flag_isoc94;
-/* Nonzero means use the ISO C99 dialect of C. */
+/* Nonzero means use the ISO C99 (or C1X) dialect of C. */
extern int flag_isoc99;
+/* Nonzero means use the ISO C1X dialect of C. */
+
+extern int flag_isoc1x;
+
/* Nonzero means that we have builtin functions, and main is an int. */
extern int flag_hosted;
diff --git a/gcc/c-cppbuiltin.c b/gcc/c-cppbuiltin.c
index 1565aac23db..fa4d9a1ca01 100644
--- a/gcc/c-cppbuiltin.c
+++ b/gcc/c-cppbuiltin.c
@@ -105,6 +105,7 @@ builtin_define_float_constants (const char *name_prefix,
char name[64], buf[128];
int dig, min_10_exp, max_10_exp;
int decimal_dig;
+ int type_decimal_dig;
fmt = REAL_MODE_FORMAT (TYPE_MODE (type));
gcc_assert (fmt->b != 10);
@@ -198,8 +199,20 @@ builtin_define_float_constants (const char *name_prefix,
if (decimal_dig < d_decimal_dig)
decimal_dig++;
}
+ /* Similar, for this type rather than long double. */
+ {
+ double type_d_decimal_dig = 1 + fmt->p * log10_b;
+ type_decimal_dig = type_d_decimal_dig;
+ if (type_decimal_dig < type_d_decimal_dig)
+ type_decimal_dig++;
+ }
if (type == long_double_type_node)
builtin_define_with_int_value ("__DECIMAL_DIG__", decimal_dig);
+ else
+ {
+ sprintf (name, "__%s_DECIMAL_DIG__", name_prefix);
+ builtin_define_with_int_value (name, type_decimal_dig);
+ }
/* Since, for the supported formats, B is always a power of 2, we
construct the following numbers directly as a hexadecimal
diff --git a/gcc/c-opts.c b/gcc/c-opts.c
index a680f2d79bd..66101b7eded 100644
--- a/gcc/c-opts.c
+++ b/gcc/c-opts.c
@@ -112,6 +112,7 @@ static void set_std_cxx98 (int);
static void set_std_cxx0x (int);
static void set_std_c89 (int, int);
static void set_std_c99 (int);
+static void set_std_c1x (int);
static void check_deps_environment_vars (void);
static void handle_deferred_opts (void);
static void sanitize_cpp_opts (void);
@@ -1066,6 +1067,16 @@ c_common_handle_option (size_t scode, const char *arg, int value)
set_std_c99 (false /* ISO */);
break;
+ case OPT_std_c1x:
+ if (!preprocessing_asm_p)
+ set_std_c1x (true /* ISO */);
+ break;
+
+ case OPT_std_gnu1x:
+ if (!preprocessing_asm_p)
+ set_std_c1x (false /* ISO */);
+ break;
+
case OPT_trigraphs:
cpp_opts->trigraphs = 1;
break;
@@ -1704,6 +1715,7 @@ set_std_c89 (int c94, int iso)
flag_no_nonansi_builtin = iso;
flag_isoc94 = c94;
flag_isoc99 = 0;
+ flag_isoc1x = 0;
}
/* Set the C 99 standard (without GNU extensions if ISO). */
@@ -1714,6 +1726,20 @@ set_std_c99 (int iso)
flag_no_asm = iso;
flag_no_nonansi_builtin = iso;
flag_iso = iso;
+ flag_isoc1x = 0;
+ flag_isoc99 = 1;
+ flag_isoc94 = 1;
+}
+
+/* Set the C 1X standard draft (without GNU extensions if ISO). */
+static void
+set_std_c1x (int iso)
+{
+ cpp_set_lang (parse_in, iso ? CLK_STDC1X: CLK_GNUC1X);
+ flag_no_asm = iso;
+ flag_no_nonansi_builtin = iso;
+ flag_iso = iso;
+ flag_isoc1x = 1;
flag_isoc99 = 1;
flag_isoc94 = 1;
}
diff --git a/gcc/c.opt b/gcc/c.opt
index 973acf46c21..2e1933cd0d1 100644
--- a/gcc/c.opt
+++ b/gcc/c.opt
@@ -961,6 +961,10 @@ become a part of the upcoming ISO C++ standard, dubbed C++0x. Note that the
extensions enabled by this mode are experimental and may be removed in
future releases of GCC.
+std=c1x
+C ObjC
+Conform to the ISO 201X C standard draft (experimental and incomplete support)
+
std=c89
C ObjC
Conform to the ISO 1990 C standard
@@ -988,6 +992,10 @@ extensions that are likely to become a part of the upcoming ISO C++
standard, dubbed C++0x. Note that the extensions enabled by this mode
are experimental and may be removed in future releases of GCC.
+std=gnu1x
+C ObjC
+Conform to the ISO 201X C standard draft with GNU extensions (experimental and incomplete support)
+
std=gnu89
C ObjC
Conform to the ISO 1990 C standard with GNU extensions
diff --git a/gcc/doc/cpp.texi b/gcc/doc/cpp.texi
index 02e2be78c15..7a250bd72ec 100644
--- a/gcc/doc/cpp.texi
+++ b/gcc/doc/cpp.texi
@@ -215,7 +215,8 @@ Standard C@. In its default mode, the GNU C preprocessor does not do a
few things required by the standard. These are features which are
rarely, if ever, used, and may cause surprising changes to the meaning
of a program which does not expect them. To get strict ISO Standard C,
-you should use the @option{-std=c90} or @option{-std=c99} options, depending
+you should use the @option{-std=c90}, @option{-std=c99} or
+@option{-std=c1x} options, depending
on which version of the standard you want. To get all the mandatory
diagnostics, you must also use @option{-pedantic}. @xref{Invocation}.
diff --git a/gcc/doc/cppopts.texi b/gcc/doc/cppopts.texi
index e73f77d4f44..b5c77c7e990 100644
--- a/gcc/doc/cppopts.texi
+++ b/gcc/doc/cppopts.texi
@@ -392,6 +392,9 @@ The 1990 C standard, as amended in 1994.
The revised ISO C standard, published in December 1999. Before
publication, this was known as C9X@.
+@item c1x
+The next version of the ISO C standard, still under development.
+
@item gnu90
@itemx gnu89
The 1990 C standard plus GNU extensions. This is the default.
@@ -400,6 +403,10 @@ The 1990 C standard plus GNU extensions. This is the default.
@itemx gnu9x
The 1999 C standard plus GNU extensions.
+@item gnu1x
+The next version of the ISO C standard, still under development, plus
+GNU extensions.
+
@item c++98
The 1998 ISO C++ standard plus amendments.
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
index 0e499ccd136..e7880a33104 100644
--- a/gcc/doc/extend.texi
+++ b/gcc/doc/extend.texi
@@ -4936,8 +4936,10 @@ into their callers with the option @option{-finline-functions}.
GCC implements three different semantics of declaring a function
inline. One is available with @option{-std=gnu89} or
@option{-fgnu89-inline} or when @code{gnu_inline} attribute is present
-on all inline declarations, another when @option{-std=c99} or
-@option{-std=gnu99} (without @option{-fgnu89-inline}), and the third
+on all inline declarations, another when
+@option{-std=c99}, @option{-std=c1x},
+@option{-std=gnu99} or @option{-std=gnu1x}
+(without @option{-fgnu89-inline}), and the third
is used when compiling C++.
To declare a function inline, use the @code{inline} keyword in its
@@ -5868,10 +5870,12 @@ a general-purpose header file that should be usable by all programs,
including ISO C programs. The keywords @code{asm}, @code{typeof} and
@code{inline} are not available in programs compiled with
@option{-ansi} or @option{-std} (although @code{inline} can be used in a
-program compiled with @option{-std=c99}). The ISO C99 keyword
+program compiled with @option{-std=c99} or @option{-std=c1x}). The
+ISO C99 keyword
@code{restrict} is only available when @option{-std=gnu99} (which will
eventually be the default) or @option{-std=c99} (or the equivalent
-@option{-std=iso9899:1999}) is used.
+@option{-std=iso9899:1999}), or an option for a later standard
+version, is used.
The way to solve these problems is to put @samp{__} at the beginning and
end of each problematical keyword. For example, use @code{__asm__}
@@ -6857,8 +6861,8 @@ be emitted.
@opindex ansi
@opindex std
-Outside strict ISO C mode (@option{-ansi}, @option{-std=c90} or
-@option{-std=c99}), the functions
+Outside strict ISO C mode (@option{-ansi}, @option{-std=c90},
+@option{-std=c99} or @option{-std=c1x}), the functions
@code{_exit}, @code{alloca}, @code{bcmp}, @code{bzero},
@code{dcgettext}, @code{dgettext}, @code{dremf}, @code{dreml},
@code{drem}, @code{exp10f}, @code{exp10l}, @code{exp10}, @code{ffsll},
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 0e39234b3b4..9829c1f35b6 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -1500,6 +1500,12 @@ ISO C99. Note that this standard is not yet fully supported; see
@w{@uref{http://gcc.gnu.org/c99status.html}} for more information. The
names @samp{c9x} and @samp{iso9899:199x} are deprecated.
+@item c1x
+ISO C1X, the draft of the next revision of the ISO C standard.
+Support is limited and experimental and features enabled by this
+option may be changed or removed if changed in or removed from the
+standard draft.
+
@item gnu90
@itemx gnu89
GNU dialect of ISO C90 (including some C99 features). This
@@ -1510,6 +1516,11 @@ is the default for C code.
GNU dialect of ISO C99. When ISO C99 is fully implemented in GCC,
this will become the default. The name @samp{gnu9x} is deprecated.
+@item gnu1x
+GNU dialect of ISO C1X. Support is limited and experimental and
+features enabled by this option may be changed or removed if changed
+in or removed from the standard draft.
+
@item c++98
The 1998 ISO C++ standard plus amendments. Same as @option{-ansi} for
C++ code.
diff --git a/gcc/doc/standards.texi b/gcc/doc/standards.texi
index b9761bb30d6..f6d8acd6a72 100644
--- a/gcc/doc/standards.texi
+++ b/gcc/doc/standards.texi
@@ -33,6 +33,8 @@ with some exceptions, and possibly with some extensions.
@cindex C99
@cindex ISO C9X
@cindex C9X
+@cindex ISO C1X
+@cindex C1X
@cindex Technical Corrigenda
@cindex TC1
@cindex Technical Corrigendum 1
@@ -93,14 +95,19 @@ Errors in the 1999 ISO C standard were corrected in three Technical
Corrigenda published in 2001, 2004 and 2007. GCC does not support the
uncorrected version.
+A fourth version of the C standard, known as @dfn{C1X}, is under
+development; GCC has limited preliminary support for parts of this
+standard, enabled with @option{-std=c1x}.
+
By default, GCC provides some extensions to the C language that on
rare occasions conflict with the C standard. @xref{C
Extensions,,Extensions to the C Language Family}. Use of the
@option{-std} options listed above will disable these extensions where
they conflict with the C standard version selected. You may also
select an extended version of the C language explicitly with
-@option{-std=gnu90} (for C90 with GNU extensions) or @option{-std=gnu99}
-(for C99 with GNU extensions). The default, if no C language dialect
+@option{-std=gnu90} (for C90 with GNU extensions), @option{-std=gnu99}
+(for C99 with GNU extensions) or @option{-std=gnu1x} (for C1X with GNU
+extensions). The default, if no C language dialect
options are given, is @option{-std=gnu90}; this will change to
@option{-std=gnu99} in some future release when the C99 support is
complete. Some features that are part of the C99 standard are
diff --git a/gcc/ginclude/float.h b/gcc/ginclude/float.h
index 9969f1c883a..5c472c54375 100644
--- a/gcc/ginclude/float.h
+++ b/gcc/ginclude/float.h
@@ -157,6 +157,45 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#endif /* C99 */
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ > 199901L
+/* Versions of DECIMAL_DIG for each floating-point type. */
+#undef FLT_DECIMAL_DIG
+#undef DBL_DECIMAL_DIG
+#undef LDBL_DECIMAL_DIG
+#define FLT_DECIMAL_DIG __FLT_DECIMAL_DIG__
+#define DBL_DECIMAL_DIG __DBL_DECIMAL_DIG__
+#define LDBL_DECIMAL_DIG __DECIMAL_DIG__
+
+/* Whether types support subnormal numbers. */
+#undef FLT_HAS_SUBNORM
+#undef DBL_HAS_SUBNORM
+#undef LDBL_HAS_SUBNORM
+#define FLT_HAS_SUBNORM __FLT_HAS_DENORM__
+#define DBL_HAS_SUBNORM __DBL_HAS_DENORM__
+#define LDBL_HAS_SUBNORM __LDBL_HAS_DENORM__
+
+/* Minimum positive values, including subnormals. */
+#undef FLT_TRUE_MIN
+#undef DBL_TRUE_MIN
+#undef LDBL_TRUE_MIN
+#if __FLT_HAS_DENORM__
+#define FLT_TRUE_MIN __FLT_DENORM_MIN__
+#else
+#define FLT_TRUE_MIN __FLT_MIN__
+#endif
+#if __DBL_HAS_DENORM__
+#define DBL_TRUE_MIN __DBL_DENORM_MIN__
+#else
+#define DBL_TRUE_MIN __DBL_MIN__
+#endif
+#if __LDBL_HAS_DENORM__
+#define LDBL_TRUE_MIN __LDBL_DENORM_MIN__
+#else
+#define LDBL_TRUE_MIN __LDBL_MIN__
+#endif
+
+#endif /* C1X */
+
#ifdef __STDC_WANT_DEC_FP__
/* Draft Technical Report 24732, extension for decimal floating-point
arithmetic: Characteristic of decimal floating types <float.h>. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d098b8adfde..c4a24bb0b44 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2010-04-25 Joseph Myers <joseph@codesourcery.com>
+
+ * gcc.dg/c90-float-1.c: Also test that C1X macros are not defined.
+ * gcc.dg/c99-float-1.c: Also test that C1X macros are not defined.
+ * gcc.dg/c1x-float-1.c: New test.
+
2010-04-25 H.J. Lu <hongjiu.lu@intel.com>
* gcc.target/i386/pr43766.c: Scan "lea\[lq\]?\[ \t\]" instead
diff --git a/gcc/testsuite/gcc.dg/c1x-float-1.c b/gcc/testsuite/gcc.dg/c1x-float-1.c
new file mode 100644
index 00000000000..75233ac8227
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/c1x-float-1.c
@@ -0,0 +1,169 @@
+/* Test for <float.h> C1X macros. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do preprocess } */
+/* { dg-options "-std=c1x -pedantic-errors" } */
+
+/* This test checks that the C1X macros are defined;
+ it does not check the correctness of their values. */
+
+#include <float.h>
+
+#ifndef FLT_ROUNDS
+#error "FLT_ROUNDS undefined"
+#endif
+
+#ifndef FLT_RADIX
+#error "FLT_RADIX undefined"
+#endif
+
+#ifndef FLT_MANT_DIG
+#error "FLT_MANT_DIG undefined"
+#endif
+
+#ifndef FLT_DIG
+#error "FLT_DIG undefined"
+#endif
+
+#ifndef FLT_MIN_EXP
+#error "FLT_MIN_EXP undefined"
+#endif
+
+#ifndef FLT_MIN_10_EXP
+#error "FLT_MIN_10_EXP undefined"
+#endif
+
+#ifndef FLT_MAX_EXP
+#error "FLT_MAX_EXP undefined"
+#endif
+
+#ifndef FLT_MAX_10_EXP
+#error "FLT_MAX_10_EXP undefined"
+#endif
+
+#ifndef FLT_MAX
+#error "FLT_MAX undefined"
+#endif
+
+#ifndef FLT_EPSILON
+#error "FLT_EPSILON undefined"
+#endif
+
+#ifndef FLT_MIN
+#error "FLT_MIN undefined"
+#endif
+
+#ifndef DBL_MANT_DIG
+#error "DBL_MANT_DIG undefined"
+#endif
+
+#ifndef DBL_DIG
+#error "DBL_DIG undefined"
+#endif
+
+#ifndef DBL_MIN_EXP
+#error "DBL_MIN_EXP undefined"
+#endif
+
+#ifndef DBL_MIN_10_EXP
+#error "DBL_MIN_10_EXP undefined"
+#endif
+
+#ifndef DBL_MAX_EXP
+#error "DBL_MAX_EXP undefined"
+#endif
+
+#ifndef DBL_MAX_10_EXP
+#error "DBL_MAX_10_EXP undefined"
+#endif
+
+#ifndef DBL_MAX
+#error "DBL_MAX undefined"
+#endif
+
+#ifndef DBL_EPSILON
+#error "DBL_EPSILON undefined"
+#endif
+
+#ifndef DBL_MIN
+#error "DBL_MIN undefined"
+#endif
+
+#ifndef LDBL_MANT_DIG
+#error "LDBL_MANT_DIG undefined"
+#endif
+
+#ifndef LDBL_DIG
+#error "LDBL_DIG undefined"
+#endif
+
+#ifndef LDBL_MIN_EXP
+#error "LDBL_MIN_EXP undefined"
+#endif
+
+#ifndef LDBL_MIN_10_EXP
+#error "LDBL_MIN_10_EXP undefined"
+#endif
+
+#ifndef LDBL_MAX_EXP
+#error "LDBL_MAX_EXP undefined"
+#endif
+
+#ifndef LDBL_MAX_10_EXP
+#error "LDBL_MAX_10_EXP undefined"
+#endif
+
+#ifndef LDBL_MAX
+#error "LDBL_MAX undefined"
+#endif
+
+#ifndef LDBL_EPSILON
+#error "LDBL_EPSILON undefined"
+#endif
+
+#ifndef LDBL_MIN
+#error "LDBL_MIN undefined"
+#endif
+
+#ifndef FLT_EVAL_METHOD
+#error "FLT_EVAL_METHOD undefined"
+#endif
+
+#ifndef DECIMAL_DIG
+#error "DECIMAL_DIG undefined"
+#endif
+
+#ifndef FLT_DECIMAL_DIG
+#error "FLT_DECIMAL_DIG undefined"
+#endif
+
+#ifndef DBL_DECIMAL_DIG
+#error "DBL_DECIMAL_DIG undefined"
+#endif
+
+#ifndef LDBL_DECIMAL_DIG
+#error "LDBL_DECIMAL_DIG undefined"
+#endif
+
+#ifndef FLT_HAS_SUBNORM
+#error "FLT_HAS_SUBNORM undefined"
+#endif
+
+#ifndef DBL_HAS_SUBNORM
+#error "DBL_HAS_SUBNORM undefined"
+#endif
+
+#ifndef LDBL_HAS_SUBNORM
+#error "LDBL_HAS_SUBNORM undefined"
+#endif
+
+#ifndef FLT_TRUE_MIN
+#error "FLT_TRUE_MIN undefined"
+#endif
+
+#ifndef DBL_TRUE_MIN
+#error "DBL_TRUE_MIN undefined"
+#endif
+
+#ifndef LDBL_TRUE_MIN
+#error "LDBL_TRUE_MIN undefined"
+#endif
diff --git a/gcc/testsuite/gcc.dg/c90-float-1.c b/gcc/testsuite/gcc.dg/c90-float-1.c
index 39a585bcd09..5a2cab657a3 100644
--- a/gcc/testsuite/gcc.dg/c90-float-1.c
+++ b/gcc/testsuite/gcc.dg/c90-float-1.c
@@ -3,8 +3,8 @@
/* { dg-do preprocess } */
/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
-/* This test checks that the C90 macros (but not the C99 ones) are defined;
- it does not check the correctness of their values. */
+/* This test checks that the C90 macros (but not the C99 or C1X ones)
+ are defined; it does not check the correctness of their values. */
#include <float.h>
@@ -131,3 +131,39 @@
#ifdef DECIMAL_DIG
#error "DECIMAL_DIG defined"
#endif
+
+#ifdef FLT_DECIMAL_DIG
+#error "FLT_DECIMAL_DIG defined"
+#endif
+
+#ifdef DBL_DECIMAL_DIG
+#error "DBL_DECIMAL_DIG defined"
+#endif
+
+#ifdef LDBL_DECIMAL_DIG
+#error "LDBL_DECIMAL_DIG defined"
+#endif
+
+#ifdef FLT_HAS_SUBNORM
+#error "FLT_HAS_SUBNORM defined"
+#endif
+
+#ifdef DBL_HAS_SUBNORM
+#error "DBL_HAS_SUBNORM defined"
+#endif
+
+#ifdef LDBL_HAS_SUBNORM
+#error "LDBL_HAS_SUBNORM defined"
+#endif
+
+#ifdef FLT_TRUE_MIN
+#error "FLT_TRUE_MIN defined"
+#endif
+
+#ifdef DBL_TRUE_MIN
+#error "DBL_TRUE_MIN defined"
+#endif
+
+#ifdef LDBL_TRUE_MIN
+#error "LDBL_TRUE_MIN defined"
+#endif
diff --git a/gcc/testsuite/gcc.dg/c99-float-1.c b/gcc/testsuite/gcc.dg/c99-float-1.c
index 07fb9ee8bfb..f0dc39136e9 100644
--- a/gcc/testsuite/gcc.dg/c99-float-1.c
+++ b/gcc/testsuite/gcc.dg/c99-float-1.c
@@ -3,7 +3,7 @@
/* { dg-do preprocess } */
/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
-/* This test checks that the C99 macros are defined;
+/* This test checks that the C99 macros (but not the C1X ones) are defined;
it does not check the correctness of their values. */
#include <float.h>
@@ -131,3 +131,39 @@
#ifndef DECIMAL_DIG
#error "DECIMAL_DIG undefined"
#endif
+
+#ifdef FLT_DECIMAL_DIG
+#error "FLT_DECIMAL_DIG defined"
+#endif
+
+#ifdef DBL_DECIMAL_DIG
+#error "DBL_DECIMAL_DIG defined"
+#endif
+
+#ifdef LDBL_DECIMAL_DIG
+#error "LDBL_DECIMAL_DIG defined"
+#endif
+
+#ifdef FLT_HAS_SUBNORM
+#error "FLT_HAS_SUBNORM defined"
+#endif
+
+#ifdef DBL_HAS_SUBNORM
+#error "DBL_HAS_SUBNORM defined"
+#endif
+
+#ifdef LDBL_HAS_SUBNORM
+#error "LDBL_HAS_SUBNORM defined"
+#endif
+
+#ifdef FLT_TRUE_MIN
+#error "FLT_TRUE_MIN defined"
+#endif
+
+#ifdef DBL_TRUE_MIN
+#error "DBL_TRUE_MIN defined"
+#endif
+
+#ifdef LDBL_TRUE_MIN
+#error "LDBL_TRUE_MIN defined"
+#endif
diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog
index 24838d3cd10..cc77ca013bc 100644
--- a/libcpp/ChangeLog
+++ b/libcpp/ChangeLog
@@ -1,3 +1,10 @@
+2010-04-25 Joseph Myers <joseph@codesourcery.com>
+
+ * include/cpplib.h (enum c_lang): Add CLK_GNUC1X and CLK_STDC1X.
+ * init.c (lang_defaults): Add entries for new language variants.
+ (cpp_init_builtins): Define __STDC_VERSION__ to 201000L for C1X
+ variants.
+
2010-04-09 Manuel López-Ibáñez <manu@gcc.gnu.org>
PR cpp/43195
diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h
index 9f29e6e63ae..0828ea40f93 100644
--- a/libcpp/include/cpplib.h
+++ b/libcpp/include/cpplib.h
@@ -155,7 +155,8 @@ enum cpp_ttype
#undef TK
/* C language kind, used when calling cpp_create_reader. */
-enum c_lang {CLK_GNUC89 = 0, CLK_GNUC99, CLK_STDC89, CLK_STDC94, CLK_STDC99,
+enum c_lang {CLK_GNUC89 = 0, CLK_GNUC99, CLK_GNUC1X,
+ CLK_STDC89, CLK_STDC94, CLK_STDC99, CLK_STDC1X,
CLK_GNUCXX, CLK_CXX98, CLK_GNUCXX0X, CLK_CXX0X, CLK_ASM};
/* Payload of a NUMBER, STRING, CHAR or COMMENT token. */
diff --git a/libcpp/init.c b/libcpp/init.c
index f5bf0ea7b7d..ae5ae4548c8 100644
--- a/libcpp/init.c
+++ b/libcpp/init.c
@@ -84,9 +84,11 @@ static const struct lang_flags lang_defaults[] =
{ /* c99 c++ xnum xid std // digr ulit */
/* GNUC89 */ { 0, 0, 1, 0, 0, 1, 1, 0 },
/* GNUC99 */ { 1, 0, 1, 0, 0, 1, 1, 1 },
+ /* GNUC1X */ { 1, 0, 1, 0, 0, 1, 1, 1 },
/* STDC89 */ { 0, 0, 0, 0, 1, 0, 0, 0 },
/* STDC94 */ { 0, 0, 0, 0, 1, 0, 1, 0 },
/* STDC99 */ { 1, 0, 1, 0, 1, 1, 1, 0 },
+ /* STDC1X */ { 1, 0, 1, 0, 1, 1, 1, 0 },
/* GNUCXX */ { 0, 1, 1, 0, 0, 1, 1, 0 },
/* CXX98 */ { 0, 1, 1, 0, 1, 1, 1, 0 },
/* GNUCXX0X */ { 1, 1, 1, 0, 0, 1, 1, 1 },
@@ -457,6 +459,9 @@ cpp_init_builtins (cpp_reader *pfile, int hosted)
_cpp_define_builtin (pfile, "__ASSEMBLER__ 1");
else if (CPP_OPTION (pfile, lang) == CLK_STDC94)
_cpp_define_builtin (pfile, "__STDC_VERSION__ 199409L");
+ else if (CPP_OPTION (pfile, lang) == CLK_STDC1X
+ || CPP_OPTION (pfile, lang) == CLK_GNUC1X)
+ _cpp_define_builtin (pfile, "__STDC_VERSION__ 201000L");
else if (CPP_OPTION (pfile, c99))
_cpp_define_builtin (pfile, "__STDC_VERSION__ 199901L");