diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cppexp.c | 6 | ||||
-rw-r--r-- | gcc/cpplex.c | 18 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/cpp/wchar-1.c | 23 |
5 files changed, 49 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3280349..0621754 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/cppexp.c b/gcc/cppexp.c index 1f225c3..1d4cecc 100644 --- a/gcc/cppexp.c +++ b/gcc/cppexp.c @@ -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; diff --git a/gcc/cpplex.c b/gcc/cpplex.c index 70e6280..eea6a9e 100644 --- a/gcc/cpplex.c +++ b/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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 15905e6..61dedb6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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. diff --git a/gcc/testsuite/gcc.dg/cpp/wchar-1.c b/gcc/testsuite/gcc.dg/cpp/wchar-1.c new file mode 100644 index 0000000..f93c1cd --- /dev/null +++ b/gcc/testsuite/gcc.dg/cpp/wchar-1.c @@ -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; +} |