mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-01-11 12:25:16 +08:00
cpplex.c (cpp_interpret_charconst): Get signedness or otherwise of wide character constants correct.
* cpplex.c (cpp_interpret_charconst): Get signedness or otherwise of wide character constants correct. * cppexp.c (lex): Get signedness of wide charconsts correct. * testsuite/gcc.dg/cpp/wchar-1.c: New test. From-SVN: r50005
This commit is contained in:
parent
cb8f73be28
commit
a47ed31052
@ -1,3 +1,9 @@
|
||||
2002-02-24 Neil Booth <neil@daikokuya.demon.co.uk>
|
||||
|
||||
* cpplex.c (cpp_interpret_charconst): Get signedness or
|
||||
otherwise of wide character constants correct.
|
||||
* cppexp.c (lex): Get signedness of wide charconsts correct.
|
||||
|
||||
Sun Feb 24 07:41:31 2002 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
|
||||
|
||||
* optabs.c (widen_operand): Only call convert_modes for
|
||||
|
@ -293,8 +293,10 @@ lex (pfile, skip_evaluation)
|
||||
{
|
||||
unsigned int chars_seen;
|
||||
|
||||
/* This is always a signed type. */
|
||||
op.unsignedp = 0;
|
||||
if (token->type == CPP_CHAR)
|
||||
op.unsignedp = 0;
|
||||
else
|
||||
op.unsignedp = WCHAR_UNSIGNED;
|
||||
op.op = CPP_NUMBER;
|
||||
op.value = cpp_interpret_charconst (pfile, token, 1, 0, &chars_seen);
|
||||
return op;
|
||||
|
18
gcc/cpplex.c
18
gcc/cpplex.c
@ -1837,6 +1837,7 @@ cpp_interpret_charconst (pfile, token, warn_multi, traditional, pchars_seen)
|
||||
unsigned int width, max_chars, c;
|
||||
unsigned HOST_WIDE_INT mask;
|
||||
HOST_WIDE_INT result = 0;
|
||||
bool unsigned_p;
|
||||
|
||||
#ifdef MULTIBYTE_CHARS
|
||||
(void) local_mbtowc (NULL, NULL, 0);
|
||||
@ -1844,9 +1845,15 @@ cpp_interpret_charconst (pfile, token, warn_multi, traditional, pchars_seen)
|
||||
|
||||
/* Width in bits. */
|
||||
if (token->type == CPP_CHAR)
|
||||
width = MAX_CHAR_TYPE_SIZE;
|
||||
{
|
||||
width = MAX_CHAR_TYPE_SIZE;
|
||||
unsigned_p = CPP_OPTION (pfile, signed_char) == 0;
|
||||
}
|
||||
else
|
||||
width = MAX_WCHAR_TYPE_SIZE;
|
||||
{
|
||||
width = MAX_WCHAR_TYPE_SIZE;
|
||||
unsigned_p = WCHAR_UNSIGNED;
|
||||
}
|
||||
|
||||
if (width < HOST_BITS_PER_WIDE_INT)
|
||||
mask = ((unsigned HOST_WIDE_INT) 1 << width) - 1;
|
||||
@ -1903,14 +1910,13 @@ cpp_interpret_charconst (pfile, token, warn_multi, traditional, pchars_seen)
|
||||
else if (chars_seen > 1 && !traditional && warn_multi)
|
||||
cpp_warning (pfile, "multi-character character constant");
|
||||
|
||||
/* If char type is signed, sign-extend the constant. */
|
||||
if (token->type == CPP_CHAR && chars_seen)
|
||||
/* If relevant type is signed, sign-extend the constant. */
|
||||
if (chars_seen)
|
||||
{
|
||||
unsigned int nbits = chars_seen * width;
|
||||
|
||||
mask = (unsigned HOST_WIDE_INT) ~0 >> (HOST_BITS_PER_WIDE_INT - nbits);
|
||||
if (CPP_OPTION (pfile, signed_char) == 0
|
||||
|| ((result >> (nbits - 1)) & 1) == 0)
|
||||
if (unsigned_p || ((result >> (nbits - 1)) & 1) == 0)
|
||||
result &= mask;
|
||||
else
|
||||
result |= ~mask;
|
||||
|
@ -1,3 +1,7 @@
|
||||
2002-02-24 Neil Booth <neil@daikokuya.demon.co.uk>
|
||||
|
||||
* testsuite/gcc.dg/cpp/wchar-1.c: New test.
|
||||
|
||||
2002-02-23 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* gcc.dg/20020222-1.c: New test.
|
||||
|
23
gcc/testsuite/gcc.dg/cpp/wchar-1.c
Normal file
23
gcc/testsuite/gcc.dg/cpp/wchar-1.c
Normal file
@ -0,0 +1,23 @@
|
||||
/* Copyright (C) 2002 Free Software Foundation, Inc. */
|
||||
|
||||
/* { dg-do run } */
|
||||
|
||||
/* Source: Neil Booth, 24 Feb 2002.
|
||||
|
||||
Test if compiler and preprocessor agree on signeness of wide
|
||||
chars. */
|
||||
|
||||
int main ()
|
||||
{
|
||||
__WCHAR_TYPE__ c = -1;
|
||||
|
||||
#if L'\x0' - 1 < 0
|
||||
if (c > 0)
|
||||
abort ();
|
||||
#else
|
||||
if (c < 0)
|
||||
abort ();
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user