diff options
author | Neil Booth <neil@daikokuya.demon.co.uk> | 2002-05-05 23:45:06 +0000 |
---|---|---|
committer | Neil Booth <neil@gcc.gnu.org> | 2002-05-05 23:45:06 +0000 |
commit | 95ff5d3fad7df3df18c91b3c834d983c52b62423 (patch) | |
tree | 27ed18362e6bd785c6d3ea6203ba7a5e06584f42 | |
parent | 49f8e94b6b09740703b9410dbd6efc2bd14a19e6 (diff) | |
download | gcc-95ff5d3fad7df3df18c91b3c834d983c52b62423.zip gcc-95ff5d3fad7df3df18c91b3c834d983c52b62423.tar.gz gcc-95ff5d3fad7df3df18c91b3c834d983c52b62423.tar.bz2 |
cpp.texi: Update multichar charconst docs.
doc:
* cpp.texi: Update multichar charconst docs.
testsuite:
* gcc.dg/cpp/charconst-3.c: New test.
From-SVN: r53202
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/doc/cpp.texi | 24 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/cpp/charconst-3.c | 40 |
4 files changed, 65 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8d2de30..91effc8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2002-05-06 Neil Booth <neil@daikokuya.demon.co.uk> +doc: + * cpp.texi: Update multichar charconst docs. + +2002-05-06 Neil Booth <neil@daikokuya.demon.co.uk> + * cpplex.c (cpp_interpret_charconst): Sign-extend each character. Don't ignore excess characters. Treat multicharacter character constants as signed. diff --git a/gcc/doc/cpp.texi b/gcc/doc/cpp.texi index 260efdc..7ba498d 100644 --- a/gcc/doc/cpp.texi +++ b/gcc/doc/cpp.texi @@ -3508,17 +3508,25 @@ same column as it did in the original source file. @item The numeric value of character constants in preprocessor expressions. -The preprocessor and compiler interpret character constants in the same -way; escape sequences such as @samp{\a} are given the values they would -have on the target machine. +The preprocessor and compiler interpret character constants in the +same way; i.e.@: escape sequences such as @samp{\a} are given the +values they would have on the target machine. Multi-character character constants are interpreted a character at a time, shifting the previous result left by the number of bits per -character on the host, and adding the new character. For example, 'ab' -on an 8-bit host would be interpreted as @w{'a' * 256 + 'b'}. If there -are more characters in the constant than can fit in the widest native -integer type on the host, usually a @code{long}, the excess characters -are ignored and a diagnostic is given. +target character and adding the sign-extended value of the new +character. They have type @code{int}, and are treated as signed +regardless of whether single characters are signed or not. If there +are more characters in the constant than would fit in the target +@code{int}, a diagnostic is given, and the excess leading characters +are ignored. This methodology is not fully compatible with versions +3.1 and earlier of GCC, which used a confusing and inconsistent +valuation technique. + +For example, 'ab' for a target with an 8-bit @code{char} would be +interpreted as @w{'a' * 256 + 'b'}, and 'a\234' as @w{'a' * 256 + +'\234'}. GCC 3.1 and earlier would give a different value for the +latter example, probably @w{'a' * 256 + (unsigned char) '\234'}. @item Source file inclusion. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 29463de..7bb4ca5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2002-05-06 Neil Booth <neil@daikokuya.demon.co.uk> + + * gcc.dg/cpp/charconst-3.c: New test. + 2002-05-05 Neil Booth <neil@daikokuya.demon.co.uk> * gcc.dg/cpp/charconst.c: Update tests. diff --git a/gcc/testsuite/gcc.dg/cpp/charconst-3.c b/gcc/testsuite/gcc.dg/cpp/charconst-3.c new file mode 100644 index 0000000..86fcf78 --- /dev/null +++ b/gcc/testsuite/gcc.dg/cpp/charconst-3.c @@ -0,0 +1,40 @@ +/* Copyright (C) 2001 Free Software Foundation, Inc. */ + +/* { dg-do compile } */ +/* { dg-options -Wno-multichar } */ + +/* This tests values and signedness of multichar charconsts. + + Neil Booth, 5 May 2002. */ + +#include <limits.h> + +int main () +{ + /* These tests require at least 2-byte ints. 8-) */ +#if INT_MAX > 127 + int scale = (int) (unsigned char) -1 + 1; + + if ('ab' != ('a' * scale + 'b')) + abort (); + + if ('\234b' != ('\234' * scale + 'b')) + abort (); + + if ('b\234' != ('b' * scale + '\234')) + abort (); + + /* Multichar charconsts have type int and should be signed. */ +#if INT_MAX == 32767 + if ('\234a' > 0) + abort (); +#elif INT_MAX == 2147483647 + if ('\234aaa' > 0) + abort (); +#elif INT_MAX == 9223372036854775807 + if ('\234aaaaaaa' > 0) + abort (); +#endif +#endif + return 0; +} |