]> gcc.gnu.org Git - gcc.git/blame - gcc/c-lex.c
re PR c++/4933 (tree_list not supported by dump_expr)
[gcc.git] / gcc / c-lex.c
CommitLineData
b9305c66 1/* Mainly the interface between cpplib and the C front ends.
517cbe13 2 Copyright (C) 1987, 1988, 1989, 1992, 1994, 1995, 1996, 1997
5793b276 3 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
e8bbfc4e 4
1322177d 5This file is part of GCC.
e8bbfc4e 6
1322177d
LB
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 2, or (at your option) any later
10version.
e8bbfc4e 11
1322177d
LB
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
e8bbfc4e
RK
16
17You should have received a copy of the GNU General Public License
1322177d
LB
18along with GCC; see the file COPYING. If not, write to the Free
19Software Foundation, 59 Temple Place - Suite 330, Boston, MA
2002111-1307, USA. */
e8bbfc4e 21
e9a25f70 22#include "config.h"
670ee920 23#include "system.h"
4977bab6
ZW
24#include "coretypes.h"
25#include "tm.h"
e8bbfc4e 26
11ad4784 27#include "real.h"
e8bbfc4e
RK
28#include "rtl.h"
29#include "tree.h"
eb3aaa5b 30#include "expr.h"
e8bbfc4e 31#include "input.h"
d6f4ec51 32#include "output.h"
e8bbfc4e 33#include "c-tree.h"
52dabb6c 34#include "c-common.h"
e8bbfc4e 35#include "flags.h"
0e5921e8 36#include "timevar.h"
8b97c5f8 37#include "cpplib.h"
3d6f7931 38#include "c-pragma.h"
5f6da302 39#include "toplev.h"
ab87f8c8 40#include "intl.h"
7bdb32b9 41#include "tm_p.h"
0e5921e8 42#include "splay-tree.h"
7f905405 43#include "debug.h"
ab87f8c8 44
67821e3a 45/* The current line map. */
47d89cf3 46static const struct line_map *map;
67821e3a 47
97293897
NB
48/* The line used to refresh the lineno global variable after each token. */
49static unsigned int src_lineno;
50
0e5921e8
ZW
51/* We may keep statistics about how long which files took to compile. */
52static int header_time, body_time;
53static splay_tree file_info_tree;
3ab6dd7c 54
12a39b12
JM
55#undef WCHAR_TYPE_SIZE
56#define WCHAR_TYPE_SIZE TYPE_PRECISION (wchar_type_node)
e8bbfc4e
RK
57
58/* Number of bytes in a wide character. */
59#define WCHAR_BYTES (WCHAR_TYPE_SIZE / BITS_PER_UNIT)
60
0e5921e8
ZW
61int pending_lang_change; /* If we need to switch languages - C++ only */
62int c_header_level; /* depth in C headers - C++ only */
fbb18613
JM
63
64/* Nonzero tells yylex to ignore \ in string constants. */
65static int ignore_escape_flag;
e9a25f70 66
2f6e4e97
AJ
67static tree interpret_integer (const cpp_token *, unsigned int);
68static tree interpret_float (const cpp_token *, unsigned int);
ceeedfc1 69static enum integer_type_kind
2f6e4e97 70 narrowest_unsigned_type (tree, unsigned int);
ceeedfc1 71static enum integer_type_kind
2f6e4e97
AJ
72 narrowest_signed_type (tree, unsigned int);
73static tree lex_string (const cpp_string *);
74static tree lex_charconst (const cpp_token *);
75static void update_header_times (const char *);
76static int dump_one_header (splay_tree_node, void *);
77static void cb_line_change (cpp_reader *, const cpp_token *, int);
78static void cb_ident (cpp_reader *, unsigned int, const cpp_string *);
79static void cb_def_pragma (cpp_reader *, unsigned int);
80static void cb_define (cpp_reader *, unsigned int, cpp_hashnode *);
81static void cb_undef (cpp_reader *, unsigned int, cpp_hashnode *);
e31c7eec 82\f
63973df3 83void
2f6e4e97 84init_c_lex (void)
e3d1fd32 85{
b61c5ed0 86 struct cpp_callbacks *cb;
0e5921e8
ZW
87 struct c_fileinfo *toplevel;
88
f5e99456 89 /* Set up filename timing. Must happen before cpp_read_main_file. */
0e5921e8
ZW
90 file_info_tree = splay_tree_new ((splay_tree_compare_fn)strcmp,
91 0,
92 (splay_tree_delete_value_fn)free);
a8a05998 93 toplevel = get_fileinfo ("<top level>");
0e5921e8
ZW
94 if (flag_detailed_statistics)
95 {
96 header_time = 0;
97 body_time = get_run_time ();
98 toplevel->time = body_time;
99 }
2f6e4e97 100
b61c5ed0
NB
101 cb = cpp_get_callbacks (parse_in);
102
97293897 103 cb->line_change = cb_line_change;
b61c5ed0 104 cb->ident = cb_ident;
b61c5ed0 105 cb->def_pragma = cb_def_pragma;
17211ab5
GK
106 cb->valid_pch = c_common_valid_pch;
107 cb->read_pch = c_common_read_pch;
0e5921e8 108
65289a3a
NB
109 /* Set the debug callbacks if we can use them. */
110 if (debug_info_level == DINFO_LEVEL_VERBOSE
7a0c8d71
DR
111 && (write_symbols == DWARF_DEBUG || write_symbols == DWARF2_DEBUG
112 || write_symbols == VMS_AND_DWARF2_DEBUG))
65289a3a 113 {
b61c5ed0
NB
114 cb->define = cb_define;
115 cb->undef = cb_undef;
65289a3a 116 }
e3d1fd32
PB
117}
118
0e5921e8 119struct c_fileinfo *
2f6e4e97 120get_fileinfo (const char *name)
e3d1fd32 121{
0e5921e8
ZW
122 splay_tree_node n;
123 struct c_fileinfo *fi;
124
125 n = splay_tree_lookup (file_info_tree, (splay_tree_key) name);
126 if (n)
127 return (struct c_fileinfo *) n->value;
128
129 fi = (struct c_fileinfo *) xmalloc (sizeof (struct c_fileinfo));
130 fi->time = 0;
131 fi->interface_only = 0;
132 fi->interface_unknown = 1;
133 splay_tree_insert (file_info_tree, (splay_tree_key) name,
134 (splay_tree_value) fi);
135 return fi;
e56e519d 136}
e3d1fd32 137
0e5921e8 138static void
2f6e4e97 139update_header_times (const char *name)
e8bbfc4e 140{
0e5921e8
ZW
141 /* Changing files again. This means currently collected time
142 is charged against header time, and body time starts back at 0. */
143 if (flag_detailed_statistics)
e8bbfc4e 144 {
0e5921e8
ZW
145 int this_time = get_run_time ();
146 struct c_fileinfo *file = get_fileinfo (name);
147 header_time += this_time - body_time;
148 file->time += this_time - body_time;
149 body_time = this_time;
e8bbfc4e
RK
150 }
151}
152
0e5921e8 153static int
2f6e4e97 154dump_one_header (splay_tree_node n, void *dummy ATTRIBUTE_UNUSED)
e8bbfc4e 155{
0e5921e8
ZW
156 print_time ((const char *) n->key,
157 ((struct c_fileinfo *) n->value)->time);
158 return 0;
e8bbfc4e 159}
e8bbfc4e
RK
160
161void
2f6e4e97 162dump_time_statistics (void)
e8bbfc4e 163{
0e5921e8
ZW
164 struct c_fileinfo *file = get_fileinfo (input_filename);
165 int this_time = get_run_time ();
166 file->time += this_time - body_time;
167
168 fprintf (stderr, "\n******\n");
169 print_time ("header files (total)", header_time);
170 print_time ("main file (total)", this_time - body_time);
171 fprintf (stderr, "ratio = %g : 1\n",
172 (double)header_time / (double)(this_time - body_time));
173 fprintf (stderr, "\n******\n");
174
175 splay_tree_foreach (file_info_tree, dump_one_header, 0);
e8bbfc4e 176}
a6124a42 177
0e5921e8 178static void
2f6e4e97
AJ
179cb_ident (cpp_reader *pfile ATTRIBUTE_UNUSED,
180 unsigned int line ATTRIBUTE_UNUSED,
181 const cpp_string *str ATTRIBUTE_UNUSED)
0e5921e8 182{
0e5921e8 183#ifdef ASM_OUTPUT_IDENT
27e2564a 184 if (! flag_no_ident)
0e5921e8 185 {
27e2564a 186 /* Convert escapes in the string. */
6338b358 187 tree value ATTRIBUTE_UNUSED = lex_string (str);
27e2564a 188 ASM_OUTPUT_IDENT (asm_out_file, TREE_STRING_POINTER (value));
0e5921e8
ZW
189 }
190#endif
27e2564a
NB
191}
192
97293897
NB
193/* Called at the start of every non-empty line. TOKEN is the first
194 lexed token on the line. Used for diagnostic line numbers. */
195static void
2f6e4e97
AJ
196cb_line_change (cpp_reader *pfile ATTRIBUTE_UNUSED, const cpp_token *token,
197 int parsing_args ATTRIBUTE_UNUSED)
97293897
NB
198{
199 src_lineno = SOURCE_LINE (map, token->line);
200}
201
23345bbb 202void
2f6e4e97 203fe_file_change (const struct line_map *new_map)
27e2564a 204{
47d89cf3 205 unsigned int to_line = SOURCE_LINE (new_map, new_map->to_line);
d82fc108 206
47d89cf3 207 if (new_map->reason == LC_ENTER)
fbb18613 208 {
5bea1ccf
JM
209 /* Don't stack the main buffer on the input stack;
210 we already did in compile_file. */
47d89cf3
NB
211 if (map == NULL)
212 main_input_filename = new_map->to_file;
d82fc108 213 else
0e5921e8 214 {
f78ce0b7
JB
215 int included_at = SOURCE_LINE (new_map - 1, new_map->from_line - 1);
216
d479d37f 217 input_line = included_at;
47d89cf3 218 push_srcloc (new_map->to_file, 1);
f78ce0b7 219 (*debug_hooks->start_source_file) (included_at, new_map->to_file);
27e2564a
NB
220#ifndef NO_IMPLICIT_EXTERN_C
221 if (c_header_level)
222 ++c_header_level;
47d89cf3 223 else if (new_map->sysp == 2)
27e2564a
NB
224 {
225 c_header_level = 1;
226 ++pending_lang_change;
227 }
0e5921e8 228#endif
27e2564a 229 }
fbb18613 230 }
47d89cf3 231 else if (new_map->reason == LC_LEAVE)
fbb18613 232 {
0e5921e8 233#ifndef NO_IMPLICIT_EXTERN_C
47d89cf3
NB
234 if (c_header_level && --c_header_level == 0)
235 {
236 if (new_map->sysp == 2)
237 warning ("badly nested C headers from preprocessor");
238 --pending_lang_change;
239 }
47d89cf3
NB
240#endif
241 pop_srcloc ();
2f6e4e97 242
47d89cf3 243 (*debug_hooks->end_source_file) (to_line);
e8bbfc4e 244 }
fbb18613 245
47d89cf3
NB
246 update_header_times (new_map->to_file);
247 in_system_header = new_map->sysp != 0;
248 input_filename = new_map->to_file;
d479d37f 249 input_line = to_line;
47d89cf3 250 map = new_map;
0e5921e8 251
0e5921e8
ZW
252 /* Hook for C++. */
253 extract_interface_info ();
254}
8b97c5f8
ZW
255
256static void
2f6e4e97 257cb_def_pragma (cpp_reader *pfile, unsigned int line)
8b97c5f8
ZW
258{
259 /* Issue a warning message if we have been asked to do so. Ignore
260 unknown pragmas in system headers unless an explicit
ec5c56db 261 -Wunknown-pragmas has been given. */
8b97c5f8
ZW
262 if (warn_unknown_pragmas > in_system_header)
263 {
06470238 264 const unsigned char *space, *name;
4ed5bcfb 265 const cpp_token *s;
23356f93 266
06470238 267 space = name = (const unsigned char *) "";
4ed5bcfb 268 s = cpp_get_token (pfile);
06470238
NB
269 if (s->type != CPP_EOF)
270 {
271 space = cpp_token_as_text (pfile, s);
272 s = cpp_get_token (pfile);
273 if (s->type == CPP_NAME)
274 name = cpp_token_as_text (pfile, s);
275 }
8b97c5f8 276
d479d37f 277 input_line = SOURCE_LINE (map, line);
06470238 278 warning ("ignoring #pragma %s %s", space, name);
8b97c5f8
ZW
279 }
280}
0e5921e8 281
65289a3a
NB
282/* #define callback for DWARF and DWARF2 debug info. */
283static void
2f6e4e97 284cb_define (cpp_reader *pfile, unsigned int line, cpp_hashnode *node)
65289a3a 285{
67821e3a 286 (*debug_hooks->define) (SOURCE_LINE (map, line),
7f905405 287 (const char *) cpp_macro_definition (pfile, node));
65289a3a
NB
288}
289
290/* #undef callback for DWARF and DWARF2 debug info. */
291static void
2f6e4e97
AJ
292cb_undef (cpp_reader *pfile ATTRIBUTE_UNUSED, unsigned int line,
293 cpp_hashnode *node)
65289a3a 294{
67821e3a 295 (*debug_hooks->undef) (SOURCE_LINE (map, line),
7f905405 296 (const char *) NODE_NAME (node));
65289a3a 297}
e8bbfc4e 298\f
0e5921e8 299int
2f6e4e97 300c_lex (tree *value)
fbb18613 301{
4ed5bcfb 302 const cpp_token *tok;
0e5921e8 303
6338b358 304 retry:
0e5921e8 305 timevar_push (TV_CPP);
4ed5bcfb
NB
306 do
307 tok = cpp_get_token (parse_in);
308 while (tok->type == CPP_PADDING);
0e5921e8
ZW
309 timevar_pop (TV_CPP);
310
311 /* The C++ front end does horrible things with the current line
312 number. To ensure an accurate line number, we must reset it
23356f93 313 every time we return a token. */
d479d37f 314 input_line = src_lineno;
0e5921e8
ZW
315
316 *value = NULL_TREE;
a23c9413 317 switch (tok->type)
0e5921e8 318 {
0e5921e8 319 case CPP_NAME:
4ed5bcfb 320 *value = HT_IDENT_TO_GCC_IDENT (HT_NODE (tok->val.node));
0e5921e8 321 break;
fbb18613 322
0e5921e8 323 case CPP_NUMBER:
ceeedfc1
NB
324 {
325 unsigned int flags = cpp_classify_number (parse_in, tok);
326
327 switch (flags & CPP_N_CATEGORY)
328 {
329 case CPP_N_INVALID:
330 /* cpplib has issued an error. */
e8f2b18d 331 *value = error_mark_node;
ceeedfc1
NB
332 break;
333
334 case CPP_N_INTEGER:
335 *value = interpret_integer (tok, flags);
336 break;
337
338 case CPP_N_FLOATING:
339 *value = interpret_float (tok, flags);
340 break;
341
342 default:
343 abort ();
344 }
345 }
0e5921e8 346 break;
93868d11 347
6338b358
NB
348 case CPP_OTHER:
349 {
350 cppchar_t c = tok->val.str.text[0];
351
352 if (c == '"' || c == '\'')
353 error ("missing terminating %c character", (int) c);
354 else if (ISGRAPH (c))
355 error ("stray '%c' in program", (int) c);
356 else
357 error ("stray '\\%o' in program", (int) c);
358 }
359 goto retry;
360
0e5921e8
ZW
361 case CPP_CHAR:
362 case CPP_WCHAR:
4ed5bcfb 363 *value = lex_charconst (tok);
0e5921e8 364 break;
fbb18613 365
0e5921e8
ZW
366 case CPP_STRING:
367 case CPP_WSTRING:
6338b358 368 *value = lex_string (&tok->val.str);
0e5921e8 369 break;
fbb18613 370
0e5921e8
ZW
371 /* These tokens should not be visible outside cpplib. */
372 case CPP_HEADER_NAME:
373 case CPP_COMMENT:
374 case CPP_MACRO_ARG:
0e5921e8
ZW
375 abort ();
376
377 default: break;
378 }
379
a23c9413 380 return tok->type;
0e5921e8 381}
8d9bfdc5 382
ceeedfc1
NB
383/* Returns the narrowest C-visible unsigned type, starting with the
384 minimum specified by FLAGS, that can fit VALUE, or itk_none if
385 there isn't one. */
386static enum integer_type_kind
2f6e4e97 387narrowest_unsigned_type (tree value, unsigned int flags)
0e5921e8 388{
ceeedfc1 389 enum integer_type_kind itk;
56f48ce9 390
ceeedfc1
NB
391 if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
392 itk = itk_unsigned_int;
393 else if ((flags & CPP_N_WIDTH) == CPP_N_MEDIUM)
394 itk = itk_unsigned_long;
395 else
396 itk = itk_unsigned_long_long;
e8bbfc4e 397
ceeedfc1
NB
398 /* int_fits_type_p must think the type of its first argument is
399 wider than its second argument, or it won't do the proper check. */
400 TREE_TYPE (value) = widest_unsigned_literal_type_node;
e8bbfc4e 401
ceeedfc1
NB
402 for (; itk < itk_none; itk += 2 /* skip unsigned types */)
403 if (int_fits_type_p (value, integer_types[itk]))
404 return itk;
56f48ce9 405
ceeedfc1
NB
406 return itk_none;
407}
e8bbfc4e 408
ceeedfc1
NB
409/* Ditto, but narrowest signed type. */
410static enum integer_type_kind
2f6e4e97 411narrowest_signed_type (tree value, unsigned int flags)
ceeedfc1
NB
412{
413 enum integer_type_kind itk;
e8bbfc4e 414
ceeedfc1
NB
415 if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
416 itk = itk_int;
417 else if ((flags & CPP_N_WIDTH) == CPP_N_MEDIUM)
418 itk = itk_long;
419 else
420 itk = itk_long_long;
e8bbfc4e 421
ceeedfc1
NB
422 /* int_fits_type_p must think the type of its first argument is
423 wider than its second argument, or it won't do the proper check. */
424 TREE_TYPE (value) = widest_unsigned_literal_type_node;
e8bbfc4e 425
ceeedfc1
NB
426 for (; itk < itk_none; itk += 2 /* skip signed types */)
427 if (int_fits_type_p (value, integer_types[itk]))
428 return itk;
15e5ad76 429
ceeedfc1
NB
430 return itk_none;
431}
15e5ad76 432
ceeedfc1
NB
433/* Interpret TOKEN, an integer with FLAGS as classified by cpplib. */
434static tree
2f6e4e97 435interpret_integer (const cpp_token *token, unsigned int flags)
ceeedfc1
NB
436{
437 tree value, type;
438 enum integer_type_kind itk;
439 cpp_num integer;
440 cpp_options *options = cpp_get_options (parse_in);
441
442 integer = cpp_interpret_integer (parse_in, token, flags);
443 integer = cpp_num_sign_extend (integer, options->precision);
444 value = build_int_2_wide (integer.low, integer.high);
445
446 /* The type of a constant with a U suffix is straightforward. */
447 if (flags & CPP_N_UNSIGNED)
448 itk = narrowest_unsigned_type (value, flags);
0e5921e8
ZW
449 else
450 {
ceeedfc1
NB
451 /* The type of a potentially-signed integer constant varies
452 depending on the base it's in, the standard in use, and the
453 length suffixes. */
454 enum integer_type_kind itk_u = narrowest_unsigned_type (value, flags);
455 enum integer_type_kind itk_s = narrowest_signed_type (value, flags);
456
457 /* In both C89 and C99, octal and hex constants may be signed or
458 unsigned, whichever fits tighter. We do not warn about this
459 choice differing from the traditional choice, as the constant
460 is probably a bit pattern and either way will work. */
461 if ((flags & CPP_N_RADIX) != CPP_N_DECIMAL)
462 itk = MIN (itk_u, itk_s);
463 else
0e5921e8 464 {
ceeedfc1
NB
465 /* In C99, decimal constants are always signed.
466 In C89, decimal constants that don't fit in long have
8d9afc4e 467 undefined behavior; we try to make them unsigned long.
ceeedfc1
NB
468 In GCC's extended C89, that last is true of decimal
469 constants that don't fit in long long, too. */
470
471 itk = itk_s;
472 if (itk_s > itk_u && itk_s > itk_long)
0e5921e8 473 {
ceeedfc1 474 if (!flag_isoc99)
0e5921e8 475 {
ceeedfc1
NB
476 if (itk_u < itk_unsigned_long)
477 itk_u = itk_unsigned_long;
478 itk = itk_u;
56508306 479 warning ("this decimal constant is unsigned only in ISO C90");
0e5921e8 480 }
ceeedfc1 481 else if (warn_traditional)
56508306 482 warning ("this decimal constant would be unsigned in ISO C90");
0e5921e8
ZW
483 }
484 }
ceeedfc1 485 }
56f48ce9 486
ceeedfc1
NB
487 if (itk == itk_none)
488 /* cpplib has already issued a warning for overflow. */
489 type = ((flags & CPP_N_UNSIGNED)
490 ? widest_unsigned_literal_type_node
491 : widest_integer_literal_type_node);
492 else
493 type = integer_types[itk];
e8bbfc4e 494
ceeedfc1
NB
495 if (itk > itk_unsigned_long
496 && (flags & CPP_N_WIDTH) != CPP_N_LARGE
497 && ! in_system_header && ! flag_isoc99)
498 pedwarn ("integer constant is too large for \"%s\" type",
499 (flags & CPP_N_UNSIGNED) ? "unsigned long" : "long");
0468bc75 500
ceeedfc1 501 TREE_TYPE (value) = type;
e8bbfc4e 502
ceeedfc1
NB
503 /* Convert imaginary to a complex type. */
504 if (flags & CPP_N_IMAGINARY)
505 value = build_complex (NULL_TREE, convert (type, integer_zero_node), value);
e8bbfc4e 506
ceeedfc1
NB
507 return value;
508}
e8bbfc4e 509
ceeedfc1
NB
510/* Interpret TOKEN, a floating point number with FLAGS as classified
511 by cpplib. */
512static tree
2f6e4e97 513interpret_float (const cpp_token *token, unsigned int flags)
ceeedfc1
NB
514{
515 tree type;
516 tree value;
517 REAL_VALUE_TYPE real;
518 char *copy;
519 size_t copylen;
520 const char *typename;
e8bbfc4e 521
ceeedfc1
NB
522 /* FIXME: make %T work in error/warning, then we don't need typename. */
523 if ((flags & CPP_N_WIDTH) == CPP_N_LARGE)
524 {
525 type = long_double_type_node;
526 typename = "long double";
527 }
528 else if ((flags & CPP_N_WIDTH) == CPP_N_SMALL
529 || flag_single_precision_constant)
530 {
531 type = float_type_node;
532 typename = "float";
533 }
534 else
535 {
536 type = double_type_node;
537 typename = "double";
538 }
e8bbfc4e 539
ceeedfc1
NB
540 /* Copy the constant to a nul-terminated buffer. If the constant
541 has any suffixes, cut them off; REAL_VALUE_ATOF/ REAL_VALUE_HTOF
542 can't handle them. */
543 copylen = token->val.str.len;
544 if ((flags & CPP_N_WIDTH) != CPP_N_MEDIUM)
545 /* Must be an F or L suffix. */
546 copylen--;
547 if (flags & CPP_N_IMAGINARY)
548 /* I or J suffix. */
549 copylen--;
550
551 copy = alloca (copylen + 1);
552 memcpy (copy, token->val.str.text, copylen);
553 copy[copylen] = '\0';
554
efdc7e19
RH
555 real_from_string (&real, copy);
556 real_convert (&real, TYPE_MODE (type), &real);
fbb18613 557
ceeedfc1
NB
558 /* A diagnostic is required for "soft" overflow by some ISO C
559 testsuites. This is not pedwarn, because some people don't want
560 an error for this.
561 ??? That's a dubious reason... is this a mandatory diagnostic or
562 isn't it? -- zw, 2001-08-21. */
563 if (REAL_VALUE_ISINF (real) && pedantic)
564 warning ("floating constant exceeds range of \"%s\"", typename);
fbb18613 565
ceeedfc1
NB
566 /* Create a node with determined type and value. */
567 value = build_real (type, real);
568 if (flags & CPP_N_IMAGINARY)
569 value = build_complex (NULL_TREE, convert (type, integer_zero_node), value);
e8bbfc4e 570
0e5921e8 571 return value;
0e5921e8 572}
e8bbfc4e 573
0e5921e8 574static tree
2f6e4e97 575lex_string (const cpp_string *str)
0e5921e8 576{
6338b358 577 bool wide;
0e5921e8 578 tree value;
6338b358 579 char *buf, *q;
4268e8bb 580 cppchar_t c;
6338b358 581 const unsigned char *p, *limit;
2f6e4e97 582
6338b358
NB
583 wide = str->text[0] == 'L';
584 p = str->text + 1 + wide;
585 limit = str->text + str->len - 1;
586 q = buf = alloca ((str->len + 1) * (wide ? WCHAR_BYTES : 1));
e9a25f70 587
0e5921e8
ZW
588 while (p < limit)
589 {
0e5921e8 590 c = *p++;
0e5921e8
ZW
591
592 if (c == '\\' && !ignore_escape_flag)
4268e8bb 593 c = cpp_parse_escape (parse_in, &p, limit, wide);
2f6e4e97 594
64cdc383
MH
595 /* Add this single character into the buffer either as a wchar_t,
596 a multibyte sequence, or as a single byte. */
0e5921e8
ZW
597 if (wide)
598 {
599 unsigned charwidth = TYPE_PRECISION (char_type_node);
5c80f6e6 600 unsigned bytemask = (1 << charwidth) - 1;
0e5921e8
ZW
601 int byte;
602
603 for (byte = 0; byte < WCHAR_BYTES; ++byte)
604 {
605 int n;
606 if (byte >= (int) sizeof (c))
607 n = 0;
608 else
609 n = (c >> (byte * charwidth)) & bytemask;
610 if (BYTES_BIG_ENDIAN)
611 q[WCHAR_BYTES - byte - 1] = n;
612 else
613 q[byte] = n;
614 }
615 q += WCHAR_BYTES;
616 }
617 else
618 {
619 *q++ = c;
620 }
e8bbfc4e
RK
621 }
622
0e5921e8
ZW
623 /* Terminate the string value, either with a single byte zero
624 or with a wide zero. */
e8bbfc4e 625
0e5921e8
ZW
626 if (wide)
627 {
628 memset (q, 0, WCHAR_BYTES);
629 q += WCHAR_BYTES;
630 }
631 else
632 {
633 *q++ = '\0';
634 }
635
636 value = build_string (q - buf, buf);
637
638 if (wide)
639 TREE_TYPE (value) = wchar_array_type_node;
640 else
641 TREE_TYPE (value) = char_array_type_node;
e8bbfc4e
RK
642 return value;
643}
644
c8a96070 645/* Converts a (possibly wide) character constant token into a tree. */
0e5921e8 646static tree
2f6e4e97 647lex_charconst (const cpp_token *token)
e8bbfc4e 648{
4268e8bb 649 cppchar_t result;
9340544b 650 tree type, value;
c8a96070 651 unsigned int chars_seen;
4268e8bb 652 int unsignedp;
ceeedfc1 653
a5a49440 654 result = cpp_interpret_charconst (parse_in, token,
2f6e4e97 655 &chars_seen, &unsignedp);
9340544b 656
4268e8bb
NB
657 /* Cast to cppchar_signed_t to get correct sign-extension of RESULT
658 before possibly widening to HOST_WIDE_INT for build_int_2. */
659 if (unsignedp || (cppchar_signed_t) result >= 0)
660 value = build_int_2 (result, 0);
661 else
662 value = build_int_2 ((cppchar_signed_t) result, -1);
9340544b 663
4268e8bb
NB
664 if (token->type == CPP_WCHAR)
665 type = wchar_type_node;
666 /* In C, a character constant has type 'int'.
667 In C++ 'char', but multi-char charconsts have type 'int'. */
0f7866e7 668 else if ((c_language == clk_c) || chars_seen > 1)
4268e8bb
NB
669 type = integer_type_node;
670 else
671 type = char_type_node;
9340544b 672
4268e8bb 673 TREE_TYPE (value) = type;
0e5921e8 674 return value;
e8bbfc4e 675}
This page took 1.080709 seconds and 5 git commands to generate.