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