mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-30 13:13:43 +08:00
15081be993
As noted in bug 17979 (and as I noted earlier in <https://sourceware.org/ml/libc-alpha/2012-02/msg00647.html>), uchar.h has gratuitously complicated code to determine the types for char16_t and char32_t, and to reject including that header for pre-C11 compilers not defining __CHAR16_TYPE__ and __CHAR32_TYPE__. Since those types are always required to match uint_least16_t and uint_least32_t, which glibc knows how to define without reference to such predefined macros, it's safe just to define those types the same as the *least* types are defined in stdint.h, so allowing the header to work with (for example) GCC 4.3. This patch implements that. bits/types.h is made to define __int_leastN_t and __uint_leastN_t so the logic for those types can stay in a single place, and stdint.h is made to use those __*_t to define the public *_t types. uchar.h is then made to use __uint_least16_t and __uint_least32_t to define char16_t and char32_t, so simplifying the logic there. A new test is added that verifies the types chosen for char16_t and char32_t do indeed match the types the compiler uses for u"" and U"" string literals. Tested for x86_64. (I have not tested with any of the older compilers for which this would actually make a difference to whether you can include uchar.h.) [BZ #17979] * posix/bits/types.h (__int_least8_t): New typedef. (__uint_least8_t): Likewise. (__int_least16_t): Likewise. (__uint_least16_t): Likewise. (__int_least32_t): Likewise. (__uint_least32_t): Likewise. (__int_least64_t): Likewise. (__uint_least64_t): Likewise. * sysdeps/generic/stdint.h (int_least8_t): Define using __int_least8_t. (int_least16_t): Define using __int_least16_t. (int_least32_t): Define using __int_least32_t. (int_least64_t): Define using __int_least64_t. (uint_least8_t): Define using __uint_least8_t. (uint_least16_t): Define using __uint_least16_t. (uint_least32_t): Define using __uint_least32_t. (uint_least64_t): Define using __uint_least64_t. * wcsmbs/uchar.h: Include <bits/types.h>. (char16_t): Define using __uint_least16_t conditional only on [!__USE_ISOCXX11]. (char32_t): Define using __uint_least32_t conditional only on [!__USE_ISOCXX11]. * wcsmbs/test-char-types.c: New file. * wcsmbs/Makefile (tests): Add test-char-types.
108 lines
3.8 KiB
Makefile
108 lines
3.8 KiB
Makefile
# Copyright (C) 1995-2018 Free Software Foundation, Inc.
|
|
# This file is part of the GNU C Library.
|
|
|
|
# The GNU C Library is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU Lesser General Public
|
|
# License as published by the Free Software Foundation; either
|
|
# version 2.1 of the License, or (at your option) any later version.
|
|
|
|
# The GNU C 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
|
|
# Lesser General Public License for more details.
|
|
|
|
# You should have received a copy of the GNU Lesser General Public
|
|
# License along with the GNU C Library; if not, see
|
|
# <http://www.gnu.org/licenses/>.
|
|
|
|
#
|
|
# Sub-makefile for wcsmbs portion of the library.
|
|
#
|
|
subdir := wcsmbs
|
|
|
|
include ../Makeconfig
|
|
|
|
headers := wchar.h bits/wchar.h bits/wchar2.h bits/wchar-ldbl.h uchar.h \
|
|
bits/types/__mbstate_t.h bits/types/mbstate_t.h bits/types/wint_t.h
|
|
|
|
routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \
|
|
wcsncmp wcsncpy wcspbrk wcsrchr wcsspn wcstok wcsstr wmemchr \
|
|
wmemcmp wmemcpy wmemmove wmemset wcpcpy wcpncpy wmempcpy \
|
|
btowc wctob mbsinit \
|
|
mbrlen mbrtowc wcrtomb mbsrtowcs wcsrtombs \
|
|
mbsnrtowcs wcsnrtombs wcsnlen wcschrnul \
|
|
wcstol wcstoul wcstoll wcstoull wcstod wcstold wcstof \
|
|
wcstol_l wcstoul_l wcstoll_l wcstoull_l \
|
|
wcstod_l wcstold_l wcstof_l \
|
|
wcstod_nan wcstold_nan wcstof_nan \
|
|
wcscoll wcsxfrm \
|
|
wcwidth wcswidth \
|
|
wcscoll_l wcsxfrm_l \
|
|
wcscasecmp wcsncase wcscasecmp_l wcsncase_l \
|
|
wcsmbsload mbsrtowcs_l \
|
|
isoc99_wscanf isoc99_vwscanf isoc99_fwscanf isoc99_vfwscanf \
|
|
isoc99_swscanf isoc99_vswscanf \
|
|
mbrtoc16 c16rtomb
|
|
|
|
strop-tests := wcscmp wcsncmp wmemcmp wcslen wcschr wcsrchr wcscpy wcsnlen \
|
|
wcpcpy wcsncpy wcpncpy wcscat wcsncat wcschrnul wcsspn wcspbrk \
|
|
wcscspn wmemchr wmemset
|
|
tests := tst-wcstof wcsmbs-tst1 tst-wcsnlen tst-btowc tst-mbrtowc \
|
|
tst-wcrtomb tst-wcpncpy tst-mbsrtowcs tst-wchar-h tst-mbrtowc2 \
|
|
tst-c16c32-1 wcsatcliff tst-wcstol-locale tst-wcstod-nan-locale \
|
|
tst-wcstod-round test-char-types \
|
|
$(addprefix test-,$(strop-tests))
|
|
|
|
include ../Rules
|
|
|
|
ifeq ($(run-built-tests),yes)
|
|
LOCALES := de_DE.ISO-8859-1 de_DE.UTF-8 en_US.ANSI_X3.4-1968 hr_HR.ISO-8859-2 \
|
|
ja_JP.EUC-JP zh_TW.EUC-TW tr_TR.UTF-8 tr_TR.ISO-8859-9
|
|
include ../gen-locales.mk
|
|
|
|
$(objpfx)tst-btowc.out: $(gen-locales)
|
|
$(objpfx)tst-c16c32-1.out: $(gen-locales)
|
|
$(objpfx)tst-mbrtowc.out: $(gen-locales)
|
|
$(objpfx)tst-mbrtowc2.out: $(gen-locales)
|
|
$(objpfx)tst-wcrtomb.out: $(gen-locales)
|
|
$(objpfx)wcsmbs-tst1.out: $(gen-locales)
|
|
$(objpfx)tst-wcstol-locale.out: $(gen-locales)
|
|
$(objpfx)tst-wcstod-nan-locale.out: $(gen-locales)
|
|
endif
|
|
|
|
$(objpfx)tst-wcstod-round: $(libm)
|
|
|
|
CFLAGS-wcwidth.c += -I../wctype
|
|
CFLAGS-wcswidth.c += -I../wctype
|
|
|
|
strtox-CFLAGS = -I../include
|
|
CFLAGS-wcstol.c += $(strtox-CFLAGS)
|
|
CFLAGS-wcstoul.c += $(strtox-CFLAGS)
|
|
CFLAGS-wcstoll.c += $(strtox-CFLAGS)
|
|
CFLAGS-wcstoull.c += $(strtox-CFLAGS)
|
|
CFLAGS-wcstod.c += $(strtox-CFLAGS)
|
|
CFLAGS-wcstold.c += $(strtox-CFLAGS)
|
|
CFLAGS-wcstof128.c += $(strtox-CFLAGS)
|
|
CFLAGS-wcstof.c += $(strtox-CFLAGS)
|
|
CFLAGS-wcstol_l.c += $(strtox-CFLAGS)
|
|
CFLAGS-wcstoul_l.c += $(strtox-CFLAGS)
|
|
CFLAGS-wcstoll_l.c += $(strtox-CFLAGS)
|
|
CFLAGS-wcstoull_l.c += $(strtox-CFLAGS)
|
|
CFLAGS-wcstod_l.c += $(strtox-CFLAGS)
|
|
CFLAGS-wcstold_l.c += $(strtox-CFLAGS)
|
|
CFLAGS-wcstof128_l.c += $(strtox-CFLAGS)
|
|
CFLAGS-wcstof_l.c += $(strtox-CFLAGS)
|
|
CPPFLAGS-tst-wchar-h.c += -D_FORTIFY_SOURCE=2
|
|
|
|
CFLAGS-isoc99_wscanf.c += -fexceptions
|
|
CFLAGS-isoc99_fwscanf.c += -fexceptions
|
|
CFLAGS-isoc99_vwscanf.c += -fexceptions
|
|
CFLAGS-isoc99_vfwscanf.c += -fexceptions
|
|
|
|
CPPFLAGS += $(libio-mtsafe)
|
|
|
|
# We need to find the default version of strtold_l in stdlib.
|
|
CPPFLAGS-wcstold_l.c += -I../stdlib
|
|
|
|
$(objpfx)tst-wcstod-nan-locale: $(libm)
|