]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/c-lex.c
cpp-id-data.h (UC): Was U, conflicts with U...
[thirdparty/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
2d593c86 3 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008
d4ff96d5 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
9dcd6f09 10Software Foundation; either version 3, or (at your option) any later
1322177d 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
9dcd6f09
NC
19along with GCC; see the file COPYING3. If not see
20<http://www.gnu.org/licenses/>. */
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"
c77cd3d1 43#include "target.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 51
2f6e4e97
AJ
52static tree interpret_integer (const cpp_token *, unsigned int);
53static tree interpret_float (const cpp_token *, unsigned int);
14c931f1 54static tree interpret_fixed (const cpp_token *, unsigned int);
5e9754af
NS
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);
46c2514e 59static enum cpp_ttype lex_string (const cpp_token *, tree *, bool, bool);
2f6e4e97
AJ
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 *);
e31c7eec 68\f
63973df3 69void
2f6e4e97 70init_c_lex (void)
e3d1fd32 71{
b61c5ed0 72 struct cpp_callbacks *cb;
0e5921e8
ZW
73 struct c_fileinfo *toplevel;
74
5d709b00
ZW
75 /* The get_fileinfo data structure must be initialized before
76 cpp_read_main_file is called. */
a8a05998 77 toplevel = get_fileinfo ("<top level>");
0e5921e8
ZW
78 if (flag_detailed_statistics)
79 {
80 header_time = 0;
81 body_time = get_run_time ();
82 toplevel->time = body_time;
83 }
2f6e4e97 84
b61c5ed0
NB
85 cb = cpp_get_callbacks (parse_in);
86
97293897 87 cb->line_change = cb_line_change;
b61c5ed0 88 cb->ident = cb_ident;
b61c5ed0 89 cb->def_pragma = cb_def_pragma;
17211ab5
GK
90 cb->valid_pch = c_common_valid_pch;
91 cb->read_pch = c_common_read_pch;
0e5921e8 92
65289a3a
NB
93 /* Set the debug callbacks if we can use them. */
94 if (debug_info_level == DINFO_LEVEL_VERBOSE
f8ca7e49 95 && (write_symbols == DWARF2_DEBUG
c22cacf3 96 || write_symbols == VMS_AND_DWARF2_DEBUG))
65289a3a 97 {
b61c5ed0
NB
98 cb->define = cb_define;
99 cb->undef = cb_undef;
65289a3a 100 }
e3d1fd32
PB
101}
102
0e5921e8 103struct c_fileinfo *
2f6e4e97 104get_fileinfo (const char *name)
e3d1fd32 105{
0e5921e8
ZW
106 splay_tree_node n;
107 struct c_fileinfo *fi;
108
5d709b00 109 if (!file_info_tree)
3f75a254 110 file_info_tree = splay_tree_new ((splay_tree_compare_fn) strcmp,
5d709b00 111 0,
3f75a254 112 (splay_tree_delete_value_fn) free);
5d709b00 113
0e5921e8
ZW
114 n = splay_tree_lookup (file_info_tree, (splay_tree_key) name);
115 if (n)
116 return (struct c_fileinfo *) n->value;
117
5d038c4c 118 fi = XNEW (struct c_fileinfo);
0e5921e8
ZW
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;
e56e519d 125}
e3d1fd32 126
0e5921e8 127static void
2f6e4e97 128update_header_times (const char *name)
e8bbfc4e 129{
0e5921e8
ZW
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)
e8bbfc4e 133 {
0e5921e8
ZW
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;
e8bbfc4e
RK
139 }
140}
141
0e5921e8 142static int
e18476eb 143dump_one_header (splay_tree_node n, void * ARG_UNUSED (dummy))
e8bbfc4e 144{
0e5921e8
ZW
145 print_time ((const char *) n->key,
146 ((struct c_fileinfo *) n->value)->time);
147 return 0;
e8bbfc4e 148}
e8bbfc4e
RK
149
150void
2f6e4e97 151dump_time_statistics (void)
e8bbfc4e 152{
0e5921e8
ZW
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",
3f75a254 161 (double) header_time / (double) (this_time - body_time));
0e5921e8
ZW
162 fprintf (stderr, "\n******\n");
163
164 splay_tree_foreach (file_info_tree, dump_one_header, 0);
e8bbfc4e 165}
a6124a42 166
0e5921e8 167static void
e18476eb
BI
168cb_ident (cpp_reader * ARG_UNUSED (pfile),
169 unsigned int ARG_UNUSED (line),
170 const cpp_string * ARG_UNUSED (str))
0e5921e8 171{
0e5921e8 172#ifdef ASM_OUTPUT_IDENT
3f75a254 173 if (!flag_no_ident)
0e5921e8 174 {
27e2564a 175 /* Convert escapes in the string. */
e6cc3a24 176 cpp_string cstr = { 0, 0 };
b6baa67d 177 if (cpp_interpret_string (pfile, str, 1, &cstr, CPP_STRING))
e6cc3a24 178 {
d0974745 179 ASM_OUTPUT_IDENT (asm_out_file, (const char *) cstr.text);
b1d5455a 180 free (CONST_CAST (unsigned char *, cstr.text));
e6cc3a24 181 }
0e5921e8
ZW
182 }
183#endif
27e2564a
NB
184}
185
97293897
NB
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
e18476eb 189cb_line_change (cpp_reader * ARG_UNUSED (pfile), const cpp_token *token,
7b9a5a66 190 int parsing_args)
97293897 191{
12f9df4e 192 if (token->type != CPP_EOF && !parsing_args)
3c20847b 193 input_location = token->src_loc;
97293897
NB
194}
195
23345bbb 196void
2f6e4e97 197fe_file_change (const struct line_map *new_map)
27e2564a 198{
f4b2bde7 199 if (new_map == NULL)
12f9df4e 200 return;
f4b2bde7 201
47d89cf3 202 if (new_map->reason == LC_ENTER)
fbb18613 203 {
5bea1ccf
JM
204 /* Don't stack the main buffer on the input stack;
205 we already did in compile_file. */
3f75a254 206 if (!MAIN_FILE_P (new_map))
0e5921e8 207 {
c22cacf3 208 int included_at = LAST_SOURCE_LINE_LOCATION (new_map - 1);
3c20847b 209
966e8f4d 210 input_location = new_map->start_location;
f78ce0b7 211 (*debug_hooks->start_source_file) (included_at, new_map->to_file);
27e2564a
NB
212#ifndef NO_IMPLICIT_EXTERN_C
213 if (c_header_level)
214 ++c_header_level;
47d89cf3 215 else if (new_map->sysp == 2)
27e2564a
NB
216 {
217 c_header_level = 1;
218 ++pending_lang_change;
219 }
0e5921e8 220#endif
27e2564a 221 }
fbb18613 222 }
47d89cf3 223 else if (new_map->reason == LC_LEAVE)
fbb18613 224 {
0e5921e8 225#ifndef NO_IMPLICIT_EXTERN_C
47d89cf3
NB
226 if (c_header_level && --c_header_level == 0)
227 {
228 if (new_map->sysp == 2)
d4ee4d25 229 warning (0, "badly nested C headers from preprocessor");
47d89cf3
NB
230 --pending_lang_change;
231 }
47d89cf3 232#endif
966e8f4d 233 input_location = new_map->start_location;
2f6e4e97 234
70b16073 235 (*debug_hooks->end_source_file) (new_map->to_line);
e8bbfc4e 236 }
fbb18613 237
47d89cf3
NB
238 update_header_times (new_map->to_file);
239 in_system_header = new_map->sysp != 0;
3c20847b 240 input_location = new_map->start_location;
0e5921e8 241}
8b97c5f8
ZW
242
243static void
12f9df4e 244cb_def_pragma (cpp_reader *pfile, source_location loc)
8b97c5f8
ZW
245{
246 /* Issue a warning message if we have been asked to do so. Ignore
247 unknown pragmas in system headers unless an explicit
ec5c56db 248 -Wunknown-pragmas has been given. */
8b97c5f8
ZW
249 if (warn_unknown_pragmas > in_system_header)
250 {
b6ff777c
ZW
251 const unsigned char *space, *name;
252 const cpp_token *s;
b6ff777c 253 location_t fe_loc = loc;
23356f93 254
06470238 255 space = name = (const unsigned char *) "";
4ed5bcfb 256 s = cpp_get_token (pfile);
06470238
NB
257 if (s->type != CPP_EOF)
258 {
259 space = cpp_token_as_text (pfile, s);
260 s = cpp_get_token (pfile);
261 if (s->type == CPP_NAME)
262 name = cpp_token_as_text (pfile, s);
263 }
8b97c5f8 264
b9b8dde3
DD
265 warning (OPT_Wunknown_pragmas, "%Hignoring #pragma %s %s",
266 &fe_loc, space, name);
8b97c5f8
ZW
267 }
268}
0e5921e8 269
65289a3a
NB
270/* #define callback for DWARF and DWARF2 debug info. */
271static void
12f9df4e 272cb_define (cpp_reader *pfile, source_location loc, cpp_hashnode *node)
65289a3a 273{
5ffeb913 274 const struct line_map *map = linemap_lookup (line_table, loc);
12f9df4e 275 (*debug_hooks->define) (SOURCE_LINE (map, loc),
7f905405 276 (const char *) cpp_macro_definition (pfile, node));
65289a3a
NB
277}
278
279/* #undef callback for DWARF and DWARF2 debug info. */
280static void
e18476eb 281cb_undef (cpp_reader * ARG_UNUSED (pfile), source_location loc,
2f6e4e97 282 cpp_hashnode *node)
65289a3a 283{
5ffeb913 284 const struct line_map *map = linemap_lookup (line_table, loc);
12f9df4e 285 (*debug_hooks->undef) (SOURCE_LINE (map, loc),
7f905405 286 (const char *) NODE_NAME (node));
65289a3a 287}
e8bbfc4e 288\f
51e63e60
NS
289/* Read a token and return its type. Fill *VALUE with its value, if
290 applicable. Fill *CPP_FLAGS with the token's flags, if it is
291 non-NULL. */
e6cc3a24 292
f4086145 293enum cpp_ttype
46c2514e
TT
294c_lex_with_flags (tree *value, location_t *loc, unsigned char *cpp_flags,
295 int lex_flags)
e6cc3a24 296{
18c81520 297 static bool no_more_pch;
51e63e60
NS
298 const cpp_token *tok;
299 enum cpp_ttype type;
ab84748a 300 unsigned char add_flags = 0;
e6cc3a24 301
51e63e60 302 timevar_push (TV_CPP);
e6cc3a24 303 retry:
5ffeb913 304 tok = cpp_get_token_with_location (parse_in, loc);
5ffeb913
TT
305 type = tok->type;
306
307 retry_after_at:
51e63e60 308 switch (type)
0e5921e8 309 {
51e63e60
NS
310 case CPP_PADDING:
311 goto retry;
c22cacf3 312
0e5921e8 313 case CPP_NAME:
4ed5bcfb 314 *value = HT_IDENT_TO_GCC_IDENT (HT_NODE (tok->val.node));
0e5921e8 315 break;
fbb18613 316
0e5921e8 317 case CPP_NUMBER:
ceeedfc1
NB
318 {
319 unsigned int flags = cpp_classify_number (parse_in, tok);
320
321 switch (flags & CPP_N_CATEGORY)
322 {
323 case CPP_N_INVALID:
324 /* cpplib has issued an error. */
e8f2b18d 325 *value = error_mark_node;
8646f3df 326 errorcount++;
ceeedfc1
NB
327 break;
328
329 case CPP_N_INTEGER:
ab84748a
VR
330 /* C++ uses '0' to mark virtual functions as pure.
331 Set PURE_ZERO to pass this information to the C++ parser. */
332 if (tok->val.str.len == 1 && *tok->val.str.text == '0')
333 add_flags = PURE_ZERO;
ceeedfc1
NB
334 *value = interpret_integer (tok, flags);
335 break;
336
337 case CPP_N_FLOATING:
338 *value = interpret_float (tok, flags);
339 break;
340
341 default:
366de0ce 342 gcc_unreachable ();
ceeedfc1
NB
343 }
344 }
0e5921e8 345 break;
93868d11 346
e6cc3a24
ZW
347 case CPP_ATSIGN:
348 /* An @ may give the next token special significance in Objective-C. */
e6cc3a24
ZW
349 if (c_dialect_objc ())
350 {
5ffeb913
TT
351 location_t atloc = *loc;
352 location_t newloc;
c22cacf3 353
51e63e60 354 retry_at:
5ffeb913 355 tok = cpp_get_token_with_location (parse_in, &newloc);
51e63e60
NS
356 type = tok->type;
357 switch (type)
e6cc3a24 358 {
51e63e60
NS
359 case CPP_PADDING:
360 goto retry_at;
c22cacf3 361
51e63e60
NS
362 case CPP_STRING:
363 case CPP_WSTRING:
b6baa67d
KVH
364 case CPP_STRING16:
365 case CPP_STRING32:
46c2514e 366 type = lex_string (tok, value, true, true);
51e63e60
NS
367 break;
368
e6cc3a24 369 case CPP_NAME:
51e63e60
NS
370 *value = HT_IDENT_TO_GCC_IDENT (HT_NODE (tok->val.node));
371 if (objc_is_reserved_word (*value))
e6cc3a24 372 {
51e63e60
NS
373 type = CPP_AT_NAME;
374 break;
e6cc3a24 375 }
51e63e60 376 /* FALLTHROUGH */
e6cc3a24 377
51e63e60
NS
378 default:
379 /* ... or not. */
380 error ("%Hstray %<@%> in program", &atloc);
5ffeb913 381 *loc = newloc;
51e63e60 382 goto retry_after_at;
e6cc3a24 383 }
51e63e60 384 break;
e6cc3a24
ZW
385 }
386
51e63e60
NS
387 /* FALLTHROUGH */
388 case CPP_HASH:
389 case CPP_PASTE:
390 {
391 unsigned char name[4];
c22cacf3 392
47e20491 393 *cpp_spell_token (parse_in, tok, name, true) = 0;
c22cacf3 394
51e63e60
NS
395 error ("stray %qs in program", name);
396 }
c22cacf3 397
51e63e60 398 goto retry;
e6cc3a24 399
6338b358
NB
400 case CPP_OTHER:
401 {
402 cppchar_t c = tok->val.str.text[0];
403
404 if (c == '"' || c == '\'')
405 error ("missing terminating %c character", (int) c);
406 else if (ISGRAPH (c))
51e63e60 407 error ("stray %qc in program", (int) c);
6338b358 408 else
51e63e60 409 error ("stray %<\\%o%> in program", (int) c);
6338b358
NB
410 }
411 goto retry;
412
0e5921e8
ZW
413 case CPP_CHAR:
414 case CPP_WCHAR:
b6baa67d
KVH
415 case CPP_CHAR16:
416 case CPP_CHAR32:
4ed5bcfb 417 *value = lex_charconst (tok);
0e5921e8 418 break;
fbb18613 419
0e5921e8
ZW
420 case CPP_STRING:
421 case CPP_WSTRING:
b6baa67d
KVH
422 case CPP_STRING16:
423 case CPP_STRING32:
46c2514e 424 if ((lex_flags & C_LEX_RAW_STRINGS) == 0)
51e63e60 425 {
46c2514e
TT
426 type = lex_string (tok, value, false,
427 (lex_flags & C_LEX_STRING_NO_TRANSLATE) == 0);
51e63e60
NS
428 break;
429 }
5f754896 430 *value = build_string (tok->val.str.len, (const char *) tok->val.str.text);
bc4071dd 431 break;
51e63e60 432
c162c75e 433 case CPP_PRAGMA:
bc4071dd 434 *value = build_int_cst (NULL, tok->val.pragma);
0e5921e8 435 break;
fbb18613 436
0e5921e8
ZW
437 /* These tokens should not be visible outside cpplib. */
438 case CPP_HEADER_NAME:
439 case CPP_COMMENT:
440 case CPP_MACRO_ARG:
366de0ce 441 gcc_unreachable ();
0e5921e8 442
e6cc3a24
ZW
443 default:
444 *value = NULL_TREE;
445 break;
0e5921e8
ZW
446 }
447
51e63e60 448 if (cpp_flags)
ab84748a 449 *cpp_flags = tok->flags | add_flags;
51e63e60 450
3f75a254 451 if (!no_more_pch)
18c81520
GK
452 {
453 no_more_pch = true;
454 c_common_no_more_pch ();
455 }
c22cacf3 456
51e63e60 457 timevar_pop (TV_CPP);
c22cacf3 458
51e63e60 459 return type;
0e5921e8 460}
8d9bfdc5 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
3f75a254
JM
484 if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (upper) > high
485 || ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (upper) == high
5e9754af
NS
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]);
c22cacf3 511
3f75a254
JM
512 if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (upper) > high
513 || ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (upper) == high
5e9754af
NS
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;
d4ee4d25 568 warning (0, "this decimal constant is unsigned only in ISO C90");
0e5921e8 569 }
44c21c7f
DD
570 else
571 warning (OPT_Wtraditional,
572 "this decimal constant would be unsigned in ISO C90");
0e5921e8
ZW
573 }
574 }
ceeedfc1 575 }
56f48ce9 576
ceeedfc1
NB
577 if (itk == itk_none)
578 /* cpplib has already issued a warning for overflow. */
579 type = ((flags & CPP_N_UNSIGNED)
580 ? widest_unsigned_literal_type_node
581 : widest_integer_literal_type_node);
582 else
583 type = integer_types[itk];
e8bbfc4e 584
ceeedfc1
NB
585 if (itk > itk_unsigned_long
586 && (flags & CPP_N_WIDTH) != CPP_N_LARGE
3f75a254 587 && !in_system_header && !flag_isoc99)
bda67431 588 pedwarn ("integer constant is too large for %qs type",
ceeedfc1 589 (flags & CPP_N_UNSIGNED) ? "unsigned long" : "long");
0468bc75 590
7d60be94 591 value = build_int_cst_wide (type, integer.low, integer.high);
e8bbfc4e 592
ceeedfc1
NB
593 /* Convert imaginary to a complex type. */
594 if (flags & CPP_N_IMAGINARY)
7d60be94 595 value = build_complex (NULL_TREE, build_int_cst (type, 0), value);
e8bbfc4e 596
ceeedfc1
NB
597 return value;
598}
e8bbfc4e 599
ceeedfc1
NB
600/* Interpret TOKEN, a floating point number with FLAGS as classified
601 by cpplib. */
602static tree
2f6e4e97 603interpret_float (const cpp_token *token, unsigned int flags)
ceeedfc1
NB
604{
605 tree type;
606 tree value;
607 REAL_VALUE_TYPE real;
608 char *copy;
609 size_t copylen;
e8bbfc4e 610
14c931f1
CF
611 /* Decode _Fract and _Accum. */
612 if (flags & CPP_N_FRACT || flags & CPP_N_ACCUM)
613 return interpret_fixed (token, flags);
614
9a8ce21f
JG
615 /* Decode type based on width and properties. */
616 if (flags & CPP_N_DFLOAT)
617 if ((flags & CPP_N_WIDTH) == CPP_N_LARGE)
618 type = dfloat128_type_node;
619 else if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
620 type = dfloat32_type_node;
621 else
622 type = dfloat64_type_node;
623 else
c77cd3d1
UB
624 if (flags & CPP_N_WIDTH_MD)
625 {
626 char suffix;
627 enum machine_mode mode;
628
629 if ((flags & CPP_N_WIDTH_MD) == CPP_N_MD_W)
630 suffix = 'w';
631 else
632 suffix = 'q';
633
634 mode = targetm.c.mode_for_suffix (suffix);
635 if (mode == VOIDmode)
636 {
637 error ("unsupported non-standard suffix on floating constant");
638 errorcount++;
639
640 return error_mark_node;
641 }
642 else if (pedantic)
643 pedwarn ("non-standard suffix on floating constant");
644
645 type = c_common_type_for_mode (mode, 0);
646 gcc_assert (type);
647 }
648 else if ((flags & CPP_N_WIDTH) == CPP_N_LARGE)
ceeedfc1 649 type = long_double_type_node;
9a8ce21f
JG
650 else if ((flags & CPP_N_WIDTH) == CPP_N_SMALL
651 || flag_single_precision_constant)
ceeedfc1 652 type = float_type_node;
9a8ce21f 653 else
ceeedfc1 654 type = double_type_node;
e8bbfc4e 655
ceeedfc1
NB
656 /* Copy the constant to a nul-terminated buffer. If the constant
657 has any suffixes, cut them off; REAL_VALUE_ATOF/ REAL_VALUE_HTOF
658 can't handle them. */
659 copylen = token->val.str.len;
9a8ce21f
JG
660 if (flags & CPP_N_DFLOAT)
661 copylen -= 2;
662 else
663 {
664 if ((flags & CPP_N_WIDTH) != CPP_N_MEDIUM)
c77cd3d1 665 /* Must be an F or L or machine defined suffix. */
9a8ce21f
JG
666 copylen--;
667 if (flags & CPP_N_IMAGINARY)
668 /* I or J suffix. */
669 copylen--;
670 }
ceeedfc1 671
28dab132 672 copy = (char *) alloca (copylen + 1);
ceeedfc1
NB
673 memcpy (copy, token->val.str.text, copylen);
674 copy[copylen] = '\0';
675
9a8ce21f 676 real_from_string3 (&real, copy, TYPE_MODE (type));
fbb18613 677
6d84156b
JM
678 /* Both C and C++ require a diagnostic for a floating constant
679 outside the range of representable values of its type. Since we
92ef5cf9
MLI
680 have __builtin_inf* to produce an infinity, this is now a
681 mandatory pedwarn if the target does not support infinities. */
682 if (REAL_VALUE_ISINF (real))
683 {
684 if (!MODE_HAS_INFINITIES (TYPE_MODE (type)))
685 pedwarn ("floating constant exceeds range of %qT", type);
686 else
687 warning (OPT_Woverflow, "floating constant exceeds range of %qT", type);
688 }
689 /* We also give a warning if the value underflows. */
690 else if (REAL_VALUES_EQUAL (real, dconst0))
691 {
692 REAL_VALUE_TYPE realvoidmode;
693 int overflow = real_from_string (&realvoidmode, copy);
694 if (overflow < 0 || !REAL_VALUES_EQUAL (realvoidmode, dconst0))
695 warning (OPT_Woverflow, "floating constant truncated to zero");
696 }
fbb18613 697
ceeedfc1
NB
698 /* Create a node with determined type and value. */
699 value = build_real (type, real);
700 if (flags & CPP_N_IMAGINARY)
701 value = build_complex (NULL_TREE, convert (type, integer_zero_node), value);
e8bbfc4e 702
0e5921e8 703 return value;
0e5921e8 704}
e8bbfc4e 705
14c931f1
CF
706/* Interpret TOKEN, a fixed-point number with FLAGS as classified
707 by cpplib. */
708
709static tree
710interpret_fixed (const cpp_token *token, unsigned int flags)
711{
712 tree type;
713 tree value;
714 FIXED_VALUE_TYPE fixed;
715 char *copy;
716 size_t copylen;
717
718 copylen = token->val.str.len;
719
720 if (flags & CPP_N_FRACT) /* _Fract. */
721 {
722 if (flags & CPP_N_UNSIGNED) /* Unsigned _Fract. */
723 {
724 if ((flags & CPP_N_WIDTH) == CPP_N_LARGE)
725 {
726 type = unsigned_long_long_fract_type_node;
727 copylen -= 4;
728 }
729 else if ((flags & CPP_N_WIDTH) == CPP_N_MEDIUM)
730 {
731 type = unsigned_long_fract_type_node;
732 copylen -= 3;
733 }
734 else if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
735 {
736 type = unsigned_short_fract_type_node;
737 copylen -= 3;
738 }
739 else
740 {
741 type = unsigned_fract_type_node;
742 copylen -= 2;
743 }
744 }
745 else /* Signed _Fract. */
746 {
747 if ((flags & CPP_N_WIDTH) == CPP_N_LARGE)
748 {
749 type = long_long_fract_type_node;
750 copylen -= 3;
751 }
752 else if ((flags & CPP_N_WIDTH) == CPP_N_MEDIUM)
753 {
754 type = long_fract_type_node;
755 copylen -= 2;
756 }
757 else if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
758 {
759 type = short_fract_type_node;
760 copylen -= 2;
761 }
762 else
763 {
764 type = fract_type_node;
765 copylen --;
766 }
767 }
768 }
769 else /* _Accum. */
770 {
771 if (flags & CPP_N_UNSIGNED) /* Unsigned _Accum. */
772 {
773 if ((flags & CPP_N_WIDTH) == CPP_N_LARGE)
774 {
775 type = unsigned_long_long_accum_type_node;
776 copylen -= 4;
777 }
778 else if ((flags & CPP_N_WIDTH) == CPP_N_MEDIUM)
779 {
780 type = unsigned_long_accum_type_node;
781 copylen -= 3;
782 }
783 else if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
784 {
785 type = unsigned_short_accum_type_node;
786 copylen -= 3;
787 }
788 else
789 {
790 type = unsigned_accum_type_node;
791 copylen -= 2;
792 }
793 }
794 else /* Signed _Accum. */
795 {
796 if ((flags & CPP_N_WIDTH) == CPP_N_LARGE)
797 {
798 type = long_long_accum_type_node;
799 copylen -= 3;
800 }
801 else if ((flags & CPP_N_WIDTH) == CPP_N_MEDIUM)
802 {
803 type = long_accum_type_node;
804 copylen -= 2;
805 }
806 else if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
807 {
808 type = short_accum_type_node;
809 copylen -= 2;
810 }
811 else
812 {
813 type = accum_type_node;
814 copylen --;
815 }
816 }
817 }
818
819 copy = (char *) alloca (copylen + 1);
820 memcpy (copy, token->val.str.text, copylen);
821 copy[copylen] = '\0';
822
823 fixed_from_string (&fixed, copy, TYPE_MODE (type));
824
825 /* Create a node with determined type and value. */
826 value = build_fixed (type, fixed);
827
828 return value;
829}
830
b6baa67d
KVH
831/* Convert a series of STRING, WSTRING, STRING16 and/or STRING32 tokens
832 into a tree, performing string constant concatenation. TOK is the
833 first of these. VALP is the location to write the string into.
834 OBJC_STRING indicates whether an '@' token preceded the incoming token.
e6cc3a24 835 Returns the CPP token type of the result (CPP_STRING, CPP_WSTRING,
b6baa67d 836 CPP_STRING32, CPP_STRING16, or CPP_OBJC_STRING).
e6cc3a24
ZW
837
838 This is unfortunately more work than it should be. If any of the
839 strings in the series has an L prefix, the result is a wide string
840 (6.4.5p4). Whether or not the result is a wide string affects the
841 meaning of octal and hexadecimal escapes (6.4.4.4p6,9). But escape
842 sequences do not continue across the boundary between two strings in
843 a series (6.4.5p7), so we must not lose the boundaries. Therefore
844 cpp_interpret_string takes a vector of cpp_string structures, which
845 we must arrange to provide. */
846
847static enum cpp_ttype
46c2514e 848lex_string (const cpp_token *tok, tree *valp, bool objc_string, bool translate)
0e5921e8
ZW
849{
850 tree value;
51e63e60 851 size_t concats = 0;
e6cc3a24
ZW
852 struct obstack str_ob;
853 cpp_string istr;
b6baa67d 854 enum cpp_ttype type = tok->type;
2f6e4e97 855
e6cc3a24
ZW
856 /* Try to avoid the overhead of creating and destroying an obstack
857 for the common case of just one string. */
858 cpp_string str = tok->val.str;
859 cpp_string *strs = &str;
e9a25f70 860
51e63e60
NS
861 retry:
862 tok = cpp_get_token (parse_in);
863 switch (tok->type)
e6cc3a24 864 {
51e63e60
NS
865 case CPP_PADDING:
866 goto retry;
867 case CPP_ATSIGN:
868 if (c_dialect_objc ())
0e5921e8 869 {
51e63e60
NS
870 objc_string = true;
871 goto retry;
872 }
873 /* FALLTHROUGH */
c22cacf3 874
51e63e60
NS
875 default:
876 break;
c22cacf3 877
51e63e60 878 case CPP_WSTRING:
b6baa67d
KVH
879 case CPP_STRING16:
880 case CPP_STRING32:
881 if (type != tok->type)
882 {
883 if (type == CPP_STRING)
884 type = tok->type;
885 else
886 error ("unsupported non-standard concatenation of string literals");
887 }
c22cacf3 888
51e63e60
NS
889 case CPP_STRING:
890 if (!concats)
891 {
892 gcc_obstack_init (&str_ob);
893 obstack_grow (&str_ob, &str, sizeof (cpp_string));
0e5921e8 894 }
c22cacf3 895
51e63e60
NS
896 concats++;
897 obstack_grow (&str_ob, &tok->val.str, sizeof (cpp_string));
898 goto retry;
e8bbfc4e
RK
899 }
900
e6cc3a24
ZW
901 /* We have read one more token than we want. */
902 _cpp_backup_tokens (parse_in, 1);
51e63e60 903 if (concats)
7973fd2a 904 strs = XOBFINISH (&str_ob, cpp_string *);
e6cc3a24 905
44c21c7f
DD
906 if (concats && !objc_string && !in_system_header)
907 warning (OPT_Wtraditional,
908 "traditional C rejects string constant concatenation");
e8bbfc4e 909
46c2514e 910 if ((translate
21526606 911 ? cpp_interpret_string : cpp_interpret_string_notranslate)
b6baa67d 912 (parse_in, strs, concats + 1, &istr, type))
0e5921e8 913 {
5f754896 914 value = build_string (istr.len, (const char *) istr.text);
b1d5455a 915 free (CONST_CAST (unsigned char *, istr.text));
0e5921e8
ZW
916 }
917 else
918 {
e6cc3a24
ZW
919 /* Callers cannot generally handle error_mark_node in this context,
920 so return the empty string instead. cpp_interpret_string has
921 issued an error. */
b6baa67d
KVH
922 switch (type)
923 {
924 default:
925 case CPP_STRING:
926 value = build_string (1, "");
927 break;
928 case CPP_STRING16:
929 value = build_string (TYPE_PRECISION (char16_type_node)
930 / TYPE_PRECISION (char_type_node),
931 "\0"); /* char16_t is 16 bits */
932 break;
933 case CPP_STRING32:
934 value = build_string (TYPE_PRECISION (char32_type_node)
935 / TYPE_PRECISION (char_type_node),
936 "\0\0\0"); /* char32_t is 32 bits */
937 break;
938 case CPP_WSTRING:
939 value = build_string (TYPE_PRECISION (wchar_type_node)
940 / TYPE_PRECISION (char_type_node),
941 "\0\0\0"); /* widest supported wchar_t
942 is 32 bits */
943 break;
944 }
0e5921e8
ZW
945 }
946
b6baa67d
KVH
947 switch (type)
948 {
949 default:
950 case CPP_STRING:
951 TREE_TYPE (value) = char_array_type_node;
952 break;
953 case CPP_STRING16:
954 TREE_TYPE (value) = char16_array_type_node;
955 break;
956 case CPP_STRING32:
957 TREE_TYPE (value) = char32_array_type_node;
958 break;
959 case CPP_WSTRING:
960 TREE_TYPE (value) = wchar_array_type_node;
961 }
e6cc3a24 962 *valp = fix_string_type (value);
0e5921e8 963
51e63e60 964 if (concats)
e6cc3a24
ZW
965 obstack_free (&str_ob, 0);
966
b6baa67d 967 return objc_string ? CPP_OBJC_STRING : type;
e8bbfc4e
RK
968}
969
c8a96070 970/* Converts a (possibly wide) character constant token into a tree. */
0e5921e8 971static tree
2f6e4e97 972lex_charconst (const cpp_token *token)
e8bbfc4e 973{
4268e8bb 974 cppchar_t result;
9340544b 975 tree type, value;
c8a96070 976 unsigned int chars_seen;
4268e8bb 977 int unsignedp;
ceeedfc1 978
a5a49440 979 result = cpp_interpret_charconst (parse_in, token,
2f6e4e97 980 &chars_seen, &unsignedp);
9340544b 981
4268e8bb
NB
982 if (token->type == CPP_WCHAR)
983 type = wchar_type_node;
b6baa67d
KVH
984 else if (token->type == CPP_CHAR32)
985 type = char32_type_node;
986 else if (token->type == CPP_CHAR16)
987 type = char16_type_node;
4268e8bb
NB
988 /* In C, a character constant has type 'int'.
989 In C++ 'char', but multi-char charconsts have type 'int'. */
37fa72e9 990 else if (!c_dialect_cxx () || chars_seen > 1)
4268e8bb
NB
991 type = integer_type_node;
992 else
993 type = char_type_node;
9340544b 994
4a90aeeb
NS
995 /* Cast to cppchar_signed_t to get correct sign-extension of RESULT
996 before possibly widening to HOST_WIDE_INT for build_int_cst. */
997 if (unsignedp || (cppchar_signed_t) result >= 0)
7d60be94 998 value = build_int_cst_wide (type, result, 0);
4a90aeeb 999 else
7d60be94 1000 value = build_int_cst_wide (type, (cppchar_signed_t) result, -1);
4a90aeeb 1001
0e5921e8 1002 return value;
e8bbfc4e 1003}