diff mbox

[v3] Add C++11 <cuchar>

Message ID 55CE0B89.8020705@verizon.net
State New
Headers show

Commit Message

Ed Smith-Rowland Aug. 14, 2015, 3:38 p.m. UTC
On 08/13/2015 10:51 AM, Jonathan Wakely wrote:
> On 13/08/15 10:37 -0400, Ed Smith-Rowland wrote:
>> Greetings,
>>
>> Now that most systems have uchar.h for conversion between char16_t* 
>> and char32_t* to multibyte (analogue of wchar.h and cwchar) i think 
>> we should check off this last little crumb of C++11.
>
> Ooh, I forgot about this, thanks!
>
>>     Add C++11 header <cuchar>.
>>     * acinclude.m4: Regenerate.
>
> This file isn't auto-generated, so the changelog is wrong. Maybe
> something like:
>
>  acinclude.m4 (GLIBCXX_ENABLE_CUCHAR): Define.
>
Done.
>
>> Index: include/Makefile.am
>> ===================================================================
>> --- include/Makefile.am    (revision 226808)
>> +++ include/Makefile.am    (working copy)
>> @@ -709,6 +709,7 @@
>>     ${c_base_srcdir}/cstring \
>>     ${c_base_srcdir}/ctgmath \
>>     ${c_base_srcdir}/ctime \
>> +    ${c_base_srcdir}/cuchar \
>>     ${c_base_srcdir}/cwchar \
>>     ${c_base_srcdir}/cwctype
>>
>> @@ -751,10 +752,19 @@
>>     ${c_compatibility_srcdir}/string.h \
>>     ${c_compatibility_srcdir}/tgmath.h \
>>     ${c_compatibility_srcdir}/time.h \
>> +    ${c_compatibility_srcdir}/uchar.h \
>>     ${c_compatibility_srcdir}/wchar.h \
>>     ${c_compatibility_srcdir}/wctype.h
>> endif
>>
>> +if ENABLE_CUCHAR
>> +cuchar_headers = \
>> +    ${c_base_srcdir}/cuchar \
>> +    ${c_compatibility_srcdir}/uchar.h
>> +else
>> +cuchar_headers =
>> +endif
>
> This cuchar_headers variable doesn't seem to be used anywhere, am I
> missing something?
>
> It looks like the headers are installed unconditionally, and this
> ENABLE_CUCHAR block isn't needed (and so the GLIBCXX_CONDITIONAL that
> creates it in acinclude.m4 isn't needed either).
>
I really want to not install unconditionally.  I fixed this too.
>
>> +// Copyright (C) 2013 Free Software Foundation, Inc.
>
> A few of the new files have 2013 as the copyright date, not 2015
> (I'm always forgetting to update the dates when I return to old
> patches that have been uncommitted for a while!)
>
>
LOL.  Fixed.

Rebuilt retested on x86_64-linux.  OK?

Ed
2015-08-14  Edward Smith-Rowland  <3dw4rd@verizon.net>

	Add C++11 header <cuchar>.
	* acinclude.m4 (GLIBCXX_ENABLE_CUCHAR): Define.
	* config.h.in: Regenerate.
	* configure: Regenerate.
	* configure.ac: Check for <uchar.h>.
	* include/Makefile.am: Check for <uchar.h>.
	* include/Makefile.in: Regenerate.
	* include/c/cuchar: New.
	* include/c_compatibility/uchar.h: New.
	* include/c_global/cuchar: New.
	* include/c_std/cuchar: New.
	* include/precompiled/stdc++.h: Include <cuchar>.
	* testsuite/17_intro/headers/c++200x/stdc++.cc: Include <uchar.h>.
	* testsuite/17_intro/headers/c++200x/stdc++_multiple_inclusion.cc:
	Include <uchar.h>.

Comments

Ed Smith-Rowland Aug. 14, 2015, 4:01 p.m. UTC | #1
OK.

This tested clean because it didn't install the headers.

So Jonathan.  I am going to throw in the sponge on the configury.

Could you have a look and carry this over the finish line?

Ed
Jonathan Wakely Aug. 14, 2015, 4:25 p.m. UTC | #2
On 14 August 2015 at 17:01, Ed Smith-Rowland wrote:
> OK.
>
> This tested clean because it didn't install the headers.
>
> So Jonathan.  I am going to throw in the sponge on the configury.

:-)

> Could you have a look and carry this over the finish line?

Will do, getting that stuff right is always a pain!
diff mbox

Patch

Index: acinclude.m4
===================================================================
--- acinclude.m4	(revision 226866)
+++ acinclude.m4	(working copy)
@@ -1926,6 +1926,51 @@ 
 ])
 
 dnl
+dnl Check for uchar.h and usability.
+dnl
+AC_DEFUN([GLIBCXX_ENABLE_CUCHAR], [
+
+  # Test uchar.h.
+  AC_MSG_CHECKING([for ISO C11 support for <uchar.h> for C++11 <cuchar>])
+  AC_CHECK_HEADERS(uchar.h, ac_has_uchar_h=yes, ac_has_uchar_h=no)
+  AC_MSG_RESULT($ac_has_uchar_h)
+
+  AC_LANG_SAVE
+  AC_LANG_CPLUSPLUS
+
+  if test x"$ac_has_uchar_h" = x"yes"; then
+    AC_TRY_COMPILE([#include <uchar.h>
+		    #ifdef __STDC_UTF_16__
+		    long i = __STDC_UTF_16__;
+		    #endif
+		    #ifdef __STDC_UTF_32__
+		    long j = __STDC_UTF_32__;
+		    #endif
+		    namespace test
+		    {
+		      using ::c16rtomb;
+		      using ::c32rtomb;
+		      using ::mbrtoc16;
+		      using ::mbrtoc32;
+		    }
+		   ],
+		   [], [ac_c11_uchar_cxx11=yes], [ac_c11_uchar_cxx11=no])
+  else
+    ac_c11_uchar_cxx11=no
+  fi
+  AC_MSG_RESULT($ac_c11_uchar_cxx11)
+  if test x"$ac_c11_uchar_cxx11" = x"yes"; then
+    AC_DEFINE(_GLIBCXX_USE_C11_UCHAR_CXX11, 1,
+	      [Define if C11 functions in <uchar.h> should be imported in
+	      <cuchar> in namespace std.])
+  fi
+
+  AC_LANG_RESTORE
+  AC_MSG_RESULT($enable_libstdcxx_cuchar)
+  GLIBCXX_CONDITIONAL(ENABLE_CUCHAR, test $enable_libstdcxx_cuchar = yes)
+])
+
+dnl
 dnl Check for what type of C headers to use.
 dnl
 dnl --enable-cheaders= [does stuff].
Index: config.h.in
===================================================================
--- config.h.in	(revision 226866)
+++ config.h.in	(working copy)
@@ -454,6 +454,9 @@ 
 /* Define to 1 if the target supports thread-local storage. */
 #undef HAVE_TLS
 
+/* Define to 1 if you have the <uchar.h> header file. */
+#undef HAVE_UCHAR_H
+
 /* Define to 1 if you have the <unistd.h> header file. */
 #undef HAVE_UNISTD_H
 
@@ -780,6 +783,10 @@ 
 /* Define to use Sun versioning in the shared library. */
 #undef _GLIBCXX_SYMVER_SUN
 
+/* Define if C11 functions in <uchar.h> should be imported in <cuchar> in
+   namespace std. */
+#undef _GLIBCXX_USE_C11_UCHAR_CXX11
+
 /* Define if C99 functions or macros from <wchar.h>, <math.h>, <complex.h>,
    <stdio.h>, and <stdlib.h> can be used or exposed. */
 #undef _GLIBCXX_USE_C99
Index: configure
===================================================================
--- configure	(revision 226866)
+++ configure	(working copy)
@@ -671,6 +671,8 @@ 
 OPT_LDFLAGS
 SECTION_LDFLAGS
 GLIBCXX_LIBS
+ENABLE_CUCHAR_FALSE
+ENABLE_CUCHAR_TRUE
 ENABLE_VTABLE_VERIFY_FALSE
 ENABLE_VTABLE_VERIFY_TRUE
 VTV_CYGMIN_FALSE
@@ -11594,7 +11596,7 @@ 
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 11597 "configure"
+#line 11599 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -11700,7 +11702,7 @@ 
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 11703 "configure"
+#line 11705 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -15386,7 +15388,7 @@ 
   # Fake what AC_TRY_COMPILE does.
 
     cat > conftest.$ac_ext << EOF
-#line 15389 "configure"
+#line 15391 "configure"
 int main()
 {
   typedef bool atomic_type;
@@ -15421,7 +15423,7 @@ 
     rm -f conftest*
 
     cat > conftest.$ac_ext << EOF
-#line 15424 "configure"
+#line 15426 "configure"
 int main()
 {
   typedef short atomic_type;
@@ -15456,7 +15458,7 @@ 
     rm -f conftest*
 
     cat > conftest.$ac_ext << EOF
-#line 15459 "configure"
+#line 15461 "configure"
 int main()
 {
   // NB: _Atomic_word not necessarily int.
@@ -15492,7 +15494,7 @@ 
     rm -f conftest*
 
     cat > conftest.$ac_ext << EOF
-#line 15495 "configure"
+#line 15497 "configure"
 int main()
 {
   typedef long long atomic_type;
@@ -15571,7 +15573,7 @@ 
   # unnecessary for this test.
 
     cat > conftest.$ac_ext << EOF
-#line 15574 "configure"
+#line 15576 "configure"
 int main()
 {
   _Decimal32 d1;
@@ -15613,7 +15615,7 @@ 
   # unnecessary for this test.
 
     cat > conftest.$ac_ext << EOF
-#line 15616 "configure"
+#line 15618 "configure"
 template<typename T1, typename T2>
   struct same
   { typedef T2 type; };
@@ -15647,7 +15649,7 @@ 
     rm -f conftest*
 
     cat > conftest.$ac_ext << EOF
-#line 15650 "configure"
+#line 15652 "configure"
 template<typename T1, typename T2>
   struct same
   { typedef T2 type; };
@@ -18149,6 +18151,103 @@ 
 
 
 
+# Check for uchar.h and usability of routines.
+for ac_header in uchar.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "uchar.h" "ac_cv_header_uchar_h" "$ac_includes_default"
+if test "x$ac_cv_header_uchar_h" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_UCHAR_H 1
+_ACEOF
+
+fi
+
+done
+
+
+
+  # Test uchar.h.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ISO C11 support for <uchar.h> for C++11 <cuchar>" >&5
+$as_echo_n "checking for ISO C11 support for <uchar.h> for C++11 <cuchar>... " >&6; }
+  for ac_header in uchar.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "uchar.h" "ac_cv_header_uchar_h" "$ac_includes_default"
+if test "x$ac_cv_header_uchar_h" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_UCHAR_H 1
+_ACEOF
+ ac_has_uchar_h=yes
+else
+  ac_has_uchar_h=no
+fi
+
+done
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_has_uchar_h" >&5
+$as_echo "$ac_has_uchar_h" >&6; }
+
+
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+  if test x"$ac_has_uchar_h" = x"yes"; then
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <uchar.h>
+		    #ifdef __STDC_UTF_16__
+		    long i = __STDC_UTF_16__;
+		    #endif
+		    #ifdef __STDC_UTF_32__
+		    long j = __STDC_UTF_32__;
+		    #endif
+		    namespace test
+		    {
+		      using ::c16rtomb;
+		      using ::c32rtomb;
+		      using ::mbrtoc16;
+		      using ::mbrtoc32;
+		    }
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_c11_uchar_cxx11=yes
+else
+  ac_c11_uchar_cxx11=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  else
+    ac_c11_uchar_cxx11=no
+  fi
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_c11_uchar_cxx11" >&5
+$as_echo "$ac_c11_uchar_cxx11" >&6; }
+  if test x"$ac_c11_uchar_cxx11" = x"yes"; then
+
+$as_echo "#define _GLIBCXX_USE_C11_UCHAR_CXX11 1" >>confdefs.h
+
+  fi
+
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_libstdcxx_cuchar" >&5
+$as_echo "$enable_libstdcxx_cuchar" >&6; }
+
+
+
 # For the streamoff typedef.
 
 
@@ -20755,7 +20854,7 @@ 
 for ac_header in endian.h execinfo.h float.h fp.h ieeefp.h inttypes.h \
 locale.h machine/endian.h machine/param.h nan.h stdint.h stdlib.h string.h \
 strings.h sys/ipc.h sys/isa_defs.h sys/machine.h sys/param.h \
-sys/resource.h sys/sem.h sys/stat.h sys/time.h sys/types.h unistd.h \
+sys/resource.h sys/sem.h sys/stat.h sys/time.h sys/types.h uchar.h unistd.h \
 wchar.h wctype.h
 do :
   as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
@@ -79831,6 +79930,15 @@ 
 fi
 
 
+    if test $enable_libstdcxx_cuchar = yes; then
+  ENABLE_CUCHAR_TRUE=
+  ENABLE_CUCHAR_FALSE='#'
+else
+  ENABLE_CUCHAR_TRUE='#'
+  ENABLE_CUCHAR_FALSE=
+fi
+
+
     if test $enable_symvers != no; then
   ENABLE_SYMVERS_TRUE=
   ENABLE_SYMVERS_FALSE='#'
@@ -80309,6 +80417,10 @@ 
   as_fn_error "conditional \"ENABLE_VTABLE_VERIFY\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${ENABLE_CUCHAR_TRUE}" && test -z "${ENABLE_CUCHAR_FALSE}"; then
+  as_fn_error "conditional \"ENABLE_CUCHAR\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${ENABLE_SYMVERS_TRUE}" && test -z "${ENABLE_SYMVERS_FALSE}"; then
   as_fn_error "conditional \"ENABLE_SYMVERS\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
Index: configure.ac
===================================================================
--- configure.ac	(revision 226866)
+++ configure.ac	(working copy)
@@ -182,6 +182,10 @@ 
 GLIBCXX_CHECK_STDIO_PROTO
 GLIBCXX_CHECK_SYSTEM_ERROR
 
+# Check for uchar.h and usability of routines.
+AC_CHECK_HEADERS([uchar.h])
+GLIBCXX_ENABLE_CUCHAR
+
 # For the streamoff typedef.
 GLIBCXX_CHECK_INT64_T
 
@@ -234,7 +238,7 @@ 
 AC_CHECK_HEADERS([endian.h execinfo.h float.h fp.h ieeefp.h inttypes.h \
 locale.h machine/endian.h machine/param.h nan.h stdint.h stdlib.h string.h \
 strings.h sys/ipc.h sys/isa_defs.h sys/machine.h sys/param.h \
-sys/resource.h sys/sem.h sys/stat.h sys/time.h sys/types.h unistd.h \
+sys/resource.h sys/sem.h sys/stat.h sys/time.h sys/types.h uchar.h unistd.h \
 wchar.h wctype.h])
 
 # Only do link tests if native. Else, hardcode.
Index: include/Makefile.am
===================================================================
--- include/Makefile.am	(revision 226866)
+++ include/Makefile.am	(working copy)
@@ -710,6 +710,7 @@ 
 	${c_base_srcdir}/cstring \
 	${c_base_srcdir}/ctgmath \
 	${c_base_srcdir}/ctime \
+	${c_base_cuchar_header} \
 	${c_base_srcdir}/cwchar \
 	${c_base_srcdir}/cwctype
 
@@ -752,10 +753,19 @@ 
 	${c_compatibility_srcdir}/string.h \
 	${c_compatibility_srcdir}/tgmath.h \
 	${c_compatibility_srcdir}/time.h \
+	${c_compatibility_cuchar_header} \
 	${c_compatibility_srcdir}/wchar.h \
 	${c_compatibility_srcdir}/wctype.h
 endif
 
+if ENABLE_CUCHAR
+c_base_cuchar_header = ${c_base_srcdir}/cuchar
+c_compatibility_cuchar_header = ${c_compatibility_srcdir}/uchar.h
+else
+c_base_cuchar_header = 
+c_compatibility_cuchar_header = 
+endif
+
 # Debug mode headers
 debug_srcdir = ${glibcxx_srcdir}/include/debug
 debug_builddir = ./debug
Index: include/Makefile.in
===================================================================
--- include/Makefile.in	(revision 226866)
+++ include/Makefile.in	(working copy)
@@ -997,6 +997,7 @@ 
 	${c_base_srcdir}/cstring \
 	${c_base_srcdir}/ctgmath \
 	${c_base_srcdir}/ctime \
+	${c_base_cuchar_header} \
 	${c_base_srcdir}/cwchar \
 	${c_base_srcdir}/cwctype
 
@@ -1033,9 +1034,14 @@ 
 @GLIBCXX_C_HEADERS_C_TRUE@	${c_compatibility_srcdir}/string.h \
 @GLIBCXX_C_HEADERS_C_TRUE@	${c_compatibility_srcdir}/tgmath.h \
 @GLIBCXX_C_HEADERS_C_TRUE@	${c_compatibility_srcdir}/time.h \
+@GLIBCXX_C_HEADERS_C_TRUE@	${c_compatibility_cuchar_header} \
 @GLIBCXX_C_HEADERS_C_TRUE@	${c_compatibility_srcdir}/wchar.h \
 @GLIBCXX_C_HEADERS_C_TRUE@	${c_compatibility_srcdir}/wctype.h
 
+@ENABLE_CUCHAR_FALSE@c_base_cuchar_header = 
+@ENABLE_CUCHAR_TRUE@c_base_cuchar_header = ${c_base_srcdir}/cuchar
+@ENABLE_CUCHAR_FALSE@c_compatibility_cuchar_header = 
+@ENABLE_CUCHAR_TRUE@c_compatibility_cuchar_header = ${c_compatibility_srcdir}/uchar.h
 
 # Debug mode headers
 debug_srcdir = ${glibcxx_srcdir}/include/debug
Index: include/c/cuchar
===================================================================
--- include/c/cuchar	(revision 0)
+++ include/c/cuchar	(working copy)
@@ -0,0 +1,47 @@ 
+// -*- C++ -*- forwarding header.
+
+// Copyright (C) 2015 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+//
+// ISO C++ 14882: 21.4
+//
+
+#ifndef _GLIBCXX_CUCHAR
+#define _GLIBCXX_CUCHAR 1
+
+#pragma GCC system_header
+
+#if __cplusplus < 201103L
+# include <bits/c++0x_warning.h>
+#else
+
+#include <bits/c++config.h>
+#include <cwchar>
+
+#if _GLIBCXX_USE_C11_UCHAR_CXX11
+# include_next <uchar.h>
+#endif
+
+#endif // C++11
+
+#endif // _GLIBCXX_CUCHAR
Index: include/c_compatibility/uchar.h
===================================================================
--- include/c_compatibility/uchar.h	(revision 0)
+++ include/c_compatibility/uchar.h	(working copy)
@@ -0,0 +1,45 @@ 
+// -*- C++ -*- compatibility header.
+
+// Copyright (C) 2015 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+/** @file uchar.h
+ *  This is a Standard C++ Library header.
+ */
+
+#include <cuchar>
+
+#ifndef _GLIBCXX_UCHAR_H
+#define _GLIBCXX_UCHAR_H 1
+
+#ifdef _GLIBCXX_NAMESPACE_C
+
+#if _GLIBCXX_USE_C11_UCHAR_CXX11
+using std::mbrtoc16;
+using std::c16rtomb;
+using std::mbrtoc32;
+using std::c32rtomb;
+#endif // _GLIBCXX_USE_C11_UCHAR_CXX11
+
+#endif // _GLIBCXX_NAMESPACE_C
+
+#endif // _GLIBCXX_UCHAR_H
Index: include/c_global/cuchar
===================================================================
--- include/c_global/cuchar	(revision 0)
+++ include/c_global/cuchar	(working copy)
@@ -0,0 +1,77 @@ 
+// -*- C++ -*- forwarding header.
+
+// Copyright (C) 2015 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+/** @file include/cuchar
+ *  This is a Standard C++ Library file.  You should @c \#include this file
+ *  in your programs, rather than any of the @a *.h implementation files.
+ *
+ *  This is the C++ version of the Standard C Library header @c uchar.h,
+ *  and its contents are (mostly) the same as that header, but are all
+ *  contained in the namespace @c std (except for names which are defined
+ *  as macros in C).
+ */
+
+//
+// ISO C++ 14882: 21.4
+//
+
+#ifndef _GLIBCXX_CUCHAR
+#define _GLIBCXX_CUCHAR 1
+
+#pragma GCC system_header
+
+#if __cplusplus < 201103L
+# include <bits/c++0x_warning.h>
+#else
+
+#include <bits/c++config.h>
+#include <cwchar>
+
+#if _GLIBCXX_USE_C11_UCHAR_CXX11
+
+#include <uchar.h>
+
+// Get rid of those macros defined in <uchar.h> in lieu of real functions.
+#undef mbrtoc16
+#undef c16rtomb
+#undef mbrtoc32
+#undef c32rtomb
+
+namespace std _GLIBCXX_VISIBILITY(default)
+{
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
+
+  using ::mbrtoc16;
+  using ::c16rtomb;
+  using ::mbrtoc32;
+  using ::c32rtomb;
+
+_GLIBCXX_END_NAMESPACE_VERSION
+} // namespace std
+
+#endif // _GLIBCXX_USE_C11_UCHAR_CXX11
+
+#endif // C++11
+
+#endif // _GLIBCXX_CUCHAR
Index: include/c_std/cuchar
===================================================================
--- include/c_std/cuchar	(revision 0)
+++ include/c_std/cuchar	(working copy)
@@ -0,0 +1,77 @@ 
+// -*- C++ -*- forwarding header.
+
+// Copyright (C) 2015 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+/** @file include/cuchar
+ *  This is a Standard C++ Library file.  You should @c #include this file
+ *  in your programs, rather than any of the @a *.h implementation files.
+ *
+ *  This is the C++ version of the Standard C Library header @c uchar.h,
+ *  and its contents are (mostly) the same as that header, but are all
+ *  contained in the namespace @c std (except for names which are defined
+ *  as macros in C).
+ */
+
+//
+// ISO C++ 14882: 21.4
+//
+
+#ifndef _GLIBCXX_CUCHAR
+#define _GLIBCXX_CUCHAR 1
+
+#pragma GCC system_header
+
+#if __cplusplus < 201103L
+# include <bits/c++0x_warning.h>
+#else
+
+#include <bits/c++config.h>
+#include <cwchar>
+
+#if _GLIBCXX_USE_C11_UCHAR_CXX11
+
+#include <uchar.h>
+
+// Get rid of those macros defined in <uchar.h> in lieu of real functions.
+#undef mbrtoc16
+#undef c16rtomb
+#undef mbrtoc32
+#undef c32rtomb
+
+namespace std _GLIBCXX_VISIBILITY(default)
+{
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
+
+  using ::mbrtoc16;
+  using ::c16rtomb;
+  using ::mbrtoc32;
+  using ::c32rtomb;
+
+_GLIBCXX_END_NAMESPACE_VERSION
+} // namespace std
+
+#endif // _GLIBCXX_USE_C11_UCHAR_CXX11
+
+#endif // C++11
+
+#endif // _GLIBCXX_CUCHAR
Index: include/precompiled/stdc++.h
===================================================================
--- include/precompiled/stdc++.h	(revision 226866)
+++ include/precompiled/stdc++.h	(working copy)
@@ -56,6 +56,7 @@ 
 #include <cstdbool>
 #include <cstdint>
 #include <ctgmath>
+#include <cuchar>
 #include <cwchar>
 #include <cwctype>
 #endif
Index: testsuite/17_intro/headers/c++200x/stdc++.cc
===================================================================
--- testsuite/17_intro/headers/c++200x/stdc++.cc	(revision 226866)
+++ testsuite/17_intro/headers/c++200x/stdc++.cc	(working copy)
@@ -59,6 +59,9 @@ 
 #include <tgmath.h>
 #endif
 #include <time.h>
+#if __has_include(<uchar.h>)
+#include <uchar.h>
+#endif
 #ifdef _GLIBCXX_HAVE_WCHAR_H
 #include <wchar.h>
 #endif
Index: testsuite/17_intro/headers/c++200x/stdc++_multiple_inclusion.cc
===================================================================
--- testsuite/17_intro/headers/c++200x/stdc++_multiple_inclusion.cc	(revision 226866)
+++ testsuite/17_intro/headers/c++200x/stdc++_multiple_inclusion.cc	(working copy)
@@ -59,6 +59,9 @@ 
 #include <tgmath.h>
 #endif
 #include <time.h>
+#if __has_include(<uchar.h>)
+#include <uchar.h>
+#endif
 #ifdef _GLIBCXX_HAVE_WCHAR_H
 #include <wchar.h>
 #endif
@@ -103,6 +106,9 @@ 
 #include <tgmath.h>
 #endif
 #include <time.h>
+#if __has_include(<uchar.h>)
+#include <uchar.h>
+#endif
 #ifdef _GLIBCXX_HAVE_WCHAR_H
 #include <wchar.h>
 #endif