Bug 33979 - support for char16_t, char32_t
Summary: support for char16_t, char32_t
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 4.3.0
: P3 enhancement
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
: 20410 (view as bug list)
Depends on:
Blocks:
 
Reported: 2007-11-02 01:34 UTC by Benjamin Kosnik
Modified: 2018-06-12 15:15 UTC (History)
7 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2008-02-25 05:03:41


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Benjamin Kosnik 2007-11-02 01:34:06 UTC
This is a feature request for char16_t and char32_t builtin types when compiling as C++0x. I've been meaning to do this since April, 2007.

For C++0x library-side, this is a relatively big change in terms of supported API. In particular, numeric_limits, char_traits, basic_string, io, and locale are all impacted.

See:

Language-side:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2149.html

Library-side:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2238.html

The library side is a separate issue, but for now just getting the language side in would be useful.
Comment 1 Andrew Pinski 2007-12-02 22:26:37 UTC
Confirmed.
Comment 2 Benjamin Kosnik 2008-04-01 00:12:18 UTC
Patch posted here:
http://gcc.gnu.org/ml/gcc-patches/2008-03/msg01474.html
Comment 3 Kris Van Hees 2008-04-01 00:27:41 UTC
Updated patch based on additional feedback:
http://gcc.gnu.org/ml/gcc-patches/2008-03/msg02025.html
Comment 4 Kris Van Hees 2008-04-15 20:17:25 UTC
Updated patch:

http://gcc.gnu.org/ml/gcc-patches/2008-04/msg01235.html
Comment 5 Benjamin Kosnik 2008-05-06 19:02:11 UTC
The compiler parts of this are done, or well along in terms of progress. 

For the library, I think it makes sense to start with _GLIBCXX_USE_CHAR16_T and _GLIBCXX_USE_CHAR32_T configury and macros, and then ease into support with things like numeric_limits and char_traits.

-benjamin
Comment 6 Paolo Carlini 2008-05-19 10:31:35 UTC
Agreed, Benjamin, I'm looking into the first library bits. By the way, both the core and library proposals are now in the working paper (N2461), before that, N2249 superseeded N2149.
Comment 7 Andrew Pinski 2008-05-19 10:54:06 UTC
(In reply to comment #6)
> Agreed, Benjamin, I'm looking into the first library bits. By the way, both the
> core and library proposals are now in the working paper (N2461), before that,
> N2249 superseeded N2149.

I think this really requires libc support.
Comment 8 Paolo Carlini 2008-05-19 10:58:10 UTC
Parts of it, surely. Not all of it, however.
Comment 9 Benjamin Kosnik 2008-05-19 18:21:02 UTC
Sounds great Paolo! I am not working on this.
Comment 10 paolo@gcc.gnu.org 2008-05-20 18:12:18 UTC
Subject: Bug 33979

Author: paolo
Date: Tue May 20 18:11:34 2008
New Revision: 135668

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=135668
Log:
2008-05-20  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/33979 (partial)
	* include/tr1_impl/functional_hash.h (hash<char16_t>,
	hash<char32_t>): Add specializations.
	* include/tr1_impl/type_traits (is_integral<char16_t>,
	is_integral<char32_t>): Likewise.
	* include/std/limits (numeric_limits<char16_t>,
	numeric_limits<char32_t>): Likewise.
	* src/limits_c++0x.cc: Add.
	* src/Makefile.am: Update.
	* testsuite/20_util/hash/requirements/explicit_instantiation.cc:
	Update.
	* testsuite/20_util/is_integral/value.cc: New.
	* testsuite/20_util/is_integral/requirements/typedefs.cc: Likewise.
	* testsuite/20_util/is_integral/requirements/
	explicit_instantiation.cc: Likewise.
	* testsuite/18_support/numeric_limits/char16_32_t.cc: Likewise.	
	* config/abi/pre/gnu.ver: Export new numeric_limits symbols at
	GLIBCXX_3.4.11.
	* configure: Regenerate.
	* src/Makefile.in: Likewise.
	* config.h.in: Likewise.

Added:
    trunk/libstdc++-v3/src/limits_c++0x.cc
    trunk/libstdc++-v3/testsuite/18_support/numeric_limits/char16_32_t.cc
    trunk/libstdc++-v3/testsuite/20_util/is_integral/
    trunk/libstdc++-v3/testsuite/20_util/is_integral/requirements/
    trunk/libstdc++-v3/testsuite/20_util/is_integral/requirements/explicit_instantiation.cc
    trunk/libstdc++-v3/testsuite/20_util/is_integral/requirements/typedefs.cc
    trunk/libstdc++-v3/testsuite/20_util/is_integral/value.cc
Modified:
    trunk/libstdc++-v3/ChangeLog
    trunk/libstdc++-v3/config.h.in
    trunk/libstdc++-v3/config/abi/pre/gnu.ver
    trunk/libstdc++-v3/configure
    trunk/libstdc++-v3/include/std/limits
    trunk/libstdc++-v3/include/tr1_impl/functional_hash.h
    trunk/libstdc++-v3/include/tr1_impl/type_traits
    trunk/libstdc++-v3/src/Makefile.am
    trunk/libstdc++-v3/src/Makefile.in
    trunk/libstdc++-v3/testsuite/20_util/hash/requirements/explicit_instantiation.cc

Comment 11 Paolo Carlini 2008-08-10 16:36:23 UTC
*** Bug 20410 has been marked as a duplicate of this bug. ***
Comment 12 paolo@gcc.gnu.org 2008-08-20 19:31:10 UTC
Subject: Bug 33979

Author: paolo
Date: Wed Aug 20 19:29:54 2008
New Revision: 139339

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=139339
Log:
2008-08-20  Paolo Carlini  <paolo.carlini@oracle.com>

	PR libstdc++/33979 (partial)
	* include/bits/postypes.h (u16streampos, u32streampos): Add.
	* include/bits/char_traits.h (char_traits<char16_t>,
	char_traits<char32_t>): Add.
	* include/bits/stringfwd.h (u16string, u32string): Add.
	* include/ext/vstring_fwd.h: Add typedefs for char16_t/char32_t.
	* testsuite/21_strings/char_traits/requirements/char32_t/typedefs.cc:
	New.
	* testsuite/21_strings/char_traits/requirements/
	explicit_instantiation/short/1.cc: Likewise.
	* testsuite/21_strings/char_traits/requirements/
	explicit_instantiation/char32_t/1.cc: Likewise.
	* testsuite/21_strings/char_traits/requirements/
	explicit_instantiation/wchar_t/1.cc: Likewise.
	* testsuite/21_strings/char_traits/requirements/
	explicit_instantiation/char16_t/1.cc: Likewise.
	* testsuite/21_strings/char_traits/requirements/
	explicit_instantiation/char/1.cc: Likewise.
	* testsuite/21_strings/char_traits/requirements/char16_t/typedefs.cc:
	Likewise.
	* testsuite/21_strings/basic_string/requirements/
	explicit_instantiation/char32_t/1.cc: Likewise.
	* testsuite/21_strings/basic_string/requirements/
	explicit_instantiation/wchar_t/1.cc: Likewise.
	* testsuite/21_strings/basic_string/requirements/
	explicit_instantiation/char16_t/1.cc: Likewise.
	* testsuite/21_strings/basic_string/requirements/
	explicit_instantiation/char/1.cc: Likewise.
	* testsuite/21_strings/headers/string/types_std_c++0x.cc: Likewise.
	* testsuite/ext/vstring/requirements/explicit_instantiation/
	char32_t/1.cc: Likewise.
	* testsuite/ext/vstring/requirements/explicit_instantiation/
	char16_t/1.cc: Likewise.


Added:
    trunk/libstdc++-v3/testsuite/21_strings/basic_string/requirements/explicit_instantiation/char/
    trunk/libstdc++-v3/testsuite/21_strings/basic_string/requirements/explicit_instantiation/char/1.cc
    trunk/libstdc++-v3/testsuite/21_strings/basic_string/requirements/explicit_instantiation/char16_t/
    trunk/libstdc++-v3/testsuite/21_strings/basic_string/requirements/explicit_instantiation/char16_t/1.cc
    trunk/libstdc++-v3/testsuite/21_strings/basic_string/requirements/explicit_instantiation/char32_t/
    trunk/libstdc++-v3/testsuite/21_strings/basic_string/requirements/explicit_instantiation/char32_t/1.cc
    trunk/libstdc++-v3/testsuite/21_strings/basic_string/requirements/explicit_instantiation/wchar_t/
    trunk/libstdc++-v3/testsuite/21_strings/basic_string/requirements/explicit_instantiation/wchar_t/1.cc
    trunk/libstdc++-v3/testsuite/21_strings/char_traits/requirements/char16_t/
    trunk/libstdc++-v3/testsuite/21_strings/char_traits/requirements/char16_t/typedefs.cc
    trunk/libstdc++-v3/testsuite/21_strings/char_traits/requirements/char32_t/
    trunk/libstdc++-v3/testsuite/21_strings/char_traits/requirements/char32_t/typedefs.cc
    trunk/libstdc++-v3/testsuite/21_strings/char_traits/requirements/explicit_instantiation/
    trunk/libstdc++-v3/testsuite/21_strings/char_traits/requirements/explicit_instantiation/char/
    trunk/libstdc++-v3/testsuite/21_strings/char_traits/requirements/explicit_instantiation/char/1.cc   (with props)
    trunk/libstdc++-v3/testsuite/21_strings/char_traits/requirements/explicit_instantiation/char16_t/
    trunk/libstdc++-v3/testsuite/21_strings/char_traits/requirements/explicit_instantiation/char16_t/1.cc
    trunk/libstdc++-v3/testsuite/21_strings/char_traits/requirements/explicit_instantiation/char32_t/
    trunk/libstdc++-v3/testsuite/21_strings/char_traits/requirements/explicit_instantiation/char32_t/1.cc
    trunk/libstdc++-v3/testsuite/21_strings/char_traits/requirements/explicit_instantiation/short/
    trunk/libstdc++-v3/testsuite/21_strings/char_traits/requirements/explicit_instantiation/short/1.cc
    trunk/libstdc++-v3/testsuite/21_strings/char_traits/requirements/explicit_instantiation/wchar_t/
    trunk/libstdc++-v3/testsuite/21_strings/char_traits/requirements/explicit_instantiation/wchar_t/1.cc   (with props)
    trunk/libstdc++-v3/testsuite/21_strings/headers/string/types_std_c++0x.cc
    trunk/libstdc++-v3/testsuite/ext/vstring/requirements/explicit_instantiation/char16_t/
    trunk/libstdc++-v3/testsuite/ext/vstring/requirements/explicit_instantiation/char16_t/1.cc
    trunk/libstdc++-v3/testsuite/ext/vstring/requirements/explicit_instantiation/char32_t/
    trunk/libstdc++-v3/testsuite/ext/vstring/requirements/explicit_instantiation/char32_t/1.cc
Modified:
    trunk/libstdc++-v3/ChangeLog
    trunk/libstdc++-v3/include/bits/char_traits.h
    trunk/libstdc++-v3/include/bits/postypes.h
    trunk/libstdc++-v3/include/bits/stringfwd.h
    trunk/libstdc++-v3/include/ext/vstring_fwd.h

Propchange: trunk/libstdc++-v3/testsuite/21_strings/char_traits/requirements/explicit_instantiation/char/1.cc
            ('svn:mergeinfo' added)

Propchange: trunk/libstdc++-v3/testsuite/21_strings/char_traits/requirements/explicit_instantiation/wchar_t/1.cc
            ('svn:mergeinfo' added)


Comment 13 Andrew Pinski 2008-12-31 19:20:03 UTC
I think all the front-end parts are fixed now, and only the library part needs to be worked on or is this fully fixed?
Comment 14 Benjamin Kosnik 2009-04-22 16:49:15 UTC
Language parts are done for 4.4.0 according to C++0x status. If parts are remaining please detail.

For library, numerics/string are done but locale is not in 4.4.0.
Comment 15 Paolo Carlini 2009-04-22 17:23:18 UTC
In order to make progress on the locale bits while following the usual strategies of v3, we need some support from the underlying glibc, not forthcoming, AFAIK...
Comment 16 Mathias Gaunard 2009-05-26 20:10:37 UTC
It seems the current patch makes char16_t and char32_t keywords.
According to the linked specifications, however, those should only be typedefs to the actual keywords, which are _Char16_t and _Char32_t.
Those typedefs should be in the file <cuchar>.

Note this is the same design as bool/_Bool/<stdbool.h> in C99.
Comment 17 Mathias Gaunard 2009-05-26 20:16:51 UTC
Ignore my previous comment; it seems that was changed since in the current C++0x draft those are indeed keywords.
Comment 18 Scott A. Colcord 2009-12-14 21:36:42 UTC
Should the library support for this be split into a separate bug?  Or two bugs, if libstdc++ and glibc both need to handle the new types?
Comment 19 Eric Gallager 2018-03-12 02:26:00 UTC
(In reply to Scott A. Colcord from comment #18)
> Should the library support for this be split into a separate bug?  Or two
> bugs, if libstdc++ and glibc both need to handle the new types?

I'd want to get an update on whether it's still needed first, or whether it's already been added. If it's still needed, then it'd make sense for a separate libstdc++ bug on this bugzilla (glibc has its own separate bugzilla)
Comment 20 Jonathan Wakely 2018-03-12 13:38:54 UTC
Compiler support for char16_t and char32_t has been complete for many years.

The libstdc++ support required by the standard has been complete since GCC 5.1, but I don't know if Paolo had more in mind (we don't implement all locale facets for char16_t and char32_t, which means e.g. std::basic_stringstream<char16_t> doesn't work, but the standard doesn't require it to work).
Comment 21 Eric Gallager 2018-06-12 03:45:59 UTC
(In reply to Jonathan Wakely from comment #20)
> Compiler support for char16_t and char32_t has been complete for many years.
> 
> The libstdc++ support required by the standard has been complete since GCC
> 5.1, but I don't know if Paolo had more in mind (we don't implement all
> locale facets for char16_t and char32_t, which means e.g.
> std::basic_stringstream<char16_t> doesn't work, but the standard doesn't
> require it to work).

Changing status to WAITING on Paolo...
Comment 22 Paolo Carlini 2018-06-12 08:03:45 UTC
I don't have much to add, I'm sure Jonathan will make the best decisions about this issue.
Comment 23 Jonathan Wakely 2018-06-12 12:09:13 UTC
(In reply to Jonathan Wakely from comment #20)
> The libstdc++ support required by the standard has been complete since GCC
> 5.1, but I don't know if Paolo had more in mind (we don't implement all
> locale facets for char16_t and char32_t, which means e.g.
> std::basic_stringstream<char16_t> doesn't work, but the standard doesn't
> require it to work).

We have PR 78486 requesting that (but I have no plans to work on it myself).

Let's close this one, everything required by the standard works.