]> gcc.gnu.org Git - gcc.git/blame - gcc/c-lex.c
gcov-io.h: Update documentation.
[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 63
2f6e4e97
AJ
64static tree interpret_integer (const cpp_token *, unsigned int);
65static tree interpret_float (const cpp_token *, unsigned int);
ceeedfc1 66static enum integer_type_kind
2f6e4e97 67 narrowest_unsigned_type (tree, unsigned int);
ceeedfc1 68static enum integer_type_kind
2f6e4e97 69 narrowest_signed_type (tree, unsigned int);
e6cc3a24 70static enum cpp_ttype lex_string (const cpp_token *, tree *, bool);
2f6e4e97
AJ
71static tree lex_charconst (const cpp_token *);
72static void update_header_times (const char *);
73static int dump_one_header (splay_tree_node, void *);
74static void cb_line_change (cpp_reader *, const cpp_token *, int);
75static void cb_ident (cpp_reader *, unsigned int, const cpp_string *);
76static void cb_def_pragma (cpp_reader *, unsigned int);
77static void cb_define (cpp_reader *, unsigned int, cpp_hashnode *);
78static void cb_undef (cpp_reader *, unsigned int, cpp_hashnode *);
e31c7eec 79\f
63973df3 80void
2f6e4e97 81init_c_lex (void)
e3d1fd32 82{
b61c5ed0 83 struct cpp_callbacks *cb;
0e5921e8
ZW
84 struct c_fileinfo *toplevel;
85
f5e99456 86 /* Set up filename timing. Must happen before cpp_read_main_file. */
0e5921e8
ZW
87 file_info_tree = splay_tree_new ((splay_tree_compare_fn)strcmp,
88 0,
89 (splay_tree_delete_value_fn)free);
a8a05998 90 toplevel = get_fileinfo ("<top level>");
0e5921e8
ZW
91 if (flag_detailed_statistics)
92 {
93 header_time = 0;
94 body_time = get_run_time ();
95 toplevel->time = body_time;
96 }
2f6e4e97 97
b61c5ed0
NB
98 cb = cpp_get_callbacks (parse_in);
99
97293897 100 cb->line_change = cb_line_change;
b61c5ed0 101 cb->ident = cb_ident;
b61c5ed0 102 cb->def_pragma = cb_def_pragma;
17211ab5
GK
103 cb->valid_pch = c_common_valid_pch;
104 cb->read_pch = c_common_read_pch;
0e5921e8 105
65289a3a
NB
106 /* Set the debug callbacks if we can use them. */
107 if (debug_info_level == DINFO_LEVEL_VERBOSE
7a0c8d71
DR
108 && (write_symbols == DWARF_DEBUG || write_symbols == DWARF2_DEBUG
109 || write_symbols == VMS_AND_DWARF2_DEBUG))
65289a3a 110 {
b61c5ed0
NB
111 cb->define = cb_define;
112 cb->undef = cb_undef;
65289a3a 113 }
e3d1fd32
PB
114}
115
0e5921e8 116struct c_fileinfo *
2f6e4e97 117get_fileinfo (const char *name)
e3d1fd32 118{
0e5921e8
ZW
119 splay_tree_node n;
120 struct c_fileinfo *fi;
121
122 n = splay_tree_lookup (file_info_tree, (splay_tree_key) name);
123 if (n)
124 return (struct c_fileinfo *) n->value;
125
126 fi = (struct c_fileinfo *) xmalloc (sizeof (struct c_fileinfo));
127 fi->time = 0;
128 fi->interface_only = 0;
129 fi->interface_unknown = 1;
130 splay_tree_insert (file_info_tree, (splay_tree_key) name,
131 (splay_tree_value) fi);
132 return fi;
e56e519d 133}
e3d1fd32 134
0e5921e8 135static void
2f6e4e97 136update_header_times (const char *name)
e8bbfc4e 137{
0e5921e8
ZW
138 /* Changing files again. This means currently collected time
139 is charged against header time, and body time starts back at 0. */
140 if (flag_detailed_statistics)
e8bbfc4e 141 {
0e5921e8
ZW
142 int this_time = get_run_time ();
143 struct c_fileinfo *file = get_fileinfo (name);
144 header_time += this_time - body_time;
145 file->time += this_time - body_time;
146 body_time = this_time;
e8bbfc4e
RK
147 }
148}
149
0e5921e8 150static int
2f6e4e97 151dump_one_header (splay_tree_node n, void *dummy ATTRIBUTE_UNUSED)
e8bbfc4e 152{
0e5921e8
ZW
153 print_time ((const char *) n->key,
154 ((struct c_fileinfo *) n->value)->time);
155 return 0;
e8bbfc4e 156}
e8bbfc4e
RK
157
158void
2f6e4e97 159dump_time_statistics (void)
e8bbfc4e 160{
0e5921e8
ZW
161 struct c_fileinfo *file = get_fileinfo (input_filename);
162 int this_time = get_run_time ();
163 file->time += this_time - body_time;
164
165 fprintf (stderr, "\n******\n");
166 print_time ("header files (total)", header_time);
167 print_time ("main file (total)", this_time - body_time);
168 fprintf (stderr, "ratio = %g : 1\n",
169 (double)header_time / (double)(this_time - body_time));
170 fprintf (stderr, "\n******\n");
171
172 splay_tree_foreach (file_info_tree, dump_one_header, 0);
e8bbfc4e 173}
a6124a42 174
0e5921e8 175static void
2f6e4e97
AJ
176cb_ident (cpp_reader *pfile ATTRIBUTE_UNUSED,
177 unsigned int line ATTRIBUTE_UNUSED,
178 const cpp_string *str ATTRIBUTE_UNUSED)
0e5921e8 179{
0e5921e8 180#ifdef ASM_OUTPUT_IDENT
27e2564a 181 if (! flag_no_ident)
0e5921e8 182 {
27e2564a 183 /* Convert escapes in the string. */
e6cc3a24
ZW
184 cpp_string cstr = { 0, 0 };
185 if (cpp_interpret_string (pfile, str, 1, &cstr, false))
186 {
187 ASM_OUTPUT_IDENT (asm_out_file, cstr.text);
188 free ((void *)cstr.text);
189 }
0e5921e8
ZW
190 }
191#endif
27e2564a
NB
192}
193
97293897
NB
194/* Called at the start of every non-empty line. TOKEN is the first
195 lexed token on the line. Used for diagnostic line numbers. */
196static void
2f6e4e97
AJ
197cb_line_change (cpp_reader *pfile ATTRIBUTE_UNUSED, const cpp_token *token,
198 int parsing_args ATTRIBUTE_UNUSED)
97293897
NB
199{
200 src_lineno = SOURCE_LINE (map, token->line);
201}
202
23345bbb 203void
2f6e4e97 204fe_file_change (const struct line_map *new_map)
27e2564a 205{
47d89cf3 206 unsigned int to_line = SOURCE_LINE (new_map, new_map->to_line);
d82fc108 207
47d89cf3 208 if (new_map->reason == LC_ENTER)
fbb18613 209 {
5bea1ccf
JM
210 /* Don't stack the main buffer on the input stack;
211 we already did in compile_file. */
47d89cf3
NB
212 if (map == NULL)
213 main_input_filename = new_map->to_file;
d82fc108 214 else
0e5921e8 215 {
f78ce0b7
JB
216 int included_at = SOURCE_LINE (new_map - 1, new_map->from_line - 1);
217
d479d37f 218 input_line = included_at;
47d89cf3 219 push_srcloc (new_map->to_file, 1);
f78ce0b7 220 (*debug_hooks->start_source_file) (included_at, new_map->to_file);
27e2564a
NB
221#ifndef NO_IMPLICIT_EXTERN_C
222 if (c_header_level)
223 ++c_header_level;
47d89cf3 224 else if (new_map->sysp == 2)
27e2564a
NB
225 {
226 c_header_level = 1;
227 ++pending_lang_change;
228 }
0e5921e8 229#endif
27e2564a 230 }
fbb18613 231 }
47d89cf3 232 else if (new_map->reason == LC_LEAVE)
fbb18613 233 {
0e5921e8 234#ifndef NO_IMPLICIT_EXTERN_C
47d89cf3
NB
235 if (c_header_level && --c_header_level == 0)
236 {
237 if (new_map->sysp == 2)
238 warning ("badly nested C headers from preprocessor");
239 --pending_lang_change;
240 }
47d89cf3
NB
241#endif
242 pop_srcloc ();
2f6e4e97 243
47d89cf3 244 (*debug_hooks->end_source_file) (to_line);
e8bbfc4e 245 }
fbb18613 246
47d89cf3
NB
247 update_header_times (new_map->to_file);
248 in_system_header = new_map->sysp != 0;
249 input_filename = new_map->to_file;
d479d37f 250 input_line = to_line;
47d89cf3 251 map = new_map;
0e5921e8 252
0e5921e8
ZW
253 /* Hook for C++. */
254 extract_interface_info ();
255}
8b97c5f8
ZW
256
257static void
2f6e4e97 258cb_def_pragma (cpp_reader *pfile, unsigned int line)
8b97c5f8
ZW
259{
260 /* Issue a warning message if we have been asked to do so. Ignore
261 unknown pragmas in system headers unless an explicit
ec5c56db 262 -Wunknown-pragmas has been given. */
8b97c5f8
ZW
263 if (warn_unknown_pragmas > in_system_header)
264 {
06470238 265 const unsigned char *space, *name;
4ed5bcfb 266 const cpp_token *s;
23356f93 267
06470238 268 space = name = (const unsigned char *) "";
4ed5bcfb 269 s = cpp_get_token (pfile);
06470238
NB
270 if (s->type != CPP_EOF)
271 {
272 space = cpp_token_as_text (pfile, s);
273 s = cpp_get_token (pfile);
274 if (s->type == CPP_NAME)
275 name = cpp_token_as_text (pfile, s);
276 }
8b97c5f8 277
d479d37f 278 input_line = SOURCE_LINE (map, line);
06470238 279 warning ("ignoring #pragma %s %s", space, name);
8b97c5f8
ZW
280 }
281}
0e5921e8 282
65289a3a
NB
283/* #define callback for DWARF and DWARF2 debug info. */
284static void
2f6e4e97 285cb_define (cpp_reader *pfile, unsigned int line, cpp_hashnode *node)
65289a3a 286{
67821e3a 287 (*debug_hooks->define) (SOURCE_LINE (map, line),
7f905405 288 (const char *) cpp_macro_definition (pfile, node));
65289a3a
NB
289}
290
291/* #undef callback for DWARF and DWARF2 debug info. */
292static void
2f6e4e97
AJ
293cb_undef (cpp_reader *pfile ATTRIBUTE_UNUSED, unsigned int line,
294 cpp_hashnode *node)
65289a3a 295{
67821e3a 296 (*debug_hooks->undef) (SOURCE_LINE (map, line),
7f905405 297 (const char *) NODE_NAME (node));
65289a3a 298}
e8bbfc4e 299\f
e6cc3a24
ZW
300static inline const cpp_token *
301get_nonpadding_token (void)
fbb18613 302{
4ed5bcfb 303 const cpp_token *tok;
0e5921e8 304 timevar_push (TV_CPP);
4ed5bcfb
NB
305 do
306 tok = cpp_get_token (parse_in);
307 while (tok->type == CPP_PADDING);
0e5921e8
ZW
308 timevar_pop (TV_CPP);
309
310 /* The C++ front end does horrible things with the current line
311 number. To ensure an accurate line number, we must reset it
e6cc3a24 312 every time we advance a token. */
d479d37f 313 input_line = src_lineno;
0e5921e8 314
e6cc3a24
ZW
315 return tok;
316}
317
318int
319c_lex (tree *value)
320{
321 const cpp_token *tok;
322 location_t atloc;
323
324 retry:
325 tok = get_nonpadding_token ();
326
327 retry_after_at:
a23c9413 328 switch (tok->type)
0e5921e8 329 {
0e5921e8 330 case CPP_NAME:
4ed5bcfb 331 *value = HT_IDENT_TO_GCC_IDENT (HT_NODE (tok->val.node));
0e5921e8 332 break;
fbb18613 333
0e5921e8 334 case CPP_NUMBER:
ceeedfc1
NB
335 {
336 unsigned int flags = cpp_classify_number (parse_in, tok);
337
338 switch (flags & CPP_N_CATEGORY)
339 {
340 case CPP_N_INVALID:
341 /* cpplib has issued an error. */
e8f2b18d 342 *value = error_mark_node;
ceeedfc1
NB
343 break;
344
345 case CPP_N_INTEGER:
346 *value = interpret_integer (tok, flags);
347 break;
348
349 case CPP_N_FLOATING:
350 *value = interpret_float (tok, flags);
351 break;
352
353 default:
354 abort ();
355 }
356 }
0e5921e8 357 break;
93868d11 358
e6cc3a24
ZW
359 case CPP_ATSIGN:
360 /* An @ may give the next token special significance in Objective-C. */
361 atloc = input_location;
362 tok = get_nonpadding_token ();
363 if (c_dialect_objc ())
364 {
365 tree val;
366 switch (tok->type)
367 {
368 case CPP_NAME:
369 val = HT_IDENT_TO_GCC_IDENT (HT_NODE (tok->val.node));
370 if (C_IS_RESERVED_WORD (val)
371 && OBJC_IS_AT_KEYWORD (C_RID_CODE (val)))
372 {
373 *value = val;
374 return CPP_AT_NAME;
375 }
376 break;
377
378 case CPP_STRING:
379 case CPP_WSTRING:
380 return lex_string (tok, value, true);
381
382 default: break;
383 }
384 }
385
386 /* ... or not. */
387 error ("%Hstray '@' in program", &atloc);
388 goto retry_after_at;
389
6338b358
NB
390 case CPP_OTHER:
391 {
392 cppchar_t c = tok->val.str.text[0];
393
394 if (c == '"' || c == '\'')
395 error ("missing terminating %c character", (int) c);
396 else if (ISGRAPH (c))
397 error ("stray '%c' in program", (int) c);
398 else
399 error ("stray '\\%o' in program", (int) c);
400 }
401 goto retry;
402
0e5921e8
ZW
403 case CPP_CHAR:
404 case CPP_WCHAR:
4ed5bcfb 405 *value = lex_charconst (tok);
0e5921e8 406 break;
fbb18613 407
0e5921e8
ZW
408 case CPP_STRING:
409 case CPP_WSTRING:
e6cc3a24 410 return lex_string (tok, value, false);
0e5921e8 411 break;
fbb18613 412
0e5921e8
ZW
413 /* These tokens should not be visible outside cpplib. */
414 case CPP_HEADER_NAME:
415 case CPP_COMMENT:
416 case CPP_MACRO_ARG:
0e5921e8
ZW
417 abort ();
418
e6cc3a24
ZW
419 default:
420 *value = NULL_TREE;
421 break;
0e5921e8
ZW
422 }
423
a23c9413 424 return tok->type;
0e5921e8 425}
8d9bfdc5 426
ceeedfc1
NB
427/* Returns the narrowest C-visible unsigned type, starting with the
428 minimum specified by FLAGS, that can fit VALUE, or itk_none if
429 there isn't one. */
430static enum integer_type_kind
2f6e4e97 431narrowest_unsigned_type (tree value, unsigned int flags)
0e5921e8 432{
ceeedfc1 433 enum integer_type_kind itk;
56f48ce9 434
ceeedfc1
NB
435 if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
436 itk = itk_unsigned_int;
437 else if ((flags & CPP_N_WIDTH) == CPP_N_MEDIUM)
438 itk = itk_unsigned_long;
439 else
440 itk = itk_unsigned_long_long;
e8bbfc4e 441
ceeedfc1
NB
442 /* int_fits_type_p must think the type of its first argument is
443 wider than its second argument, or it won't do the proper check. */
444 TREE_TYPE (value) = widest_unsigned_literal_type_node;
e8bbfc4e 445
ceeedfc1
NB
446 for (; itk < itk_none; itk += 2 /* skip unsigned types */)
447 if (int_fits_type_p (value, integer_types[itk]))
448 return itk;
56f48ce9 449
ceeedfc1
NB
450 return itk_none;
451}
e8bbfc4e 452
ceeedfc1
NB
453/* Ditto, but narrowest signed type. */
454static enum integer_type_kind
2f6e4e97 455narrowest_signed_type (tree value, unsigned int flags)
ceeedfc1
NB
456{
457 enum integer_type_kind itk;
e8bbfc4e 458
ceeedfc1
NB
459 if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
460 itk = itk_int;
461 else if ((flags & CPP_N_WIDTH) == CPP_N_MEDIUM)
462 itk = itk_long;
463 else
464 itk = itk_long_long;
e8bbfc4e 465
ceeedfc1
NB
466 /* int_fits_type_p must think the type of its first argument is
467 wider than its second argument, or it won't do the proper check. */
468 TREE_TYPE (value) = widest_unsigned_literal_type_node;
e8bbfc4e 469
ceeedfc1
NB
470 for (; itk < itk_none; itk += 2 /* skip signed types */)
471 if (int_fits_type_p (value, integer_types[itk]))
472 return itk;
15e5ad76 473
ceeedfc1
NB
474 return itk_none;
475}
15e5ad76 476
ceeedfc1
NB
477/* Interpret TOKEN, an integer with FLAGS as classified by cpplib. */
478static tree
2f6e4e97 479interpret_integer (const cpp_token *token, unsigned int flags)
ceeedfc1
NB
480{
481 tree value, type;
482 enum integer_type_kind itk;
483 cpp_num integer;
484 cpp_options *options = cpp_get_options (parse_in);
485
486 integer = cpp_interpret_integer (parse_in, token, flags);
487 integer = cpp_num_sign_extend (integer, options->precision);
488 value = build_int_2_wide (integer.low, integer.high);
489
490 /* The type of a constant with a U suffix is straightforward. */
491 if (flags & CPP_N_UNSIGNED)
492 itk = narrowest_unsigned_type (value, flags);
0e5921e8
ZW
493 else
494 {
ceeedfc1
NB
495 /* The type of a potentially-signed integer constant varies
496 depending on the base it's in, the standard in use, and the
497 length suffixes. */
498 enum integer_type_kind itk_u = narrowest_unsigned_type (value, flags);
499 enum integer_type_kind itk_s = narrowest_signed_type (value, flags);
500
501 /* In both C89 and C99, octal and hex constants may be signed or
502 unsigned, whichever fits tighter. We do not warn about this
503 choice differing from the traditional choice, as the constant
504 is probably a bit pattern and either way will work. */
505 if ((flags & CPP_N_RADIX) != CPP_N_DECIMAL)
506 itk = MIN (itk_u, itk_s);
507 else
0e5921e8 508 {
ceeedfc1
NB
509 /* In C99, decimal constants are always signed.
510 In C89, decimal constants that don't fit in long have
8d9afc4e 511 undefined behavior; we try to make them unsigned long.
ceeedfc1
NB
512 In GCC's extended C89, that last is true of decimal
513 constants that don't fit in long long, too. */
514
515 itk = itk_s;
516 if (itk_s > itk_u && itk_s > itk_long)
0e5921e8 517 {
ceeedfc1 518 if (!flag_isoc99)
0e5921e8 519 {
ceeedfc1
NB
520 if (itk_u < itk_unsigned_long)
521 itk_u = itk_unsigned_long;
522 itk = itk_u;
56508306 523 warning ("this decimal constant is unsigned only in ISO C90");
0e5921e8 524 }
ceeedfc1 525 else if (warn_traditional)
56508306 526 warning ("this decimal constant would be unsigned in ISO C90");
0e5921e8
ZW
527 }
528 }
ceeedfc1 529 }
56f48ce9 530
ceeedfc1
NB
531 if (itk == itk_none)
532 /* cpplib has already issued a warning for overflow. */
533 type = ((flags & CPP_N_UNSIGNED)
534 ? widest_unsigned_literal_type_node
535 : widest_integer_literal_type_node);
536 else
537 type = integer_types[itk];
e8bbfc4e 538
ceeedfc1
NB
539 if (itk > itk_unsigned_long
540 && (flags & CPP_N_WIDTH) != CPP_N_LARGE
541 && ! in_system_header && ! flag_isoc99)
542 pedwarn ("integer constant is too large for \"%s\" type",
543 (flags & CPP_N_UNSIGNED) ? "unsigned long" : "long");
0468bc75 544
ceeedfc1 545 TREE_TYPE (value) = type;
e8bbfc4e 546
ceeedfc1
NB
547 /* Convert imaginary to a complex type. */
548 if (flags & CPP_N_IMAGINARY)
549 value = build_complex (NULL_TREE, convert (type, integer_zero_node), value);
e8bbfc4e 550
ceeedfc1
NB
551 return value;
552}
e8bbfc4e 553
ceeedfc1
NB
554/* Interpret TOKEN, a floating point number with FLAGS as classified
555 by cpplib. */
556static tree
2f6e4e97 557interpret_float (const cpp_token *token, unsigned int flags)
ceeedfc1
NB
558{
559 tree type;
560 tree value;
561 REAL_VALUE_TYPE real;
562 char *copy;
563 size_t copylen;
564 const char *typename;
e8bbfc4e 565
ceeedfc1
NB
566 /* FIXME: make %T work in error/warning, then we don't need typename. */
567 if ((flags & CPP_N_WIDTH) == CPP_N_LARGE)
568 {
569 type = long_double_type_node;
570 typename = "long double";
571 }
572 else if ((flags & CPP_N_WIDTH) == CPP_N_SMALL
573 || flag_single_precision_constant)
574 {
575 type = float_type_node;
576 typename = "float";
577 }
578 else
579 {
580 type = double_type_node;
581 typename = "double";
582 }
e8bbfc4e 583
ceeedfc1
NB
584 /* Copy the constant to a nul-terminated buffer. If the constant
585 has any suffixes, cut them off; REAL_VALUE_ATOF/ REAL_VALUE_HTOF
586 can't handle them. */
587 copylen = token->val.str.len;
588 if ((flags & CPP_N_WIDTH) != CPP_N_MEDIUM)
589 /* Must be an F or L suffix. */
590 copylen--;
591 if (flags & CPP_N_IMAGINARY)
592 /* I or J suffix. */
593 copylen--;
594
595 copy = alloca (copylen + 1);
596 memcpy (copy, token->val.str.text, copylen);
597 copy[copylen] = '\0';
598
efdc7e19
RH
599 real_from_string (&real, copy);
600 real_convert (&real, TYPE_MODE (type), &real);
fbb18613 601
ceeedfc1
NB
602 /* A diagnostic is required for "soft" overflow by some ISO C
603 testsuites. This is not pedwarn, because some people don't want
604 an error for this.
605 ??? That's a dubious reason... is this a mandatory diagnostic or
606 isn't it? -- zw, 2001-08-21. */
607 if (REAL_VALUE_ISINF (real) && pedantic)
608 warning ("floating constant exceeds range of \"%s\"", typename);
fbb18613 609
ceeedfc1
NB
610 /* Create a node with determined type and value. */
611 value = build_real (type, real);
612 if (flags & CPP_N_IMAGINARY)
613 value = build_complex (NULL_TREE, convert (type, integer_zero_node), value);
e8bbfc4e 614
0e5921e8 615 return value;
0e5921e8 616}
e8bbfc4e 617
e6cc3a24
ZW
618/* Convert a series of STRING and/or WSTRING tokens into a tree,
619 performing string constant concatenation. TOK is the first of
620 these. VALP is the location to write the string into. OBJC_STRING
621 indicates whether an '@' token preceded the incoming token.
622 Returns the CPP token type of the result (CPP_STRING, CPP_WSTRING,
623 or CPP_OBJC_STRING).
624
625 This is unfortunately more work than it should be. If any of the
626 strings in the series has an L prefix, the result is a wide string
627 (6.4.5p4). Whether or not the result is a wide string affects the
628 meaning of octal and hexadecimal escapes (6.4.4.4p6,9). But escape
629 sequences do not continue across the boundary between two strings in
630 a series (6.4.5p7), so we must not lose the boundaries. Therefore
631 cpp_interpret_string takes a vector of cpp_string structures, which
632 we must arrange to provide. */
633
634static enum cpp_ttype
635lex_string (const cpp_token *tok, tree *valp, bool objc_string)
0e5921e8
ZW
636{
637 tree value;
e6cc3a24
ZW
638 bool wide = false;
639 size_t count = 1;
640 struct obstack str_ob;
641 cpp_string istr;
2f6e4e97 642
e6cc3a24
ZW
643 /* Try to avoid the overhead of creating and destroying an obstack
644 for the common case of just one string. */
645 cpp_string str = tok->val.str;
646 cpp_string *strs = &str;
e9a25f70 647
e6cc3a24
ZW
648 if (tok->type == CPP_WSTRING)
649 wide = true;
0e5921e8 650
e6cc3a24
ZW
651 tok = get_nonpadding_token ();
652 if (c_dialect_objc () && tok->type == CPP_ATSIGN)
653 {
654 objc_string = true;
655 tok = get_nonpadding_token ();
656 }
657 if (tok->type == CPP_STRING || tok->type == CPP_WSTRING)
658 {
659 gcc_obstack_init (&str_ob);
660 obstack_grow (&str_ob, &str, sizeof (cpp_string));
2f6e4e97 661
e6cc3a24 662 do
0e5921e8 663 {
e6cc3a24
ZW
664 count++;
665 if (tok->type == CPP_WSTRING)
666 wide = true;
667 obstack_grow (&str_ob, &tok->val.str, sizeof (cpp_string));
668
669 tok = get_nonpadding_token ();
670 if (c_dialect_objc () && tok->type == CPP_ATSIGN)
0e5921e8 671 {
e6cc3a24
ZW
672 objc_string = true;
673 tok = get_nonpadding_token ();
0e5921e8 674 }
0e5921e8 675 }
e6cc3a24
ZW
676 while (tok->type == CPP_STRING || tok->type == CPP_WSTRING);
677 strs = obstack_finish (&str_ob);
e8bbfc4e
RK
678 }
679
e6cc3a24
ZW
680 /* We have read one more token than we want. */
681 _cpp_backup_tokens (parse_in, 1);
682
683 if (count > 1 && !objc_string && warn_traditional && !in_system_header)
684 warning ("traditional C rejects string constant concatenation");
e8bbfc4e 685
e6cc3a24 686 if (cpp_interpret_string (parse_in, strs, count, &istr, wide))
0e5921e8 687 {
e6cc3a24
ZW
688 value = build_string (istr.len, (char *)istr.text);
689 free ((void *)istr.text);
0e5921e8
ZW
690 }
691 else
692 {
e6cc3a24
ZW
693 /* Callers cannot generally handle error_mark_node in this context,
694 so return the empty string instead. cpp_interpret_string has
695 issued an error. */
696 if (wide)
697 value = build_string (TYPE_PRECISION (wchar_type_node)
698 / TYPE_PRECISION (char_type_node),
699 "\0\0\0"); /* widest supported wchar_t
700 is 32 bits */
701 else
702 value = build_string (1, "");
0e5921e8
ZW
703 }
704
e6cc3a24
ZW
705 TREE_TYPE (value) = wide ? wchar_array_type_node : char_array_type_node;
706 *valp = fix_string_type (value);
0e5921e8 707
e6cc3a24
ZW
708 if (strs != &str)
709 obstack_free (&str_ob, 0);
710
711 return objc_string ? CPP_OBJC_STRING : wide ? CPP_WSTRING : CPP_STRING;
e8bbfc4e
RK
712}
713
c8a96070 714/* Converts a (possibly wide) character constant token into a tree. */
0e5921e8 715static tree
2f6e4e97 716lex_charconst (const cpp_token *token)
e8bbfc4e 717{
4268e8bb 718 cppchar_t result;
9340544b 719 tree type, value;
c8a96070 720 unsigned int chars_seen;
4268e8bb 721 int unsignedp;
ceeedfc1 722
a5a49440 723 result = cpp_interpret_charconst (parse_in, token,
2f6e4e97 724 &chars_seen, &unsignedp);
9340544b 725
4268e8bb
NB
726 /* Cast to cppchar_signed_t to get correct sign-extension of RESULT
727 before possibly widening to HOST_WIDE_INT for build_int_2. */
728 if (unsignedp || (cppchar_signed_t) result >= 0)
729 value = build_int_2 (result, 0);
730 else
731 value = build_int_2 ((cppchar_signed_t) result, -1);
9340544b 732
4268e8bb
NB
733 if (token->type == CPP_WCHAR)
734 type = wchar_type_node;
735 /* In C, a character constant has type 'int'.
736 In C++ 'char', but multi-char charconsts have type 'int'. */
37fa72e9 737 else if (!c_dialect_cxx () || chars_seen > 1)
4268e8bb
NB
738 type = integer_type_node;
739 else
740 type = char_type_node;
9340544b 741
4268e8bb 742 TREE_TYPE (value) = type;
0e5921e8 743 return value;
e8bbfc4e 744}
This page took 1.138823 seconds and 5 git commands to generate.