[PATCH] PR libstdc++/85951 for make_signed/make_unsigned for character types
Jonathan Wakely
jwakely@redhat.com
Thu May 31 14:10:00 GMT 2018
On 31/05/18 13:17 +0100, Jonathan Wakely wrote:
>Because the wide character types are neither signed integer types nor
>unsigned integer types they need to be transformed to an integral type
>of the correct size and the lowest rank (which is not necessarily the
>underlying type). Reuse the helpers for enumeration types to select the
>correct integer.
>
>The refactoring of __make_unsigned_selector and __make_signed_selector
>slightly reduces the number of template instantiations and so reduces
>memory usage.
>
> PR libstdc++/85951
> * include/std/type_traits [_GLIBCXX_USE_C99_STDINT_TR1]: Do not define
> uint_least16_t and uint_least32_t.
> (__make_unsigned<wchar_t>): Define unconditionally.
> (__make_unsigned_selector<_Tp, true, false>): Remove intermediate
> typedefs.
> (__make_unsigned_selector_base): New type to provide helper templates.
> (__make_unsigned_selector<_Tp, false, true>): Reimplement using
> __make_unsigned_selector_base helpers.
> (__make_unsigned<char16_t>, __make_unsigned<char32_t>): Define.
> (__make_signed_selector<_Tp, true, false>): Remove intermediate
> typedefs.
> (__make_signed<wchar_t>, __make_signed<char16_t>)
> (__make_signed<char32_t>)): Define unconditionally.
> * testsuite/20_util/make_signed/requirements/typedefs-3.cc: Check
> wchar_t, char16_t and char32_t are transformed correctly.
> * testsuite/20_util/make_signed/requirements/typedefs_neg.cc: Adjust
> dg-error lineno.
> * testsuite/20_util/make_unsigned/requirements/typedefs-3.cc: Check
> wchar_t, char16_t and char32_t are transformed correctly.
> * testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc: Adjust
> dg-error lineno.
>
>Tested powerpc64le-linux, committed to trunk.
>
>I'll backport a simpler version without the refactoring.
This is the backport I'm committing to the branches. I forgot that one
of the reasons I did the refactoring was to avoid std::conditional,
which isn't defined yet and so can't be used by the new explicit
specializations of __make_unsigned and __make_signed. To solve that
problem on the branches I'll just put the new specializations later in
the file.
Tested x86_64-linux, committed to gcc-8-branch (and others to follow
soon).
-------------- next part --------------
A non-text attachment was scrubbed...
Name: patch.txt
Type: text/x-patch
Size: 9399 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/libstdc++/attachments/20180531/914047f8/attachment.bin>
More information about the Libstdc++
mailing list