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
This commit is contained in:
parent
49f8e94b6b
commit
95ff5d3fad
@ -1,3 +1,8 @@
|
|||||||
|
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>
|
2002-05-06 Neil Booth <neil@daikokuya.demon.co.uk>
|
||||||
|
|
||||||
* cpplex.c (cpp_interpret_charconst): Sign-extend each
|
* cpplex.c (cpp_interpret_charconst): Sign-extend each
|
||||||
|
@ -3508,17 +3508,25 @@ same column as it did in the original source file.
|
|||||||
|
|
||||||
@item The numeric value of character constants in preprocessor expressions.
|
@item The numeric value of character constants in preprocessor expressions.
|
||||||
|
|
||||||
The preprocessor and compiler interpret character constants in the same
|
The preprocessor and compiler interpret character constants in the
|
||||||
way; escape sequences such as @samp{\a} are given the values they would
|
same way; i.e.@: escape sequences such as @samp{\a} are given the
|
||||||
have on the target machine.
|
values they would have on the target machine.
|
||||||
|
|
||||||
Multi-character character constants are interpreted a character at a
|
Multi-character character constants are interpreted a character at a
|
||||||
time, shifting the previous result left by the number of bits per
|
time, shifting the previous result left by the number of bits per
|
||||||
character on the host, and adding the new character. For example, 'ab'
|
target character and adding the sign-extended value of the new
|
||||||
on an 8-bit host would be interpreted as @w{'a' * 256 + 'b'}. If there
|
character. They have type @code{int}, and are treated as signed
|
||||||
are more characters in the constant than can fit in the widest native
|
regardless of whether single characters are signed or not. If there
|
||||||
integer type on the host, usually a @code{long}, the excess characters
|
are more characters in the constant than would fit in the target
|
||||||
are ignored and a diagnostic is given.
|
@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.
|
@item Source file inclusion.
|
||||||
|
|
||||||
|
@ -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>
|
2002-05-05 Neil Booth <neil@daikokuya.demon.co.uk>
|
||||||
|
|
||||||
* gcc.dg/cpp/charconst.c: Update tests.
|
* gcc.dg/cpp/charconst.c: Update tests.
|
||||||
|
40
gcc/testsuite/gcc.dg/cpp/charconst-3.c
Normal file
40
gcc/testsuite/gcc.dg/cpp/charconst-3.c
Normal file
@ -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;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user