[PATCH] ctype: Fix bitfield types on 16-bit targets

Andre Vieira (lists) Andre.SimoesDiasVieira@arm.com
Mon Jul 30 07:34:00 GMT 2018


On 27/07/18 17:17, Thomas Wolff wrote:
> 
> Am 26.07.2018 um 22:35 schrieb Brian Inglis:
>> On 2018-07-26 10:05, Andre Vieira (lists) wrote:
>>> On 20/07/18 12:57, Corinna Vinschen wrote:
>>>> On Jul 20 13:07, Sebastian Huber wrote:
>>>>> This prevents errors like this:
>>>>> newlib/libc/ctype/categories.c:6:3: error: width of 'first' exceeds
>>>>> its type
>>>>>     unsigned int first: 24;
>>>>>     ^
>>>>> Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de>
>>>>> ---
>>>>>   newlib/libc/ctype/categories.c  | 5 +++--
>>>>>   newlib/libc/ctype/towctrans_l.c | 9 +++++----
>>>>>   2 files changed, 8 insertions(+), 6 deletions(-)
>>>> ACK.  Please push.
>>> Our aarch64 and arm bare-metal tests are showing failures with gcc's
>>> libstdc++ 22_locale/ctype/to/wchar_t/1.cc after this patch.
>>> src/gcc/libstdc++-v3/testsuite/22_locale/ctype/to/wchar_t/1.cc:66: void
>>> test01(): Assertion 'c100 == c00' failed.
>>> I haven't looked further into, just finished bisecting the issue.
>>> Any idea what might be going wrong?
>> Besides uninformative messages, small s is not being uppercased to
>> capital S;
>> https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=libstdc%2B%2B-v3/testsuite/22_locale/ctype/to/wchar_t/1.cc:
>>
>>
>> ...
>> typedef wchar_t char_type;
>> class gnu_ctype: public std::ctype<char_type> { };
>>
>> void test01()
>> {
>> ...
>>    const char_type c00 = L'S';
>>    const char_type c10 = L's';
>>
>>    gnu_ctype gctype;
>>    char_type c100;
>> ...
>>    // char_type toupper(char_type c) const
>>    c100 = gctype.toupper(c10);
>>    VERIFY( c100 == c00 );
>> ...
>>
>> which if not overridden by a non-default locale elsewhere may end up at:
>>
>> https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=libstdc%2B%2B-v3/config/os/newlib/ctype_configure_char.cc#l69
>>
>>
>>    char
>>    ctype<char>::do_toupper(char __c) const
>>    {
>>      int __x = __c;
>>      return (this->is(ctype_base::lower, __c) ? (__x - 'a' + 'A') : __x);
>>    }
>>
>> which depends on the lower case test working correctly, which depends
>> on the
>> locale table initialization, wherever that's done.
> Whatever gctype.toupper may be mapped to, the following gives me the
> correct output:
>   printf ("%X %X\n", toupper('s'), towupper('s'));
> 

Sebastian's new patch series
https://sourceware.org/ml/newlib/2018/msg00570.html fixes this issue on Arm.

Cheers,
Andre



More information about the Newlib mailing list