]> gcc.gnu.org Git - gcc.git/blame - gcc/c-lex.c
exgettext: Handle gmsgid and cmsgid arguments specially, as gcc-internal-format and...
[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
d4ff96d5
KH
3 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
4 Free Software Foundation, Inc.
e8bbfc4e 5
1322177d 6This file is part of GCC.
e8bbfc4e 7
1322177d
LB
8GCC is free software; you can redistribute it and/or modify it under
9the terms of the GNU General Public License as published by the Free
10Software Foundation; either version 2, or (at your option) any later
11version.
e8bbfc4e 12
1322177d
LB
13GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14WARRANTY; without even the implied warranty of MERCHANTABILITY or
15FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16for more details.
e8bbfc4e
RK
17
18You should have received a copy of the GNU General Public License
1322177d
LB
19along with GCC; see the file COPYING. If not, write to the Free
20Software Foundation, 59 Temple Place - Suite 330, Boston, MA
2102111-1307, USA. */
e8bbfc4e 22
e9a25f70 23#include "config.h"
670ee920 24#include "system.h"
4977bab6
ZW
25#include "coretypes.h"
26#include "tm.h"
e8bbfc4e 27
11ad4784 28#include "real.h"
e8bbfc4e
RK
29#include "rtl.h"
30#include "tree.h"
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
0e5921e8
ZW
45/* We may keep statistics about how long which files took to compile. */
46static int header_time, body_time;
47static splay_tree file_info_tree;
3ab6dd7c 48
0e5921e8
ZW
49int pending_lang_change; /* If we need to switch languages - C++ only */
50int c_header_level; /* depth in C headers - C++ only */
0173bb6f
AO
51
52/* If we need to translate characters received. This is tri-state:
53 0 means use only the untranslated string; 1 means use only
54 the translated string; -1 means chain the translated string
55 to the untranslated one. */
56int c_lex_string_translate = 1;
fbb18613 57
c162c75e
MA
58/* True if strings should be passed to the caller of c_lex completely
59 unmolested (no concatenation, no translation). */
60bool c_lex_return_raw_strings = false;
61
2f6e4e97
AJ
62static tree interpret_integer (const cpp_token *, unsigned int);
63static tree interpret_float (const cpp_token *, unsigned int);
5e9754af
NS
64static enum integer_type_kind narrowest_unsigned_type
65 (unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT, unsigned int);
66static enum integer_type_kind narrowest_signed_type
67 (unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT, unsigned int);
e6cc3a24 68static enum cpp_ttype lex_string (const cpp_token *, tree *, bool);
2f6e4e97
AJ
69static tree lex_charconst (const cpp_token *);
70static void update_header_times (const char *);
71static int dump_one_header (splay_tree_node, void *);
72static void cb_line_change (cpp_reader *, const cpp_token *, int);
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
5d709b00
ZW
84 /* The get_fileinfo data structure must be initialized before
85 cpp_read_main_file is called. */
a8a05998 86 toplevel = get_fileinfo ("<top level>");
0e5921e8
ZW
87 if (flag_detailed_statistics)
88 {
89 header_time = 0;
90 body_time = get_run_time ();
91 toplevel->time = body_time;
92 }
2f6e4e97 93
b61c5ed0
NB
94 cb = cpp_get_callbacks (parse_in);
95
97293897 96 cb->line_change = cb_line_change;
b61c5ed0 97 cb->ident = cb_ident;
b61c5ed0 98 cb->def_pragma = cb_def_pragma;
17211ab5
GK
99 cb->valid_pch = c_common_valid_pch;
100 cb->read_pch = c_common_read_pch;
0e5921e8 101
65289a3a
NB
102 /* Set the debug callbacks if we can use them. */
103 if (debug_info_level == DINFO_LEVEL_VERBOSE
f8ca7e49 104 && (write_symbols == DWARF2_DEBUG
7a0c8d71 105 || write_symbols == VMS_AND_DWARF2_DEBUG))
65289a3a 106 {
b61c5ed0
NB
107 cb->define = cb_define;
108 cb->undef = cb_undef;
65289a3a 109 }
e3d1fd32
PB
110}
111
0e5921e8 112struct c_fileinfo *
2f6e4e97 113get_fileinfo (const char *name)
e3d1fd32 114{
0e5921e8
ZW
115 splay_tree_node n;
116 struct c_fileinfo *fi;
117
5d709b00 118 if (!file_info_tree)
3f75a254 119 file_info_tree = splay_tree_new ((splay_tree_compare_fn) strcmp,
5d709b00 120 0,
3f75a254 121 (splay_tree_delete_value_fn) free);
5d709b00 122
0e5921e8
ZW
123 n = splay_tree_lookup (file_info_tree, (splay_tree_key) name);
124 if (n)
125 return (struct c_fileinfo *) n->value;
126
5d038c4c 127 fi = XNEW (struct c_fileinfo);
0e5921e8
ZW
128 fi->time = 0;
129 fi->interface_only = 0;
130 fi->interface_unknown = 1;
131 splay_tree_insert (file_info_tree, (splay_tree_key) name,
132 (splay_tree_value) fi);
133 return fi;
e56e519d 134}
e3d1fd32 135
0e5921e8 136static void
2f6e4e97 137update_header_times (const char *name)
e8bbfc4e 138{
0e5921e8
ZW
139 /* Changing files again. This means currently collected time
140 is charged against header time, and body time starts back at 0. */
141 if (flag_detailed_statistics)
e8bbfc4e 142 {
0e5921e8
ZW
143 int this_time = get_run_time ();
144 struct c_fileinfo *file = get_fileinfo (name);
145 header_time += this_time - body_time;
146 file->time += this_time - body_time;
147 body_time = this_time;
e8bbfc4e
RK
148 }
149}
150
0e5921e8 151static int
e18476eb 152dump_one_header (splay_tree_node n, void * ARG_UNUSED (dummy))
e8bbfc4e 153{
0e5921e8
ZW
154 print_time ((const char *) n->key,
155 ((struct c_fileinfo *) n->value)->time);
156 return 0;
e8bbfc4e 157}
e8bbfc4e
RK
158
159void
2f6e4e97 160dump_time_statistics (void)
e8bbfc4e 161{
0e5921e8
ZW
162 struct c_fileinfo *file = get_fileinfo (input_filename);
163 int this_time = get_run_time ();
164 file->time += this_time - body_time;
165
166 fprintf (stderr, "\n******\n");
167 print_time ("header files (total)", header_time);
168 print_time ("main file (total)", this_time - body_time);
169 fprintf (stderr, "ratio = %g : 1\n",
3f75a254 170 (double) header_time / (double) (this_time - body_time));
0e5921e8
ZW
171 fprintf (stderr, "\n******\n");
172
173 splay_tree_foreach (file_info_tree, dump_one_header, 0);
e8bbfc4e 174}
a6124a42 175
0e5921e8 176static void
e18476eb
BI
177cb_ident (cpp_reader * ARG_UNUSED (pfile),
178 unsigned int ARG_UNUSED (line),
179 const cpp_string * ARG_UNUSED (str))
0e5921e8 180{
0e5921e8 181#ifdef ASM_OUTPUT_IDENT
3f75a254 182 if (!flag_no_ident)
0e5921e8 183 {
27e2564a 184 /* Convert escapes in the string. */
e6cc3a24
ZW
185 cpp_string cstr = { 0, 0 };
186 if (cpp_interpret_string (pfile, str, 1, &cstr, false))
187 {
d0974745 188 ASM_OUTPUT_IDENT (asm_out_file, (const char *) cstr.text);
3f75a254 189 free ((void *) cstr.text);
e6cc3a24 190 }
0e5921e8
ZW
191 }
192#endif
27e2564a
NB
193}
194
97293897
NB
195/* Called at the start of every non-empty line. TOKEN is the first
196 lexed token on the line. Used for diagnostic line numbers. */
197static void
e18476eb 198cb_line_change (cpp_reader * ARG_UNUSED (pfile), const cpp_token *token,
7b9a5a66 199 int parsing_args)
97293897 200{
12f9df4e 201 if (token->type != CPP_EOF && !parsing_args)
3c20847b
PB
202#ifdef USE_MAPPED_LOCATION
203 input_location = token->src_loc;
204#else
12f9df4e
PB
205 {
206 source_location loc = token->src_loc;
207 const struct line_map *map = linemap_lookup (&line_table, loc);
208 input_line = SOURCE_LINE (map, loc);
209 }
3c20847b 210#endif
97293897
NB
211}
212
23345bbb 213void
2f6e4e97 214fe_file_change (const struct line_map *new_map)
27e2564a 215{
f4b2bde7 216 if (new_map == NULL)
12f9df4e 217 return;
f4b2bde7 218
47d89cf3 219 if (new_map->reason == LC_ENTER)
fbb18613 220 {
5bea1ccf
JM
221 /* Don't stack the main buffer on the input stack;
222 we already did in compile_file. */
3f75a254 223 if (!MAIN_FILE_P (new_map))
0e5921e8 224 {
3c20847b
PB
225#ifdef USE_MAPPED_LOCATION
226 int included_at = LAST_SOURCE_LINE_LOCATION (new_map - 1);
227
228 input_location = included_at;
229 push_srcloc (new_map->start_location);
230#else
12f9df4e 231 int included_at = LAST_SOURCE_LINE (new_map - 1);
f78ce0b7 232
d479d37f 233 input_line = included_at;
47d89cf3 234 push_srcloc (new_map->to_file, 1);
3c20847b 235#endif
f78ce0b7 236 (*debug_hooks->start_source_file) (included_at, new_map->to_file);
27e2564a
NB
237#ifndef NO_IMPLICIT_EXTERN_C
238 if (c_header_level)
239 ++c_header_level;
47d89cf3 240 else if (new_map->sysp == 2)
27e2564a
NB
241 {
242 c_header_level = 1;
243 ++pending_lang_change;
244 }
0e5921e8 245#endif
27e2564a 246 }
fbb18613 247 }
47d89cf3 248 else if (new_map->reason == LC_LEAVE)
fbb18613 249 {
0e5921e8 250#ifndef NO_IMPLICIT_EXTERN_C
47d89cf3
NB
251 if (c_header_level && --c_header_level == 0)
252 {
253 if (new_map->sysp == 2)
d4ee4d25 254 warning (0, "badly nested C headers from preprocessor");
47d89cf3
NB
255 --pending_lang_change;
256 }
47d89cf3
NB
257#endif
258 pop_srcloc ();
2f6e4e97 259
70b16073 260 (*debug_hooks->end_source_file) (new_map->to_line);
e8bbfc4e 261 }
fbb18613 262
47d89cf3
NB
263 update_header_times (new_map->to_file);
264 in_system_header = new_map->sysp != 0;
3c20847b
PB
265#ifdef USE_MAPPED_LOCATION
266 input_location = new_map->start_location;
267#else
47d89cf3 268 input_filename = new_map->to_file;
70b16073 269 input_line = new_map->to_line;
3c20847b 270#endif
0e5921e8 271}
8b97c5f8
ZW
272
273static void
12f9df4e 274cb_def_pragma (cpp_reader *pfile, source_location loc)
8b97c5f8
ZW
275{
276 /* Issue a warning message if we have been asked to do so. Ignore
277 unknown pragmas in system headers unless an explicit
ec5c56db 278 -Wunknown-pragmas has been given. */
8b97c5f8
ZW
279 if (warn_unknown_pragmas > in_system_header)
280 {
b6ff777c
ZW
281 const unsigned char *space, *name;
282 const cpp_token *s;
3c20847b 283#ifndef USE_MAPPED_LOCATION
b6ff777c 284 location_t fe_loc;
12f9df4e 285 const struct line_map *map = linemap_lookup (&line_table, loc);
b6ff777c
ZW
286 fe_loc.file = map->to_file;
287 fe_loc.line = SOURCE_LINE (map, loc);
288#else
289 location_t fe_loc = loc;
3c20847b 290#endif
23356f93 291
06470238 292 space = name = (const unsigned char *) "";
4ed5bcfb 293 s = cpp_get_token (pfile);
06470238
NB
294 if (s->type != CPP_EOF)
295 {
296 space = cpp_token_as_text (pfile, s);
297 s = cpp_get_token (pfile);
298 if (s->type == CPP_NAME)
299 name = cpp_token_as_text (pfile, s);
300 }
8b97c5f8 301
d4ee4d25 302 warning (0, "%Hignoring #pragma %s %s", &fe_loc, space, name);
8b97c5f8
ZW
303 }
304}
0e5921e8 305
65289a3a
NB
306/* #define callback for DWARF and DWARF2 debug info. */
307static void
12f9df4e 308cb_define (cpp_reader *pfile, source_location loc, cpp_hashnode *node)
65289a3a 309{
12f9df4e
PB
310 const struct line_map *map = linemap_lookup (&line_table, loc);
311 (*debug_hooks->define) (SOURCE_LINE (map, loc),
7f905405 312 (const char *) cpp_macro_definition (pfile, node));
65289a3a
NB
313}
314
315/* #undef callback for DWARF and DWARF2 debug info. */
316static void
e18476eb 317cb_undef (cpp_reader * ARG_UNUSED (pfile), source_location loc,
2f6e4e97 318 cpp_hashnode *node)
65289a3a 319{
12f9df4e
PB
320 const struct line_map *map = linemap_lookup (&line_table, loc);
321 (*debug_hooks->undef) (SOURCE_LINE (map, loc),
7f905405 322 (const char *) NODE_NAME (node));
65289a3a 323}
e8bbfc4e 324\f
51e63e60
NS
325/* Read a token and return its type. Fill *VALUE with its value, if
326 applicable. Fill *CPP_FLAGS with the token's flags, if it is
327 non-NULL. */
e6cc3a24 328
f4086145 329enum cpp_ttype
6037d88d 330c_lex_with_flags (tree *value, location_t *loc, unsigned char *cpp_flags)
e6cc3a24 331{
18c81520 332 static bool no_more_pch;
51e63e60
NS
333 const cpp_token *tok;
334 enum cpp_ttype type;
e6cc3a24 335
51e63e60 336 timevar_push (TV_CPP);
e6cc3a24 337 retry:
51e63e60
NS
338 tok = cpp_get_token (parse_in);
339 type = tok->type;
340
e6cc3a24 341 retry_after_at:
6037d88d
PB
342#ifdef USE_MAPPED_LOCATION
343 *loc = tok->src_loc;
344#else
345 *loc = input_location;
346#endif
51e63e60 347 switch (type)
0e5921e8 348 {
51e63e60
NS
349 case CPP_PADDING:
350 goto retry;
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. */
e6cc3a24
ZW
383 if (c_dialect_objc ())
384 {
51e63e60
NS
385 location_t atloc = input_location;
386
387 retry_at:
388 tok = cpp_get_token (parse_in);
389 type = tok->type;
390 switch (type)
e6cc3a24 391 {
51e63e60
NS
392 case CPP_PADDING:
393 goto retry_at;
394
395 case CPP_STRING:
396 case CPP_WSTRING:
397 type = lex_string (tok, value, true);
398 break;
399
e6cc3a24 400 case CPP_NAME:
51e63e60
NS
401 *value = HT_IDENT_TO_GCC_IDENT (HT_NODE (tok->val.node));
402 if (objc_is_reserved_word (*value))
e6cc3a24 403 {
51e63e60
NS
404 type = CPP_AT_NAME;
405 break;
e6cc3a24 406 }
51e63e60 407 /* FALLTHROUGH */
e6cc3a24 408
51e63e60
NS
409 default:
410 /* ... or not. */
411 error ("%Hstray %<@%> in program", &atloc);
412 goto retry_after_at;
e6cc3a24 413 }
51e63e60 414 break;
e6cc3a24
ZW
415 }
416
51e63e60
NS
417 /* FALLTHROUGH */
418 case CPP_HASH:
419 case CPP_PASTE:
420 {
421 unsigned char name[4];
422
47e20491 423 *cpp_spell_token (parse_in, tok, name, true) = 0;
51e63e60
NS
424
425 error ("stray %qs in program", name);
426 }
427
428 goto retry;
e6cc3a24 429
6338b358
NB
430 case CPP_OTHER:
431 {
432 cppchar_t c = tok->val.str.text[0];
433
434 if (c == '"' || c == '\'')
435 error ("missing terminating %c character", (int) c);
436 else if (ISGRAPH (c))
51e63e60 437 error ("stray %qc in program", (int) c);
6338b358 438 else
51e63e60 439 error ("stray %<\\%o%> in program", (int) c);
6338b358
NB
440 }
441 goto retry;
442
0e5921e8
ZW
443 case CPP_CHAR:
444 case CPP_WCHAR:
4ed5bcfb 445 *value = lex_charconst (tok);
0e5921e8 446 break;
fbb18613 447
0e5921e8
ZW
448 case CPP_STRING:
449 case CPP_WSTRING:
c162c75e 450 if (!c_lex_return_raw_strings)
51e63e60
NS
451 {
452 type = lex_string (tok, value, false);
453 break;
454 }
455
456 /* FALLTHROUGH */
c162c75e
MA
457
458 case CPP_PRAGMA:
3f75a254 459 *value = build_string (tok->val.str.len, (char *) tok->val.str.text);
0e5921e8 460 break;
fbb18613 461
0e5921e8
ZW
462 /* These tokens should not be visible outside cpplib. */
463 case CPP_HEADER_NAME:
464 case CPP_COMMENT:
465 case CPP_MACRO_ARG:
366de0ce 466 gcc_unreachable ();
0e5921e8 467
e6cc3a24
ZW
468 default:
469 *value = NULL_TREE;
470 break;
0e5921e8
ZW
471 }
472
51e63e60
NS
473 if (cpp_flags)
474 *cpp_flags = tok->flags;
475
3f75a254 476 if (!no_more_pch)
18c81520
GK
477 {
478 no_more_pch = true;
479 c_common_no_more_pch ();
480 }
51e63e60
NS
481
482 timevar_pop (TV_CPP);
483
484 return type;
0e5921e8 485}
8d9bfdc5 486
f4086145 487enum cpp_ttype
7625e73d
GB
488c_lex (tree *value)
489{
6037d88d
PB
490 location_t loc;
491 return c_lex_with_flags (value, &loc, NULL);
7625e73d
GB
492}
493
ceeedfc1 494/* Returns the narrowest C-visible unsigned type, starting with the
5e9754af 495 minimum specified by FLAGS, that can fit HIGH:LOW, or itk_none if
ceeedfc1 496 there isn't one. */
5e9754af 497
ceeedfc1 498static enum integer_type_kind
5e9754af
NS
499narrowest_unsigned_type (unsigned HOST_WIDE_INT low,
500 unsigned HOST_WIDE_INT high,
501 unsigned int flags)
0e5921e8 502{
ceeedfc1 503 enum integer_type_kind itk;
56f48ce9 504
ceeedfc1
NB
505 if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
506 itk = itk_unsigned_int;
507 else if ((flags & CPP_N_WIDTH) == CPP_N_MEDIUM)
508 itk = itk_unsigned_long;
509 else
510 itk = itk_unsigned_long_long;
e8bbfc4e 511
ceeedfc1 512 for (; itk < itk_none; itk += 2 /* skip unsigned types */)
5e9754af
NS
513 {
514 tree upper = TYPE_MAX_VALUE (integer_types[itk]);
515
3f75a254
JM
516 if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (upper) > high
517 || ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (upper) == high
5e9754af
NS
518 && TREE_INT_CST_LOW (upper) >= low))
519 return itk;
520 }
56f48ce9 521
ceeedfc1
NB
522 return itk_none;
523}
e8bbfc4e 524
ceeedfc1
NB
525/* Ditto, but narrowest signed type. */
526static enum integer_type_kind
5e9754af
NS
527narrowest_signed_type (unsigned HOST_WIDE_INT low,
528 unsigned HOST_WIDE_INT high, unsigned int flags)
ceeedfc1
NB
529{
530 enum integer_type_kind itk;
e8bbfc4e 531
ceeedfc1
NB
532 if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
533 itk = itk_int;
534 else if ((flags & CPP_N_WIDTH) == CPP_N_MEDIUM)
535 itk = itk_long;
536 else
537 itk = itk_long_long;
e8bbfc4e 538
e8bbfc4e 539
ceeedfc1 540 for (; itk < itk_none; itk += 2 /* skip signed types */)
5e9754af
NS
541 {
542 tree upper = TYPE_MAX_VALUE (integer_types[itk]);
543
3f75a254
JM
544 if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (upper) > high
545 || ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (upper) == high
5e9754af
NS
546 && TREE_INT_CST_LOW (upper) >= low))
547 return itk;
548 }
15e5ad76 549
ceeedfc1
NB
550 return itk_none;
551}
15e5ad76 552
ceeedfc1
NB
553/* Interpret TOKEN, an integer with FLAGS as classified by cpplib. */
554static tree
2f6e4e97 555interpret_integer (const cpp_token *token, unsigned int flags)
ceeedfc1
NB
556{
557 tree value, type;
558 enum integer_type_kind itk;
559 cpp_num integer;
560 cpp_options *options = cpp_get_options (parse_in);
561
562 integer = cpp_interpret_integer (parse_in, token, flags);
563 integer = cpp_num_sign_extend (integer, options->precision);
ceeedfc1
NB
564
565 /* The type of a constant with a U suffix is straightforward. */
566 if (flags & CPP_N_UNSIGNED)
5e9754af 567 itk = narrowest_unsigned_type (integer.low, integer.high, flags);
0e5921e8
ZW
568 else
569 {
ceeedfc1
NB
570 /* The type of a potentially-signed integer constant varies
571 depending on the base it's in, the standard in use, and the
572 length suffixes. */
5e9754af
NS
573 enum integer_type_kind itk_u
574 = narrowest_unsigned_type (integer.low, integer.high, flags);
575 enum integer_type_kind itk_s
576 = narrowest_signed_type (integer.low, integer.high, flags);
ceeedfc1
NB
577
578 /* In both C89 and C99, octal and hex constants may be signed or
579 unsigned, whichever fits tighter. We do not warn about this
580 choice differing from the traditional choice, as the constant
581 is probably a bit pattern and either way will work. */
582 if ((flags & CPP_N_RADIX) != CPP_N_DECIMAL)
583 itk = MIN (itk_u, itk_s);
584 else
0e5921e8 585 {
ceeedfc1
NB
586 /* In C99, decimal constants are always signed.
587 In C89, decimal constants that don't fit in long have
8d9afc4e 588 undefined behavior; we try to make them unsigned long.
ceeedfc1
NB
589 In GCC's extended C89, that last is true of decimal
590 constants that don't fit in long long, too. */
591
592 itk = itk_s;
593 if (itk_s > itk_u && itk_s > itk_long)
0e5921e8 594 {
ceeedfc1 595 if (!flag_isoc99)
0e5921e8 596 {
ceeedfc1
NB
597 if (itk_u < itk_unsigned_long)
598 itk_u = itk_unsigned_long;
599 itk = itk_u;
d4ee4d25 600 warning (0, "this decimal constant is unsigned only in ISO C90");
0e5921e8 601 }
44c21c7f
DD
602 else
603 warning (OPT_Wtraditional,
604 "this decimal constant would be unsigned in ISO C90");
0e5921e8
ZW
605 }
606 }
ceeedfc1 607 }
56f48ce9 608
ceeedfc1
NB
609 if (itk == itk_none)
610 /* cpplib has already issued a warning for overflow. */
611 type = ((flags & CPP_N_UNSIGNED)
612 ? widest_unsigned_literal_type_node
613 : widest_integer_literal_type_node);
614 else
615 type = integer_types[itk];
e8bbfc4e 616
ceeedfc1
NB
617 if (itk > itk_unsigned_long
618 && (flags & CPP_N_WIDTH) != CPP_N_LARGE
3f75a254 619 && !in_system_header && !flag_isoc99)
bda67431 620 pedwarn ("integer constant is too large for %qs type",
ceeedfc1 621 (flags & CPP_N_UNSIGNED) ? "unsigned long" : "long");
0468bc75 622
7d60be94 623 value = build_int_cst_wide (type, integer.low, integer.high);
e8bbfc4e 624
ceeedfc1
NB
625 /* Convert imaginary to a complex type. */
626 if (flags & CPP_N_IMAGINARY)
7d60be94 627 value = build_complex (NULL_TREE, build_int_cst (type, 0), value);
e8bbfc4e 628
ceeedfc1
NB
629 return value;
630}
e8bbfc4e 631
ceeedfc1
NB
632/* Interpret TOKEN, a floating point number with FLAGS as classified
633 by cpplib. */
634static tree
2f6e4e97 635interpret_float (const cpp_token *token, unsigned int flags)
ceeedfc1
NB
636{
637 tree type;
638 tree value;
639 REAL_VALUE_TYPE real;
640 char *copy;
641 size_t copylen;
89658955 642 const char *type_name;
e8bbfc4e 643
89658955 644 /* FIXME: make %T work in error/warning, then we don't need type_name. */
ceeedfc1
NB
645 if ((flags & CPP_N_WIDTH) == CPP_N_LARGE)
646 {
647 type = long_double_type_node;
89658955 648 type_name = "long double";
ceeedfc1
NB
649 }
650 else if ((flags & CPP_N_WIDTH) == CPP_N_SMALL
651 || flag_single_precision_constant)
652 {
653 type = float_type_node;
89658955 654 type_name = "float";
ceeedfc1
NB
655 }
656 else
657 {
658 type = double_type_node;
89658955 659 type_name = "double";
ceeedfc1 660 }
e8bbfc4e 661
ceeedfc1
NB
662 /* Copy the constant to a nul-terminated buffer. If the constant
663 has any suffixes, cut them off; REAL_VALUE_ATOF/ REAL_VALUE_HTOF
664 can't handle them. */
665 copylen = token->val.str.len;
666 if ((flags & CPP_N_WIDTH) != CPP_N_MEDIUM)
667 /* Must be an F or L suffix. */
668 copylen--;
669 if (flags & CPP_N_IMAGINARY)
670 /* I or J suffix. */
671 copylen--;
672
28dab132 673 copy = (char *) alloca (copylen + 1);
ceeedfc1
NB
674 memcpy (copy, token->val.str.text, copylen);
675 copy[copylen] = '\0';
676
efdc7e19
RH
677 real_from_string (&real, copy);
678 real_convert (&real, TYPE_MODE (type), &real);
fbb18613 679
6d84156b
JM
680 /* Both C and C++ require a diagnostic for a floating constant
681 outside the range of representable values of its type. Since we
682 have __builtin_inf* to produce an infinity, it might now be
683 appropriate for this to be a mandatory pedwarn rather than
684 conditioned on -pedantic. */
ceeedfc1 685 if (REAL_VALUE_ISINF (real) && pedantic)
6d84156b 686 pedwarn ("floating constant exceeds range of %<%s%>", type_name);
fbb18613 687
ceeedfc1
NB
688 /* Create a node with determined type and value. */
689 value = build_real (type, real);
690 if (flags & CPP_N_IMAGINARY)
691 value = build_complex (NULL_TREE, convert (type, integer_zero_node), value);
e8bbfc4e 692
0e5921e8 693 return value;
0e5921e8 694}
e8bbfc4e 695
e6cc3a24
ZW
696/* Convert a series of STRING and/or WSTRING tokens into a tree,
697 performing string constant concatenation. TOK is the first of
698 these. VALP is the location to write the string into. OBJC_STRING
699 indicates whether an '@' token preceded the incoming token.
700 Returns the CPP token type of the result (CPP_STRING, CPP_WSTRING,
701 or CPP_OBJC_STRING).
702
703 This is unfortunately more work than it should be. If any of the
704 strings in the series has an L prefix, the result is a wide string
705 (6.4.5p4). Whether or not the result is a wide string affects the
706 meaning of octal and hexadecimal escapes (6.4.4.4p6,9). But escape
707 sequences do not continue across the boundary between two strings in
708 a series (6.4.5p7), so we must not lose the boundaries. Therefore
709 cpp_interpret_string takes a vector of cpp_string structures, which
710 we must arrange to provide. */
711
712static enum cpp_ttype
713lex_string (const cpp_token *tok, tree *valp, bool objc_string)
0e5921e8
ZW
714{
715 tree value;
e6cc3a24 716 bool wide = false;
51e63e60 717 size_t concats = 0;
e6cc3a24
ZW
718 struct obstack str_ob;
719 cpp_string istr;
2f6e4e97 720
e6cc3a24
ZW
721 /* Try to avoid the overhead of creating and destroying an obstack
722 for the common case of just one string. */
723 cpp_string str = tok->val.str;
724 cpp_string *strs = &str;
e9a25f70 725
e6cc3a24
ZW
726 if (tok->type == CPP_WSTRING)
727 wide = true;
0e5921e8 728
51e63e60
NS
729 retry:
730 tok = cpp_get_token (parse_in);
731 switch (tok->type)
e6cc3a24 732 {
51e63e60
NS
733 case CPP_PADDING:
734 goto retry;
735 case CPP_ATSIGN:
736 if (c_dialect_objc ())
0e5921e8 737 {
51e63e60
NS
738 objc_string = true;
739 goto retry;
740 }
741 /* FALLTHROUGH */
742
743 default:
744 break;
745
746 case CPP_WSTRING:
747 wide = true;
748 /* FALLTHROUGH */
749
750 case CPP_STRING:
751 if (!concats)
752 {
753 gcc_obstack_init (&str_ob);
754 obstack_grow (&str_ob, &str, sizeof (cpp_string));
0e5921e8 755 }
51e63e60
NS
756
757 concats++;
758 obstack_grow (&str_ob, &tok->val.str, sizeof (cpp_string));
759 goto retry;
e8bbfc4e
RK
760 }
761
e6cc3a24
ZW
762 /* We have read one more token than we want. */
763 _cpp_backup_tokens (parse_in, 1);
51e63e60
NS
764 if (concats)
765 strs = (cpp_string *) obstack_finish (&str_ob);
e6cc3a24 766
44c21c7f
DD
767 if (concats && !objc_string && !in_system_header)
768 warning (OPT_Wtraditional,
769 "traditional C rejects string constant concatenation");
e8bbfc4e 770
21526606
EC
771 if ((c_lex_string_translate
772 ? cpp_interpret_string : cpp_interpret_string_notranslate)
51e63e60 773 (parse_in, strs, concats + 1, &istr, wide))
0e5921e8 774 {
3f75a254
JM
775 value = build_string (istr.len, (char *) istr.text);
776 free ((void *) istr.text);
0173bb6f
AO
777
778 if (c_lex_string_translate == -1)
779 {
51e63e60
NS
780 int xlated = cpp_interpret_string_notranslate (parse_in, strs,
781 concats + 1,
366de0ce
NS
782 &istr, wide);
783 /* Assume that, if we managed to translate the string above,
784 then the untranslated parsing will always succeed. */
785 gcc_assert (xlated);
0173bb6f 786
3f75a254
JM
787 if (TREE_STRING_LENGTH (value) != (int) istr.len
788 || 0 != strncmp (TREE_STRING_POINTER (value), (char *) istr.text,
0173bb6f
AO
789 istr.len))
790 {
791 /* Arrange for us to return the untranslated string in
792 *valp, but to set up the C type of the translated
793 one. */
3f75a254 794 *valp = build_string (istr.len, (char *) istr.text);
0173bb6f
AO
795 valp = &TREE_CHAIN (*valp);
796 }
3f75a254 797 free ((void *) istr.text);
0173bb6f 798 }
0e5921e8
ZW
799 }
800 else
801 {
e6cc3a24
ZW
802 /* Callers cannot generally handle error_mark_node in this context,
803 so return the empty string instead. cpp_interpret_string has
804 issued an error. */
805 if (wide)
806 value = build_string (TYPE_PRECISION (wchar_type_node)
807 / TYPE_PRECISION (char_type_node),
808 "\0\0\0"); /* widest supported wchar_t
809 is 32 bits */
810 else
811 value = build_string (1, "");
0e5921e8
ZW
812 }
813
e6cc3a24
ZW
814 TREE_TYPE (value) = wide ? wchar_array_type_node : char_array_type_node;
815 *valp = fix_string_type (value);
0e5921e8 816
51e63e60 817 if (concats)
e6cc3a24
ZW
818 obstack_free (&str_ob, 0);
819
820 return objc_string ? CPP_OBJC_STRING : wide ? CPP_WSTRING : CPP_STRING;
e8bbfc4e
RK
821}
822
c8a96070 823/* Converts a (possibly wide) character constant token into a tree. */
0e5921e8 824static tree
2f6e4e97 825lex_charconst (const cpp_token *token)
e8bbfc4e 826{
4268e8bb 827 cppchar_t result;
9340544b 828 tree type, value;
c8a96070 829 unsigned int chars_seen;
4268e8bb 830 int unsignedp;
ceeedfc1 831
a5a49440 832 result = cpp_interpret_charconst (parse_in, token,
2f6e4e97 833 &chars_seen, &unsignedp);
9340544b 834
4268e8bb
NB
835 if (token->type == CPP_WCHAR)
836 type = wchar_type_node;
837 /* In C, a character constant has type 'int'.
838 In C++ 'char', but multi-char charconsts have type 'int'. */
37fa72e9 839 else if (!c_dialect_cxx () || chars_seen > 1)
4268e8bb
NB
840 type = integer_type_node;
841 else
842 type = char_type_node;
9340544b 843
4a90aeeb
NS
844 /* Cast to cppchar_signed_t to get correct sign-extension of RESULT
845 before possibly widening to HOST_WIDE_INT for build_int_cst. */
846 if (unsignedp || (cppchar_signed_t) result >= 0)
7d60be94 847 value = build_int_cst_wide (type, result, 0);
4a90aeeb 848 else
7d60be94 849 value = build_int_cst_wide (type, (cppchar_signed_t) result, -1);
4a90aeeb 850
0e5921e8 851 return value;
e8bbfc4e 852}
This page took 1.630517 seconds and 5 git commands to generate.