diff options
author | Neil Booth <neil@daikokuya.demon.co.uk> | 2002-05-04 07:30:32 +0000 |
---|---|---|
committer | Neil Booth <neil@gcc.gnu.org> | 2002-05-04 07:30:32 +0000 |
commit | 4268e8bb9408758c1c97b6e821ab4c599d794808 (patch) | |
tree | 39e01f86f161ea393ce56f05f0c0a0264050f332 /gcc/cppinit.c | |
parent | ac5ec76848ad9634ba9cb93379c3011ebad22c4f (diff) | |
download | gcc-4268e8bb9408758c1c97b6e821ab4c599d794808.zip gcc-4268e8bb9408758c1c97b6e821ab4c599d794808.tar.gz gcc-4268e8bb9408758c1c97b6e821ab4c599d794808.tar.bz2 |
c-lex.c (lex_string): Let cpp_parse_escape handles truncation and sign-extension.
* c-lex.c (lex_string): Let cpp_parse_escape handles truncation
and sign-extension.
(lex_charconst): Update for change in prototype of
cpp_interpret_charconst. Extend from cppchar_t to HOST_WIDE_INT
appropriately.
* cpphash.h (BITS_PER_CPPCHAR_T): New.
* cppinit.c (cpp_create_reader): Initialize them for no
change in semantics.
(cpp_post_options): Add sanity checks.
* cpplex.c (cpp_parse_escape): Handle precision, sign-extension
and truncation issues. Calculate in type cppchar_t.
(MAX_CHAR_TYPE_SIZE, MAX_WCHAR_TYPE_SIZE): Remove.
(cpp_interpret_charconst): Calculate in type cppchar_t. Handle
run-time dependent precision correctly. Return whether the
result is signed or not.
* cpplib.c (dequote_string): Use cppchar_t; update.
* cpplib.h (cppchar_signed_t): New.
struct cpp_options): New precision members.
(cpp_interpret_charconst, cpp_parse_escape): Update prototypes.
From-SVN: r53152
Diffstat (limited to 'gcc/cppinit.c')
-rw-r--r-- | gcc/cppinit.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/gcc/cppinit.c b/gcc/cppinit.c index cee7571..cb5b263 100644 --- a/gcc/cppinit.c +++ b/gcc/cppinit.c @@ -502,6 +502,18 @@ cpp_create_reader (lang) CPP_OPTION (pfile, pending) = (struct cpp_pending *) xcalloc (1, sizeof (struct cpp_pending)); + /* CPP arithmetic done to existing rules for now. */ +#define BITS_PER_HOST_WIDEST_INT (CHAR_BIT * sizeof (HOST_WIDEST_INT)) + CPP_OPTION (pfile, precision) = BITS_PER_HOST_WIDEST_INT; +#ifndef MAX_CHAR_TYPE_SIZE +#define MAX_CHAR_TYPE_SIZE CHAR_TYPE_SIZE +#endif + CPP_OPTION (pfile, char_precision) = MAX_CHAR_TYPE_SIZE; +#ifndef MAX_WCHAR_TYPE_SIZE +#define MAX_WCHAR_TYPE_SIZE WCHAR_TYPE_SIZE +#endif + CPP_OPTION (pfile, wchar_precision) = MAX_WCHAR_TYPE_SIZE; + /* It's simplest to just create this struct whether or not it will be needed. */ pfile->deps = deps_init (); @@ -1796,6 +1808,27 @@ cpp_post_options (pfile) fputc ('\n', stderr); } +#if ENABLE_CHECKING + /* Sanity checks for CPP arithmetic. */ + if (CPP_OPTION (pfile, precision) > BITS_PER_HOST_WIDEST_INT) + cpp_error (pfile, DL_FATAL, + "preprocessor arithmetic has maximum precision of %u bits; target requires %u bits", + BITS_PER_HOST_WIDEST_INT, CPP_OPTION (pfile, precision)); + + if (CPP_OPTION (pfile, char_precision) > BITS_PER_CPPCHAR_T + || CPP_OPTION (pfile, wchar_precision) > BITS_PER_CPPCHAR_T) + cpp_error (pfile, DL_FATAL, + "CPP cannot handle (wide) character constants over %u bits", + BITS_PER_CPPCHAR_T); + + { + cppchar_t test = 0; + test--; + if (test < 1) + cpp_error (pfile, DL_FATAL, "cppchar_t must be an unsigned type"); + } +#endif + /* Canonicalize in_fname and out_fname. We guarantee they are not NULL, and that the empty string represents stdin / stdout. */ if (CPP_OPTION (pfile, in_fname) == NULL |