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