]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/c-lex.c
2008-08-21 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
[thirdparty/gcc.git] / gcc / c-lex.c
CommitLineData
3eb82013 1/* Mainly the interface between cpplib and the C front ends.
0b387d23 2 Copyright (C) 1987, 1988, 1989, 1992, 1994, 1995, 1996, 1997
9c85a98a 3 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008
b5575c30 4 Free Software Foundation, Inc.
dbb0cd11 5
f12b58b3 6This file is part of GCC.
dbb0cd11 7
f12b58b3 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
8c4c00c1 10Software Foundation; either version 3, or (at your option) any later
f12b58b3 11version.
dbb0cd11 12
f12b58b3 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.
dbb0cd11 17
18You should have received a copy of the GNU General Public License
8c4c00c1 19along with GCC; see the file COPYING3. If not see
20<http://www.gnu.org/licenses/>. */
dbb0cd11 21
0dbd1c74 22#include "config.h"
405711de 23#include "system.h"
805e22b2 24#include "coretypes.h"
25#include "tm.h"
dbb0cd11 26
ef258422 27#include "real.h"
dbb0cd11 28#include "rtl.h"
29#include "tree.h"
30#include "input.h"
cd03a192 31#include "output.h"
dbb0cd11 32#include "c-tree.h"
b78207a0 33#include "c-common.h"
dbb0cd11 34#include "flags.h"
518796ad 35#include "timevar.h"
1fcd08b1 36#include "cpplib.h"
917aa082 37#include "c-pragma.h"
9cdfa0b0 38#include "toplev.h"
be2828ce 39#include "intl.h"
d8c9779c 40#include "tm_p.h"
518796ad 41#include "splay-tree.h"
c140b944 42#include "debug.h"
430be8e2 43#include "target.h"
be2828ce 44
518796ad 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;
25b48e97 48
518796ad 49int pending_lang_change; /* If we need to switch languages - C++ only */
50int c_header_level; /* depth in C headers - C++ only */
3fe7c943 51
2b30d46c 52static tree interpret_integer (const cpp_token *, unsigned int);
53static tree interpret_float (const cpp_token *, unsigned int);
b563b483 54static tree interpret_fixed (const cpp_token *, unsigned int);
2364e487 55static enum integer_type_kind narrowest_unsigned_type
56 (unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT, unsigned int);
57static enum integer_type_kind narrowest_signed_type
58 (unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT, unsigned int);
8115b8be 59static enum cpp_ttype lex_string (const cpp_token *, tree *, bool, bool);
2b30d46c 60static tree lex_charconst (const cpp_token *);
61static void update_header_times (const char *);
62static int dump_one_header (splay_tree_node, void *);
63static void cb_line_change (cpp_reader *, const cpp_token *, int);
64static void cb_ident (cpp_reader *, unsigned int, const cpp_string *);
65static void cb_def_pragma (cpp_reader *, unsigned int);
66static void cb_define (cpp_reader *, unsigned int, cpp_hashnode *);
67static void cb_undef (cpp_reader *, unsigned int, cpp_hashnode *);
c450c529 68\f
f7070933 69void
2b30d46c 70init_c_lex (void)
14ace7ea 71{
1a88fc96 72 struct cpp_callbacks *cb;
518796ad 73 struct c_fileinfo *toplevel;
74
62bf98ad 75 /* The get_fileinfo data structure must be initialized before
76 cpp_read_main_file is called. */
ec6cb94a 77 toplevel = get_fileinfo ("<top level>");
518796ad 78 if (flag_detailed_statistics)
79 {
80 header_time = 0;
81 body_time = get_run_time ();
82 toplevel->time = body_time;
83 }
2b30d46c 84
1a88fc96 85 cb = cpp_get_callbacks (parse_in);
86
5621a364 87 cb->line_change = cb_line_change;
1a88fc96 88 cb->ident = cb_ident;
1a88fc96 89 cb->def_pragma = cb_def_pragma;
573aba85 90 cb->valid_pch = c_common_valid_pch;
91 cb->read_pch = c_common_read_pch;
518796ad 92
f6e771aa 93 /* Set the debug callbacks if we can use them. */
94 if (debug_info_level == DINFO_LEVEL_VERBOSE
346e0763 95 && (write_symbols == DWARF2_DEBUG
a0c938f0 96 || write_symbols == VMS_AND_DWARF2_DEBUG))
f6e771aa 97 {
1a88fc96 98 cb->define = cb_define;
99 cb->undef = cb_undef;
f6e771aa 100 }
14ace7ea 101}
102
518796ad 103struct c_fileinfo *
2b30d46c 104get_fileinfo (const char *name)
14ace7ea 105{
518796ad 106 splay_tree_node n;
107 struct c_fileinfo *fi;
108
62bf98ad 109 if (!file_info_tree)
84166705 110 file_info_tree = splay_tree_new ((splay_tree_compare_fn) strcmp,
62bf98ad 111 0,
84166705 112 (splay_tree_delete_value_fn) free);
62bf98ad 113
518796ad 114 n = splay_tree_lookup (file_info_tree, (splay_tree_key) name);
115 if (n)
116 return (struct c_fileinfo *) n->value;
117
9318f22c 118 fi = XNEW (struct c_fileinfo);
518796ad 119 fi->time = 0;
120 fi->interface_only = 0;
121 fi->interface_unknown = 1;
122 splay_tree_insert (file_info_tree, (splay_tree_key) name,
123 (splay_tree_value) fi);
124 return fi;
4e92a8df 125}
14ace7ea 126
518796ad 127static void
2b30d46c 128update_header_times (const char *name)
dbb0cd11 129{
518796ad 130 /* Changing files again. This means currently collected time
131 is charged against header time, and body time starts back at 0. */
132 if (flag_detailed_statistics)
dbb0cd11 133 {
518796ad 134 int this_time = get_run_time ();
135 struct c_fileinfo *file = get_fileinfo (name);
136 header_time += this_time - body_time;
137 file->time += this_time - body_time;
138 body_time = this_time;
dbb0cd11 139 }
140}
141
518796ad 142static int
9a03a746 143dump_one_header (splay_tree_node n, void * ARG_UNUSED (dummy))
dbb0cd11 144{
518796ad 145 print_time ((const char *) n->key,
146 ((struct c_fileinfo *) n->value)->time);
147 return 0;
dbb0cd11 148}
dbb0cd11 149
150void
2b30d46c 151dump_time_statistics (void)
dbb0cd11 152{
518796ad 153 struct c_fileinfo *file = get_fileinfo (input_filename);
154 int this_time = get_run_time ();
155 file->time += this_time - body_time;
156
157 fprintf (stderr, "\n******\n");
158 print_time ("header files (total)", header_time);
159 print_time ("main file (total)", this_time - body_time);
160 fprintf (stderr, "ratio = %g : 1\n",
84166705 161 (double) header_time / (double) (this_time - body_time));
518796ad 162 fprintf (stderr, "\n******\n");
163
164 splay_tree_foreach (file_info_tree, dump_one_header, 0);
dbb0cd11 165}
2fbc2baa 166
518796ad 167static void
9a03a746 168cb_ident (cpp_reader * ARG_UNUSED (pfile),
169 unsigned int ARG_UNUSED (line),
170 const cpp_string * ARG_UNUSED (str))
518796ad 171{
518796ad 172#ifdef ASM_OUTPUT_IDENT
84166705 173 if (!flag_no_ident)
518796ad 174 {
d7503801 175 /* Convert escapes in the string. */
ebc03810 176 cpp_string cstr = { 0, 0 };
924bbf02 177 if (cpp_interpret_string (pfile, str, 1, &cstr, CPP_STRING))
ebc03810 178 {
32d0edd1 179 ASM_OUTPUT_IDENT (asm_out_file, (const char *) cstr.text);
e47a6f81 180 free (CONST_CAST (unsigned char *, cstr.text));
ebc03810 181 }
518796ad 182 }
183#endif
d7503801 184}
185
5621a364 186/* Called at the start of every non-empty line. TOKEN is the first
187 lexed token on the line. Used for diagnostic line numbers. */
188static void
9a03a746 189cb_line_change (cpp_reader * ARG_UNUSED (pfile), const cpp_token *token,
652b3139 190 int parsing_args)
5621a364 191{
610625e3 192 if (token->type != CPP_EOF && !parsing_args)
9a6486a6 193 input_location = token->src_loc;
5621a364 194}
195
b717e161 196void
2b30d46c 197fe_file_change (const struct line_map *new_map)
d7503801 198{
a1c7eda2 199 if (new_map == NULL)
610625e3 200 return;
a1c7eda2 201
f85fcf2b 202 if (new_map->reason == LC_ENTER)
10816a22 203 {
d7463c56 204 /* Don't stack the main buffer on the input stack;
205 we already did in compile_file. */
84166705 206 if (!MAIN_FILE_P (new_map))
518796ad 207 {
35df0168 208 unsigned int included_at = LAST_SOURCE_LINE_LOCATION (new_map - 1);
209 int line = 0;
210 if (included_at > BUILTINS_LOCATION)
211 line = SOURCE_LINE (new_map - 1, included_at);
9a6486a6 212
26cb3d1c 213 input_location = new_map->start_location;
35df0168 214 (*debug_hooks->start_source_file) (line, new_map->to_file);
d7503801 215#ifndef NO_IMPLICIT_EXTERN_C
216 if (c_header_level)
217 ++c_header_level;
f85fcf2b 218 else if (new_map->sysp == 2)
d7503801 219 {
220 c_header_level = 1;
221 ++pending_lang_change;
222 }
518796ad 223#endif
d7503801 224 }
10816a22 225 }
f85fcf2b 226 else if (new_map->reason == LC_LEAVE)
10816a22 227 {
518796ad 228#ifndef NO_IMPLICIT_EXTERN_C
f85fcf2b 229 if (c_header_level && --c_header_level == 0)
230 {
231 if (new_map->sysp == 2)
c3ceba8e 232 warning (0, "badly nested C headers from preprocessor");
f85fcf2b 233 --pending_lang_change;
234 }
f85fcf2b 235#endif
26cb3d1c 236 input_location = new_map->start_location;
2b30d46c 237
8eed96ae 238 (*debug_hooks->end_source_file) (new_map->to_line);
dbb0cd11 239 }
10816a22 240
f85fcf2b 241 update_header_times (new_map->to_file);
9a6486a6 242 input_location = new_map->start_location;
518796ad 243}
1fcd08b1 244
245static void
610625e3 246cb_def_pragma (cpp_reader *pfile, source_location loc)
1fcd08b1 247{
248 /* Issue a warning message if we have been asked to do so. Ignore
249 unknown pragmas in system headers unless an explicit
2c0e001b 250 -Wunknown-pragmas has been given. */
1fcd08b1 251 if (warn_unknown_pragmas > in_system_header)
252 {
00ef4b34 253 const unsigned char *space, *name;
254 const cpp_token *s;
00ef4b34 255 location_t fe_loc = loc;
e3ff39a1 256
5ae4caef 257 space = name = (const unsigned char *) "";
f9b5f742 258 s = cpp_get_token (pfile);
5ae4caef 259 if (s->type != CPP_EOF)
260 {
261 space = cpp_token_as_text (pfile, s);
262 s = cpp_get_token (pfile);
263 if (s->type == CPP_NAME)
264 name = cpp_token_as_text (pfile, s);
265 }
1fcd08b1 266
e8d0745d 267 warning (OPT_Wunknown_pragmas, "%Hignoring #pragma %s %s",
268 &fe_loc, space, name);
1fcd08b1 269 }
270}
518796ad 271
f6e771aa 272/* #define callback for DWARF and DWARF2 debug info. */
273static void
610625e3 274cb_define (cpp_reader *pfile, source_location loc, cpp_hashnode *node)
f6e771aa 275{
931b0a0f 276 const struct line_map *map = linemap_lookup (line_table, loc);
610625e3 277 (*debug_hooks->define) (SOURCE_LINE (map, loc),
c140b944 278 (const char *) cpp_macro_definition (pfile, node));
f6e771aa 279}
280
281/* #undef callback for DWARF and DWARF2 debug info. */
282static void
9a03a746 283cb_undef (cpp_reader * ARG_UNUSED (pfile), source_location loc,
2b30d46c 284 cpp_hashnode *node)
f6e771aa 285{
931b0a0f 286 const struct line_map *map = linemap_lookup (line_table, loc);
610625e3 287 (*debug_hooks->undef) (SOURCE_LINE (map, loc),
c140b944 288 (const char *) NODE_NAME (node));
f6e771aa 289}
dbb0cd11 290\f
61cc302f 291/* Read a token and return its type. Fill *VALUE with its value, if
292 applicable. Fill *CPP_FLAGS with the token's flags, if it is
293 non-NULL. */
ebc03810 294
ec03958b 295enum cpp_ttype
8115b8be 296c_lex_with_flags (tree *value, location_t *loc, unsigned char *cpp_flags,
297 int lex_flags)
ebc03810 298{
ddf4604f 299 static bool no_more_pch;
61cc302f 300 const cpp_token *tok;
301 enum cpp_ttype type;
8dba02f7 302 unsigned char add_flags = 0;
ebc03810 303
61cc302f 304 timevar_push (TV_CPP);
ebc03810 305 retry:
931b0a0f 306 tok = cpp_get_token_with_location (parse_in, loc);
931b0a0f 307 type = tok->type;
308
309 retry_after_at:
61cc302f 310 switch (type)
518796ad 311 {
61cc302f 312 case CPP_PADDING:
313 goto retry;
a0c938f0 314
518796ad 315 case CPP_NAME:
f9b5f742 316 *value = HT_IDENT_TO_GCC_IDENT (HT_NODE (tok->val.node));
518796ad 317 break;
10816a22 318
518796ad 319 case CPP_NUMBER:
f5ec8cb5 320 {
321 unsigned int flags = cpp_classify_number (parse_in, tok);
322
323 switch (flags & CPP_N_CATEGORY)
324 {
325 case CPP_N_INVALID:
326 /* cpplib has issued an error. */
e915f664 327 *value = error_mark_node;
7a8c1294 328 errorcount++;
f5ec8cb5 329 break;
330
331 case CPP_N_INTEGER:
8dba02f7 332 /* C++ uses '0' to mark virtual functions as pure.
333 Set PURE_ZERO to pass this information to the C++ parser. */
334 if (tok->val.str.len == 1 && *tok->val.str.text == '0')
335 add_flags = PURE_ZERO;
f5ec8cb5 336 *value = interpret_integer (tok, flags);
337 break;
338
339 case CPP_N_FLOATING:
340 *value = interpret_float (tok, flags);
341 break;
342
343 default:
231bd014 344 gcc_unreachable ();
f5ec8cb5 345 }
346 }
518796ad 347 break;
01ce7a1b 348
ebc03810 349 case CPP_ATSIGN:
350 /* An @ may give the next token special significance in Objective-C. */
ebc03810 351 if (c_dialect_objc ())
352 {
931b0a0f 353 location_t atloc = *loc;
354 location_t newloc;
a0c938f0 355
61cc302f 356 retry_at:
931b0a0f 357 tok = cpp_get_token_with_location (parse_in, &newloc);
61cc302f 358 type = tok->type;
359 switch (type)
ebc03810 360 {
61cc302f 361 case CPP_PADDING:
362 goto retry_at;
a0c938f0 363
61cc302f 364 case CPP_STRING:
365 case CPP_WSTRING:
924bbf02 366 case CPP_STRING16:
367 case CPP_STRING32:
8115b8be 368 type = lex_string (tok, value, true, true);
61cc302f 369 break;
370
ebc03810 371 case CPP_NAME:
61cc302f 372 *value = HT_IDENT_TO_GCC_IDENT (HT_NODE (tok->val.node));
373 if (objc_is_reserved_word (*value))
ebc03810 374 {
61cc302f 375 type = CPP_AT_NAME;
376 break;
ebc03810 377 }
61cc302f 378 /* FALLTHROUGH */
ebc03810 379
61cc302f 380 default:
381 /* ... or not. */
382 error ("%Hstray %<@%> in program", &atloc);
931b0a0f 383 *loc = newloc;
61cc302f 384 goto retry_after_at;
ebc03810 385 }
61cc302f 386 break;
ebc03810 387 }
388
61cc302f 389 /* FALLTHROUGH */
390 case CPP_HASH:
391 case CPP_PASTE:
392 {
393 unsigned char name[4];
a0c938f0 394
bb1fa6bb 395 *cpp_spell_token (parse_in, tok, name, true) = 0;
a0c938f0 396
61cc302f 397 error ("stray %qs in program", name);
398 }
a0c938f0 399
61cc302f 400 goto retry;
ebc03810 401
4970d4c2 402 case CPP_OTHER:
403 {
404 cppchar_t c = tok->val.str.text[0];
405
406 if (c == '"' || c == '\'')
407 error ("missing terminating %c character", (int) c);
408 else if (ISGRAPH (c))
61cc302f 409 error ("stray %qc in program", (int) c);
4970d4c2 410 else
61cc302f 411 error ("stray %<\\%o%> in program", (int) c);
4970d4c2 412 }
413 goto retry;
414
518796ad 415 case CPP_CHAR:
416 case CPP_WCHAR:
924bbf02 417 case CPP_CHAR16:
418 case CPP_CHAR32:
f9b5f742 419 *value = lex_charconst (tok);
518796ad 420 break;
10816a22 421
518796ad 422 case CPP_STRING:
423 case CPP_WSTRING:
924bbf02 424 case CPP_STRING16:
425 case CPP_STRING32:
8115b8be 426 if ((lex_flags & C_LEX_RAW_STRINGS) == 0)
61cc302f 427 {
8115b8be 428 type = lex_string (tok, value, false,
429 (lex_flags & C_LEX_STRING_NO_TRANSLATE) == 0);
61cc302f 430 break;
431 }
c1fdef8e 432 *value = build_string (tok->val.str.len, (const char *) tok->val.str.text);
b75b98aa 433 break;
61cc302f 434
00d26680 435 case CPP_PRAGMA:
b75b98aa 436 *value = build_int_cst (NULL, tok->val.pragma);
518796ad 437 break;
10816a22 438
518796ad 439 /* These tokens should not be visible outside cpplib. */
440 case CPP_HEADER_NAME:
441 case CPP_COMMENT:
442 case CPP_MACRO_ARG:
231bd014 443 gcc_unreachable ();
518796ad 444
ebc03810 445 default:
446 *value = NULL_TREE;
447 break;
518796ad 448 }
449
61cc302f 450 if (cpp_flags)
8dba02f7 451 *cpp_flags = tok->flags | add_flags;
61cc302f 452
84166705 453 if (!no_more_pch)
ddf4604f 454 {
455 no_more_pch = true;
456 c_common_no_more_pch ();
457 }
a0c938f0 458
61cc302f 459 timevar_pop (TV_CPP);
a0c938f0 460
61cc302f 461 return type;
518796ad 462}
7224cf20 463
f5ec8cb5 464/* Returns the narrowest C-visible unsigned type, starting with the
2364e487 465 minimum specified by FLAGS, that can fit HIGH:LOW, or itk_none if
f5ec8cb5 466 there isn't one. */
2364e487 467
f5ec8cb5 468static enum integer_type_kind
2364e487 469narrowest_unsigned_type (unsigned HOST_WIDE_INT low,
470 unsigned HOST_WIDE_INT high,
471 unsigned int flags)
518796ad 472{
7d339f93 473 int itk;
33a62e3f 474
f5ec8cb5 475 if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
476 itk = itk_unsigned_int;
477 else if ((flags & CPP_N_WIDTH) == CPP_N_MEDIUM)
478 itk = itk_unsigned_long;
479 else
480 itk = itk_unsigned_long_long;
dbb0cd11 481
f5ec8cb5 482 for (; itk < itk_none; itk += 2 /* skip unsigned types */)
2364e487 483 {
484 tree upper = TYPE_MAX_VALUE (integer_types[itk]);
485
84166705 486 if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (upper) > high
487 || ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (upper) == high
2364e487 488 && TREE_INT_CST_LOW (upper) >= low))
7d339f93 489 return (enum integer_type_kind) itk;
2364e487 490 }
33a62e3f 491
f5ec8cb5 492 return itk_none;
493}
dbb0cd11 494
f5ec8cb5 495/* Ditto, but narrowest signed type. */
496static enum integer_type_kind
2364e487 497narrowest_signed_type (unsigned HOST_WIDE_INT low,
498 unsigned HOST_WIDE_INT high, unsigned int flags)
f5ec8cb5 499{
7d339f93 500 int itk;
dbb0cd11 501
f5ec8cb5 502 if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
503 itk = itk_int;
504 else if ((flags & CPP_N_WIDTH) == CPP_N_MEDIUM)
505 itk = itk_long;
506 else
507 itk = itk_long_long;
dbb0cd11 508
dbb0cd11 509
f5ec8cb5 510 for (; itk < itk_none; itk += 2 /* skip signed types */)
2364e487 511 {
512 tree upper = TYPE_MAX_VALUE (integer_types[itk]);
a0c938f0 513
84166705 514 if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (upper) > high
515 || ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (upper) == high
2364e487 516 && TREE_INT_CST_LOW (upper) >= low))
7d339f93 517 return (enum integer_type_kind) itk;
2364e487 518 }
536f5fb1 519
f5ec8cb5 520 return itk_none;
521}
536f5fb1 522
f5ec8cb5 523/* Interpret TOKEN, an integer with FLAGS as classified by cpplib. */
524static tree
2b30d46c 525interpret_integer (const cpp_token *token, unsigned int flags)
f5ec8cb5 526{
527 tree value, type;
528 enum integer_type_kind itk;
529 cpp_num integer;
530 cpp_options *options = cpp_get_options (parse_in);
531
532 integer = cpp_interpret_integer (parse_in, token, flags);
533 integer = cpp_num_sign_extend (integer, options->precision);
f5ec8cb5 534
535 /* The type of a constant with a U suffix is straightforward. */
536 if (flags & CPP_N_UNSIGNED)
2364e487 537 itk = narrowest_unsigned_type (integer.low, integer.high, flags);
518796ad 538 else
539 {
f5ec8cb5 540 /* The type of a potentially-signed integer constant varies
541 depending on the base it's in, the standard in use, and the
542 length suffixes. */
2364e487 543 enum integer_type_kind itk_u
544 = narrowest_unsigned_type (integer.low, integer.high, flags);
545 enum integer_type_kind itk_s
546 = narrowest_signed_type (integer.low, integer.high, flags);
f5ec8cb5 547
548 /* In both C89 and C99, octal and hex constants may be signed or
549 unsigned, whichever fits tighter. We do not warn about this
550 choice differing from the traditional choice, as the constant
551 is probably a bit pattern and either way will work. */
552 if ((flags & CPP_N_RADIX) != CPP_N_DECIMAL)
553 itk = MIN (itk_u, itk_s);
554 else
518796ad 555 {
f5ec8cb5 556 /* In C99, decimal constants are always signed.
557 In C89, decimal constants that don't fit in long have
974e2c0c 558 undefined behavior; we try to make them unsigned long.
f5ec8cb5 559 In GCC's extended C89, that last is true of decimal
560 constants that don't fit in long long, too. */
561
562 itk = itk_s;
563 if (itk_s > itk_u && itk_s > itk_long)
518796ad 564 {
f5ec8cb5 565 if (!flag_isoc99)
518796ad 566 {
f5ec8cb5 567 if (itk_u < itk_unsigned_long)
568 itk_u = itk_unsigned_long;
569 itk = itk_u;
c3ceba8e 570 warning (0, "this decimal constant is unsigned only in ISO C90");
518796ad 571 }
8b6866af 572 else
573 warning (OPT_Wtraditional,
574 "this decimal constant would be unsigned in ISO C90");
518796ad 575 }
576 }
f5ec8cb5 577 }
33a62e3f 578
f5ec8cb5 579 if (itk == itk_none)
580 /* cpplib has already issued a warning for overflow. */
581 type = ((flags & CPP_N_UNSIGNED)
582 ? widest_unsigned_literal_type_node
583 : widest_integer_literal_type_node);
584 else
585 type = integer_types[itk];
dbb0cd11 586
f5ec8cb5 587 if (itk > itk_unsigned_long
588 && (flags & CPP_N_WIDTH) != CPP_N_LARGE
84166705 589 && !in_system_header && !flag_isoc99)
21ca8540 590 pedwarn (input_location, 0, "integer constant is too large for %qs type",
591 (flags & CPP_N_UNSIGNED) ? "unsigned long" : "long");
8fd54344 592
7016c612 593 value = build_int_cst_wide (type, integer.low, integer.high);
dbb0cd11 594
f5ec8cb5 595 /* Convert imaginary to a complex type. */
596 if (flags & CPP_N_IMAGINARY)
7016c612 597 value = build_complex (NULL_TREE, build_int_cst (type, 0), value);
dbb0cd11 598
f5ec8cb5 599 return value;
600}
dbb0cd11 601
f5ec8cb5 602/* Interpret TOKEN, a floating point number with FLAGS as classified
603 by cpplib. */
604static tree
2b30d46c 605interpret_float (const cpp_token *token, unsigned int flags)
f5ec8cb5 606{
607 tree type;
608 tree value;
609 REAL_VALUE_TYPE real;
610 char *copy;
611 size_t copylen;
dbb0cd11 612
b563b483 613 /* Decode _Fract and _Accum. */
614 if (flags & CPP_N_FRACT || flags & CPP_N_ACCUM)
615 return interpret_fixed (token, flags);
616
c4503c0a 617 /* Decode type based on width and properties. */
618 if (flags & CPP_N_DFLOAT)
619 if ((flags & CPP_N_WIDTH) == CPP_N_LARGE)
620 type = dfloat128_type_node;
621 else if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
622 type = dfloat32_type_node;
623 else
624 type = dfloat64_type_node;
625 else
430be8e2 626 if (flags & CPP_N_WIDTH_MD)
627 {
628 char suffix;
629 enum machine_mode mode;
630
631 if ((flags & CPP_N_WIDTH_MD) == CPP_N_MD_W)
632 suffix = 'w';
633 else
634 suffix = 'q';
635
636 mode = targetm.c.mode_for_suffix (suffix);
637 if (mode == VOIDmode)
638 {
639 error ("unsupported non-standard suffix on floating constant");
640 errorcount++;
641
642 return error_mark_node;
643 }
8864917d 644 else
21ca8540 645 pedwarn (input_location, OPT_pedantic, "non-standard suffix on floating constant");
430be8e2 646
647 type = c_common_type_for_mode (mode, 0);
648 gcc_assert (type);
649 }
650 else if ((flags & CPP_N_WIDTH) == CPP_N_LARGE)
f5ec8cb5 651 type = long_double_type_node;
c4503c0a 652 else if ((flags & CPP_N_WIDTH) == CPP_N_SMALL
653 || flag_single_precision_constant)
f5ec8cb5 654 type = float_type_node;
c4503c0a 655 else
f5ec8cb5 656 type = double_type_node;
dbb0cd11 657
f5ec8cb5 658 /* Copy the constant to a nul-terminated buffer. If the constant
659 has any suffixes, cut them off; REAL_VALUE_ATOF/ REAL_VALUE_HTOF
660 can't handle them. */
661 copylen = token->val.str.len;
c4503c0a 662 if (flags & CPP_N_DFLOAT)
663 copylen -= 2;
664 else
665 {
666 if ((flags & CPP_N_WIDTH) != CPP_N_MEDIUM)
430be8e2 667 /* Must be an F or L or machine defined suffix. */
c4503c0a 668 copylen--;
669 if (flags & CPP_N_IMAGINARY)
670 /* I or J suffix. */
671 copylen--;
672 }
f5ec8cb5 673
4fd61bc6 674 copy = (char *) alloca (copylen + 1);
f5ec8cb5 675 memcpy (copy, token->val.str.text, copylen);
676 copy[copylen] = '\0';
677
c4503c0a 678 real_from_string3 (&real, copy, TYPE_MODE (type));
10816a22 679
40f4dbd5 680 /* Both C and C++ require a diagnostic for a floating constant
681 outside the range of representable values of its type. Since we
64214dab 682 have __builtin_inf* to produce an infinity, this is now a
683 mandatory pedwarn if the target does not support infinities. */
684 if (REAL_VALUE_ISINF (real))
685 {
686 if (!MODE_HAS_INFINITIES (TYPE_MODE (type)))
21ca8540 687 pedwarn (input_location, 0, "floating constant exceeds range of %qT", type);
64214dab 688 else
689 warning (OPT_Woverflow, "floating constant exceeds range of %qT", type);
690 }
691 /* We also give a warning if the value underflows. */
692 else if (REAL_VALUES_EQUAL (real, dconst0))
693 {
694 REAL_VALUE_TYPE realvoidmode;
695 int overflow = real_from_string (&realvoidmode, copy);
696 if (overflow < 0 || !REAL_VALUES_EQUAL (realvoidmode, dconst0))
697 warning (OPT_Woverflow, "floating constant truncated to zero");
698 }
10816a22 699
f5ec8cb5 700 /* Create a node with determined type and value. */
701 value = build_real (type, real);
702 if (flags & CPP_N_IMAGINARY)
703 value = build_complex (NULL_TREE, convert (type, integer_zero_node), value);
dbb0cd11 704
518796ad 705 return value;
518796ad 706}
dbb0cd11 707
b563b483 708/* Interpret TOKEN, a fixed-point number with FLAGS as classified
709 by cpplib. */
710
711static tree
712interpret_fixed (const cpp_token *token, unsigned int flags)
713{
714 tree type;
715 tree value;
716 FIXED_VALUE_TYPE fixed;
717 char *copy;
718 size_t copylen;
719
720 copylen = token->val.str.len;
721
722 if (flags & CPP_N_FRACT) /* _Fract. */
723 {
724 if (flags & CPP_N_UNSIGNED) /* Unsigned _Fract. */
725 {
726 if ((flags & CPP_N_WIDTH) == CPP_N_LARGE)
727 {
728 type = unsigned_long_long_fract_type_node;
729 copylen -= 4;
730 }
731 else if ((flags & CPP_N_WIDTH) == CPP_N_MEDIUM)
732 {
733 type = unsigned_long_fract_type_node;
734 copylen -= 3;
735 }
736 else if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
737 {
738 type = unsigned_short_fract_type_node;
739 copylen -= 3;
740 }
741 else
742 {
743 type = unsigned_fract_type_node;
744 copylen -= 2;
745 }
746 }
747 else /* Signed _Fract. */
748 {
749 if ((flags & CPP_N_WIDTH) == CPP_N_LARGE)
750 {
751 type = long_long_fract_type_node;
752 copylen -= 3;
753 }
754 else if ((flags & CPP_N_WIDTH) == CPP_N_MEDIUM)
755 {
756 type = long_fract_type_node;
757 copylen -= 2;
758 }
759 else if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
760 {
761 type = short_fract_type_node;
762 copylen -= 2;
763 }
764 else
765 {
766 type = fract_type_node;
767 copylen --;
768 }
769 }
770 }
771 else /* _Accum. */
772 {
773 if (flags & CPP_N_UNSIGNED) /* Unsigned _Accum. */
774 {
775 if ((flags & CPP_N_WIDTH) == CPP_N_LARGE)
776 {
777 type = unsigned_long_long_accum_type_node;
778 copylen -= 4;
779 }
780 else if ((flags & CPP_N_WIDTH) == CPP_N_MEDIUM)
781 {
782 type = unsigned_long_accum_type_node;
783 copylen -= 3;
784 }
785 else if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
786 {
787 type = unsigned_short_accum_type_node;
788 copylen -= 3;
789 }
790 else
791 {
792 type = unsigned_accum_type_node;
793 copylen -= 2;
794 }
795 }
796 else /* Signed _Accum. */
797 {
798 if ((flags & CPP_N_WIDTH) == CPP_N_LARGE)
799 {
800 type = long_long_accum_type_node;
801 copylen -= 3;
802 }
803 else if ((flags & CPP_N_WIDTH) == CPP_N_MEDIUM)
804 {
805 type = long_accum_type_node;
806 copylen -= 2;
807 }
808 else if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
809 {
810 type = short_accum_type_node;
811 copylen -= 2;
812 }
813 else
814 {
815 type = accum_type_node;
816 copylen --;
817 }
818 }
819 }
820
821 copy = (char *) alloca (copylen + 1);
822 memcpy (copy, token->val.str.text, copylen);
823 copy[copylen] = '\0';
824
825 fixed_from_string (&fixed, copy, TYPE_MODE (type));
826
827 /* Create a node with determined type and value. */
828 value = build_fixed (type, fixed);
829
830 return value;
831}
832
924bbf02 833/* Convert a series of STRING, WSTRING, STRING16 and/or STRING32 tokens
834 into a tree, performing string constant concatenation. TOK is the
835 first of these. VALP is the location to write the string into.
836 OBJC_STRING indicates whether an '@' token preceded the incoming token.
ebc03810 837 Returns the CPP token type of the result (CPP_STRING, CPP_WSTRING,
924bbf02 838 CPP_STRING32, CPP_STRING16, or CPP_OBJC_STRING).
ebc03810 839
840 This is unfortunately more work than it should be. If any of the
841 strings in the series has an L prefix, the result is a wide string
842 (6.4.5p4). Whether or not the result is a wide string affects the
843 meaning of octal and hexadecimal escapes (6.4.4.4p6,9). But escape
844 sequences do not continue across the boundary between two strings in
845 a series (6.4.5p7), so we must not lose the boundaries. Therefore
846 cpp_interpret_string takes a vector of cpp_string structures, which
847 we must arrange to provide. */
848
849static enum cpp_ttype
8115b8be 850lex_string (const cpp_token *tok, tree *valp, bool objc_string, bool translate)
518796ad 851{
852 tree value;
61cc302f 853 size_t concats = 0;
ebc03810 854 struct obstack str_ob;
855 cpp_string istr;
924bbf02 856 enum cpp_ttype type = tok->type;
2b30d46c 857
ebc03810 858 /* Try to avoid the overhead of creating and destroying an obstack
859 for the common case of just one string. */
860 cpp_string str = tok->val.str;
861 cpp_string *strs = &str;
0dbd1c74 862
61cc302f 863 retry:
864 tok = cpp_get_token (parse_in);
865 switch (tok->type)
ebc03810 866 {
61cc302f 867 case CPP_PADDING:
868 goto retry;
869 case CPP_ATSIGN:
870 if (c_dialect_objc ())
518796ad 871 {
61cc302f 872 objc_string = true;
873 goto retry;
874 }
875 /* FALLTHROUGH */
a0c938f0 876
61cc302f 877 default:
878 break;
a0c938f0 879
61cc302f 880 case CPP_WSTRING:
924bbf02 881 case CPP_STRING16:
882 case CPP_STRING32:
883 if (type != tok->type)
884 {
885 if (type == CPP_STRING)
886 type = tok->type;
887 else
888 error ("unsupported non-standard concatenation of string literals");
889 }
a0c938f0 890
61cc302f 891 case CPP_STRING:
892 if (!concats)
893 {
894 gcc_obstack_init (&str_ob);
895 obstack_grow (&str_ob, &str, sizeof (cpp_string));
518796ad 896 }
a0c938f0 897
61cc302f 898 concats++;
899 obstack_grow (&str_ob, &tok->val.str, sizeof (cpp_string));
900 goto retry;
dbb0cd11 901 }
902
ebc03810 903 /* We have read one more token than we want. */
904 _cpp_backup_tokens (parse_in, 1);
61cc302f 905 if (concats)
4fac984f 906 strs = XOBFINISH (&str_ob, cpp_string *);
ebc03810 907
8b6866af 908 if (concats && !objc_string && !in_system_header)
909 warning (OPT_Wtraditional,
910 "traditional C rejects string constant concatenation");
dbb0cd11 911
8115b8be 912 if ((translate
ccb84981 913 ? cpp_interpret_string : cpp_interpret_string_notranslate)
924bbf02 914 (parse_in, strs, concats + 1, &istr, type))
518796ad 915 {
c1fdef8e 916 value = build_string (istr.len, (const char *) istr.text);
e47a6f81 917 free (CONST_CAST (unsigned char *, istr.text));
518796ad 918 }
919 else
920 {
ebc03810 921 /* Callers cannot generally handle error_mark_node in this context,
922 so return the empty string instead. cpp_interpret_string has
923 issued an error. */
924bbf02 924 switch (type)
925 {
926 default:
927 case CPP_STRING:
928 value = build_string (1, "");
929 break;
930 case CPP_STRING16:
931 value = build_string (TYPE_PRECISION (char16_type_node)
932 / TYPE_PRECISION (char_type_node),
933 "\0"); /* char16_t is 16 bits */
934 break;
935 case CPP_STRING32:
936 value = build_string (TYPE_PRECISION (char32_type_node)
937 / TYPE_PRECISION (char_type_node),
938 "\0\0\0"); /* char32_t is 32 bits */
939 break;
940 case CPP_WSTRING:
941 value = build_string (TYPE_PRECISION (wchar_type_node)
942 / TYPE_PRECISION (char_type_node),
943 "\0\0\0"); /* widest supported wchar_t
944 is 32 bits */
945 break;
946 }
518796ad 947 }
948
924bbf02 949 switch (type)
950 {
951 default:
952 case CPP_STRING:
953 TREE_TYPE (value) = char_array_type_node;
954 break;
955 case CPP_STRING16:
956 TREE_TYPE (value) = char16_array_type_node;
957 break;
958 case CPP_STRING32:
959 TREE_TYPE (value) = char32_array_type_node;
960 break;
961 case CPP_WSTRING:
962 TREE_TYPE (value) = wchar_array_type_node;
963 }
ebc03810 964 *valp = fix_string_type (value);
518796ad 965
61cc302f 966 if (concats)
ebc03810 967 obstack_free (&str_ob, 0);
968
924bbf02 969 return objc_string ? CPP_OBJC_STRING : type;
dbb0cd11 970}
971
8330799c 972/* Converts a (possibly wide) character constant token into a tree. */
518796ad 973static tree
2b30d46c 974lex_charconst (const cpp_token *token)
dbb0cd11 975{
13c457e1 976 cppchar_t result;
c2527f80 977 tree type, value;
8330799c 978 unsigned int chars_seen;
748f1ae5 979 int unsignedp = 0;
f5ec8cb5 980
318fdd81 981 result = cpp_interpret_charconst (parse_in, token,
2b30d46c 982 &chars_seen, &unsignedp);
c2527f80 983
13c457e1 984 if (token->type == CPP_WCHAR)
985 type = wchar_type_node;
924bbf02 986 else if (token->type == CPP_CHAR32)
987 type = char32_type_node;
988 else if (token->type == CPP_CHAR16)
989 type = char16_type_node;
13c457e1 990 /* In C, a character constant has type 'int'.
991 In C++ 'char', but multi-char charconsts have type 'int'. */
c0f19401 992 else if (!c_dialect_cxx () || chars_seen > 1)
13c457e1 993 type = integer_type_node;
994 else
995 type = char_type_node;
c2527f80 996
7c446c95 997 /* Cast to cppchar_signed_t to get correct sign-extension of RESULT
998 before possibly widening to HOST_WIDE_INT for build_int_cst. */
999 if (unsignedp || (cppchar_signed_t) result >= 0)
7016c612 1000 value = build_int_cst_wide (type, result, 0);
7c446c95 1001 else
7016c612 1002 value = build_int_cst_wide (type, (cppchar_signed_t) result, -1);
7c446c95 1003
518796ad 1004 return value;
dbb0cd11 1005}