]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/c-lex.c
re PR target/37170 (gcc.dg/weak/weak-1.c)
[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 {
711b2510
TT
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);
3c20847b 212
966e8f4d 213 input_location = new_map->start_location;
711b2510 214 (*debug_hooks->start_source_file) (line, new_map->to_file);
27e2564a
NB
215#ifndef NO_IMPLICIT_EXTERN_C
216 if (c_header_level)
217 ++c_header_level;
47d89cf3 218 else if (new_map->sysp == 2)
27e2564a
NB
219 {
220 c_header_level = 1;
221 ++pending_lang_change;
222 }
0e5921e8 223#endif
27e2564a 224 }
fbb18613 225 }
47d89cf3 226 else if (new_map->reason == LC_LEAVE)
fbb18613 227 {
0e5921e8 228#ifndef NO_IMPLICIT_EXTERN_C
47d89cf3
NB
229 if (c_header_level && --c_header_level == 0)
230 {
231 if (new_map->sysp == 2)
d4ee4d25 232 warning (0, "badly nested C headers from preprocessor");
47d89cf3
NB
233 --pending_lang_change;
234 }
47d89cf3 235#endif
966e8f4d 236 input_location = new_map->start_location;
2f6e4e97 237
70b16073 238 (*debug_hooks->end_source_file) (new_map->to_line);
e8bbfc4e 239 }
fbb18613 240
47d89cf3 241 update_header_times (new_map->to_file);
3c20847b 242 input_location = new_map->start_location;
0e5921e8 243}
8b97c5f8
ZW
244
245static void
12f9df4e 246cb_def_pragma (cpp_reader *pfile, source_location loc)
8b97c5f8
ZW
247{
248 /* Issue a warning message if we have been asked to do so. Ignore
249 unknown pragmas in system headers unless an explicit
ec5c56db 250 -Wunknown-pragmas has been given. */
8b97c5f8
ZW
251 if (warn_unknown_pragmas > in_system_header)
252 {
b6ff777c
ZW
253 const unsigned char *space, *name;
254 const cpp_token *s;
b6ff777c 255 location_t fe_loc = loc;
23356f93 256
06470238 257 space = name = (const unsigned char *) "";
4ed5bcfb 258 s = cpp_get_token (pfile);
06470238
NB
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 }
8b97c5f8 266
b9b8dde3
DD
267 warning (OPT_Wunknown_pragmas, "%Hignoring #pragma %s %s",
268 &fe_loc, space, name);
8b97c5f8
ZW
269 }
270}
0e5921e8 271
65289a3a
NB
272/* #define callback for DWARF and DWARF2 debug info. */
273static void
12f9df4e 274cb_define (cpp_reader *pfile, source_location loc, cpp_hashnode *node)
65289a3a 275{
5ffeb913 276 const struct line_map *map = linemap_lookup (line_table, loc);
12f9df4e 277 (*debug_hooks->define) (SOURCE_LINE (map, loc),
7f905405 278 (const char *) cpp_macro_definition (pfile, node));
65289a3a
NB
279}
280
281/* #undef callback for DWARF and DWARF2 debug info. */
282static void
e18476eb 283cb_undef (cpp_reader * ARG_UNUSED (pfile), source_location loc,
2f6e4e97 284 cpp_hashnode *node)
65289a3a 285{
5ffeb913 286 const struct line_map *map = linemap_lookup (line_table, loc);
12f9df4e 287 (*debug_hooks->undef) (SOURCE_LINE (map, loc),
7f905405 288 (const char *) NODE_NAME (node));
65289a3a 289}
e8bbfc4e 290\f
51e63e60
NS
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. */
e6cc3a24 294
f4086145 295enum cpp_ttype
46c2514e
TT
296c_lex_with_flags (tree *value, location_t *loc, unsigned char *cpp_flags,
297 int lex_flags)
e6cc3a24 298{
18c81520 299 static bool no_more_pch;
51e63e60
NS
300 const cpp_token *tok;
301 enum cpp_ttype type;
ab84748a 302 unsigned char add_flags = 0;
e6cc3a24 303
51e63e60 304 timevar_push (TV_CPP);
e6cc3a24 305 retry:
5ffeb913 306 tok = cpp_get_token_with_location (parse_in, loc);
5ffeb913
TT
307 type = tok->type;
308
309 retry_after_at:
51e63e60 310 switch (type)
0e5921e8 311 {
51e63e60
NS
312 case CPP_PADDING:
313 goto retry;
c22cacf3 314
0e5921e8 315 case CPP_NAME:
4ed5bcfb 316 *value = HT_IDENT_TO_GCC_IDENT (HT_NODE (tok->val.node));
0e5921e8 317 break;
fbb18613 318
0e5921e8 319 case CPP_NUMBER:
ceeedfc1
NB
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. */
e8f2b18d 327 *value = error_mark_node;
8646f3df 328 errorcount++;
ceeedfc1
NB
329 break;
330
331 case CPP_N_INTEGER:
ab84748a
VR
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;
ceeedfc1
NB
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:
366de0ce 344 gcc_unreachable ();
ceeedfc1
NB
345 }
346 }
0e5921e8 347 break;
93868d11 348
e6cc3a24
ZW
349 case CPP_ATSIGN:
350 /* An @ may give the next token special significance in Objective-C. */
e6cc3a24
ZW
351 if (c_dialect_objc ())
352 {
5ffeb913
TT
353 location_t atloc = *loc;
354 location_t newloc;
c22cacf3 355
51e63e60 356 retry_at:
5ffeb913 357 tok = cpp_get_token_with_location (parse_in, &newloc);
51e63e60
NS
358 type = tok->type;
359 switch (type)
e6cc3a24 360 {
51e63e60
NS
361 case CPP_PADDING:
362 goto retry_at;
c22cacf3 363
51e63e60
NS
364 case CPP_STRING:
365 case CPP_WSTRING:
b6baa67d
KVH
366 case CPP_STRING16:
367 case CPP_STRING32:
46c2514e 368 type = lex_string (tok, value, true, true);
51e63e60
NS
369 break;
370
e6cc3a24 371 case CPP_NAME:
51e63e60
NS
372 *value = HT_IDENT_TO_GCC_IDENT (HT_NODE (tok->val.node));
373 if (objc_is_reserved_word (*value))
e6cc3a24 374 {
51e63e60
NS
375 type = CPP_AT_NAME;
376 break;
e6cc3a24 377 }
51e63e60 378 /* FALLTHROUGH */
e6cc3a24 379
51e63e60
NS
380 default:
381 /* ... or not. */
382 error ("%Hstray %<@%> in program", &atloc);
5ffeb913 383 *loc = newloc;
51e63e60 384 goto retry_after_at;
e6cc3a24 385 }
51e63e60 386 break;
e6cc3a24
ZW
387 }
388
51e63e60
NS
389 /* FALLTHROUGH */
390 case CPP_HASH:
391 case CPP_PASTE:
392 {
393 unsigned char name[4];
c22cacf3 394
47e20491 395 *cpp_spell_token (parse_in, tok, name, true) = 0;
c22cacf3 396
51e63e60
NS
397 error ("stray %qs in program", name);
398 }
c22cacf3 399
51e63e60 400 goto retry;
e6cc3a24 401
6338b358
NB
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))
51e63e60 409 error ("stray %qc in program", (int) c);
6338b358 410 else
51e63e60 411 error ("stray %<\\%o%> in program", (int) c);
6338b358
NB
412 }
413 goto retry;
414
0e5921e8
ZW
415 case CPP_CHAR:
416 case CPP_WCHAR:
b6baa67d
KVH
417 case CPP_CHAR16:
418 case CPP_CHAR32:
4ed5bcfb 419 *value = lex_charconst (tok);
0e5921e8 420 break;
fbb18613 421
0e5921e8
ZW
422 case CPP_STRING:
423 case CPP_WSTRING:
b6baa67d
KVH
424 case CPP_STRING16:
425 case CPP_STRING32:
46c2514e 426 if ((lex_flags & C_LEX_RAW_STRINGS) == 0)
51e63e60 427 {
46c2514e
TT
428 type = lex_string (tok, value, false,
429 (lex_flags & C_LEX_STRING_NO_TRANSLATE) == 0);
51e63e60
NS
430 break;
431 }
5f754896 432 *value = build_string (tok->val.str.len, (const char *) tok->val.str.text);
bc4071dd 433 break;
51e63e60 434
c162c75e 435 case CPP_PRAGMA:
bc4071dd 436 *value = build_int_cst (NULL, tok->val.pragma);
0e5921e8 437 break;
fbb18613 438
0e5921e8
ZW
439 /* These tokens should not be visible outside cpplib. */
440 case CPP_HEADER_NAME:
441 case CPP_COMMENT:
442 case CPP_MACRO_ARG:
366de0ce 443 gcc_unreachable ();
0e5921e8 444
e6cc3a24
ZW
445 default:
446 *value = NULL_TREE;
447 break;
0e5921e8
ZW
448 }
449
51e63e60 450 if (cpp_flags)
ab84748a 451 *cpp_flags = tok->flags | add_flags;
51e63e60 452
3f75a254 453 if (!no_more_pch)
18c81520
GK
454 {
455 no_more_pch = true;
456 c_common_no_more_pch ();
457 }
c22cacf3 458
51e63e60 459 timevar_pop (TV_CPP);
c22cacf3 460
51e63e60 461 return type;
0e5921e8 462}
8d9bfdc5 463
ceeedfc1 464/* Returns the narrowest C-visible unsigned type, starting with the
5e9754af 465 minimum specified by FLAGS, that can fit HIGH:LOW, or itk_none if
ceeedfc1 466 there isn't one. */
5e9754af 467
ceeedfc1 468static enum integer_type_kind
5e9754af
NS
469narrowest_unsigned_type (unsigned HOST_WIDE_INT low,
470 unsigned HOST_WIDE_INT high,
471 unsigned int flags)
0e5921e8 472{
d75d71e0 473 int itk;
56f48ce9 474
ceeedfc1
NB
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;
e8bbfc4e 481
ceeedfc1 482 for (; itk < itk_none; itk += 2 /* skip unsigned types */)
5e9754af
NS
483 {
484 tree upper = TYPE_MAX_VALUE (integer_types[itk]);
485
3f75a254
JM
486 if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (upper) > high
487 || ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (upper) == high
5e9754af 488 && TREE_INT_CST_LOW (upper) >= low))
d75d71e0 489 return (enum integer_type_kind) itk;
5e9754af 490 }
56f48ce9 491
ceeedfc1
NB
492 return itk_none;
493}
e8bbfc4e 494
ceeedfc1
NB
495/* Ditto, but narrowest signed type. */
496static enum integer_type_kind
5e9754af
NS
497narrowest_signed_type (unsigned HOST_WIDE_INT low,
498 unsigned HOST_WIDE_INT high, unsigned int flags)
ceeedfc1 499{
d75d71e0 500 int itk;
e8bbfc4e 501
ceeedfc1
NB
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;
e8bbfc4e 508
e8bbfc4e 509
ceeedfc1 510 for (; itk < itk_none; itk += 2 /* skip signed types */)
5e9754af
NS
511 {
512 tree upper = TYPE_MAX_VALUE (integer_types[itk]);
c22cacf3 513
3f75a254
JM
514 if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (upper) > high
515 || ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (upper) == high
5e9754af 516 && TREE_INT_CST_LOW (upper) >= low))
d75d71e0 517 return (enum integer_type_kind) itk;
5e9754af 518 }
15e5ad76 519
ceeedfc1
NB
520 return itk_none;
521}
15e5ad76 522
ceeedfc1
NB
523/* Interpret TOKEN, an integer with FLAGS as classified by cpplib. */
524static tree
2f6e4e97 525interpret_integer (const cpp_token *token, unsigned int flags)
ceeedfc1
NB
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);
ceeedfc1
NB
534
535 /* The type of a constant with a U suffix is straightforward. */
536 if (flags & CPP_N_UNSIGNED)
5e9754af 537 itk = narrowest_unsigned_type (integer.low, integer.high, flags);
0e5921e8
ZW
538 else
539 {
ceeedfc1
NB
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. */
5e9754af
NS
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);
ceeedfc1
NB
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
0e5921e8 555 {
ceeedfc1
NB
556 /* In C99, decimal constants are always signed.
557 In C89, decimal constants that don't fit in long have
8d9afc4e 558 undefined behavior; we try to make them unsigned long.
ceeedfc1
NB
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)
0e5921e8 564 {
ceeedfc1 565 if (!flag_isoc99)
0e5921e8 566 {
ceeedfc1
NB
567 if (itk_u < itk_unsigned_long)
568 itk_u = itk_unsigned_long;
569 itk = itk_u;
d4ee4d25 570 warning (0, "this decimal constant is unsigned only in ISO C90");
0e5921e8 571 }
44c21c7f
DD
572 else
573 warning (OPT_Wtraditional,
574 "this decimal constant would be unsigned in ISO C90");
0e5921e8
ZW
575 }
576 }
ceeedfc1 577 }
56f48ce9 578
ceeedfc1
NB
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];
e8bbfc4e 586
ceeedfc1
NB
587 if (itk > itk_unsigned_long
588 && (flags & CPP_N_WIDTH) != CPP_N_LARGE
3f75a254 589 && !in_system_header && !flag_isoc99)
509c9d60
MLI
590 pedwarn (input_location, 0, "integer constant is too large for %qs type",
591 (flags & CPP_N_UNSIGNED) ? "unsigned long" : "long");
0468bc75 592
7d60be94 593 value = build_int_cst_wide (type, integer.low, integer.high);
e8bbfc4e 594
ceeedfc1
NB
595 /* Convert imaginary to a complex type. */
596 if (flags & CPP_N_IMAGINARY)
7d60be94 597 value = build_complex (NULL_TREE, build_int_cst (type, 0), value);
e8bbfc4e 598
ceeedfc1
NB
599 return value;
600}
e8bbfc4e 601
ceeedfc1
NB
602/* Interpret TOKEN, a floating point number with FLAGS as classified
603 by cpplib. */
604static tree
2f6e4e97 605interpret_float (const cpp_token *token, unsigned int flags)
ceeedfc1
NB
606{
607 tree type;
608 tree value;
609 REAL_VALUE_TYPE real;
610 char *copy;
611 size_t copylen;
e8bbfc4e 612
14c931f1
CF
613 /* Decode _Fract and _Accum. */
614 if (flags & CPP_N_FRACT || flags & CPP_N_ACCUM)
615 return interpret_fixed (token, flags);
616
9a8ce21f
JG
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
c77cd3d1
UB
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 }
fcf73884 644 else
509c9d60 645 pedwarn (input_location, OPT_pedantic, "non-standard suffix on floating constant");
c77cd3d1
UB
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)
ceeedfc1 651 type = long_double_type_node;
9a8ce21f
JG
652 else if ((flags & CPP_N_WIDTH) == CPP_N_SMALL
653 || flag_single_precision_constant)
ceeedfc1 654 type = float_type_node;
9a8ce21f 655 else
ceeedfc1 656 type = double_type_node;
e8bbfc4e 657
ceeedfc1
NB
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;
9a8ce21f
JG
662 if (flags & CPP_N_DFLOAT)
663 copylen -= 2;
664 else
665 {
666 if ((flags & CPP_N_WIDTH) != CPP_N_MEDIUM)
c77cd3d1 667 /* Must be an F or L or machine defined suffix. */
9a8ce21f
JG
668 copylen--;
669 if (flags & CPP_N_IMAGINARY)
670 /* I or J suffix. */
671 copylen--;
672 }
ceeedfc1 673
28dab132 674 copy = (char *) alloca (copylen + 1);
ceeedfc1
NB
675 memcpy (copy, token->val.str.text, copylen);
676 copy[copylen] = '\0';
677
9a8ce21f 678 real_from_string3 (&real, copy, TYPE_MODE (type));
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
92ef5cf9
MLI
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)))
509c9d60 687 pedwarn (input_location, 0, "floating constant exceeds range of %qT", type);
92ef5cf9
MLI
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 }
fbb18613 699
ceeedfc1
NB
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);
e8bbfc4e 704
0e5921e8 705 return value;
0e5921e8 706}
e8bbfc4e 707
14c931f1
CF
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
b6baa67d
KVH
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.
e6cc3a24 837 Returns the CPP token type of the result (CPP_STRING, CPP_WSTRING,
b6baa67d 838 CPP_STRING32, CPP_STRING16, or CPP_OBJC_STRING).
e6cc3a24
ZW
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
46c2514e 850lex_string (const cpp_token *tok, tree *valp, bool objc_string, bool translate)
0e5921e8
ZW
851{
852 tree value;
51e63e60 853 size_t concats = 0;
e6cc3a24
ZW
854 struct obstack str_ob;
855 cpp_string istr;
b6baa67d 856 enum cpp_ttype type = tok->type;
2f6e4e97 857
e6cc3a24
ZW
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;
e9a25f70 862
51e63e60
NS
863 retry:
864 tok = cpp_get_token (parse_in);
865 switch (tok->type)
e6cc3a24 866 {
51e63e60
NS
867 case CPP_PADDING:
868 goto retry;
869 case CPP_ATSIGN:
870 if (c_dialect_objc ())
0e5921e8 871 {
51e63e60
NS
872 objc_string = true;
873 goto retry;
874 }
875 /* FALLTHROUGH */
c22cacf3 876
51e63e60
NS
877 default:
878 break;
c22cacf3 879
51e63e60 880 case CPP_WSTRING:
b6baa67d
KVH
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 }
c22cacf3 890
51e63e60
NS
891 case CPP_STRING:
892 if (!concats)
893 {
894 gcc_obstack_init (&str_ob);
895 obstack_grow (&str_ob, &str, sizeof (cpp_string));
0e5921e8 896 }
c22cacf3 897
51e63e60
NS
898 concats++;
899 obstack_grow (&str_ob, &tok->val.str, sizeof (cpp_string));
900 goto retry;
e8bbfc4e
RK
901 }
902
e6cc3a24
ZW
903 /* We have read one more token than we want. */
904 _cpp_backup_tokens (parse_in, 1);
51e63e60 905 if (concats)
7973fd2a 906 strs = XOBFINISH (&str_ob, cpp_string *);
e6cc3a24 907
44c21c7f
DD
908 if (concats && !objc_string && !in_system_header)
909 warning (OPT_Wtraditional,
910 "traditional C rejects string constant concatenation");
e8bbfc4e 911
46c2514e 912 if ((translate
21526606 913 ? cpp_interpret_string : cpp_interpret_string_notranslate)
b6baa67d 914 (parse_in, strs, concats + 1, &istr, type))
0e5921e8 915 {
5f754896 916 value = build_string (istr.len, (const char *) istr.text);
b1d5455a 917 free (CONST_CAST (unsigned char *, istr.text));
0e5921e8
ZW
918 }
919 else
920 {
e6cc3a24
ZW
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. */
b6baa67d
KVH
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 }
0e5921e8
ZW
947 }
948
b6baa67d
KVH
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 }
e6cc3a24 964 *valp = fix_string_type (value);
0e5921e8 965
51e63e60 966 if (concats)
e6cc3a24
ZW
967 obstack_free (&str_ob, 0);
968
b6baa67d 969 return objc_string ? CPP_OBJC_STRING : type;
e8bbfc4e
RK
970}
971
c8a96070 972/* Converts a (possibly wide) character constant token into a tree. */
0e5921e8 973static tree
2f6e4e97 974lex_charconst (const cpp_token *token)
e8bbfc4e 975{
4268e8bb 976 cppchar_t result;
9340544b 977 tree type, value;
c8a96070 978 unsigned int chars_seen;
098b9c46 979 int unsignedp = 0;
ceeedfc1 980
a5a49440 981 result = cpp_interpret_charconst (parse_in, token,
2f6e4e97 982 &chars_seen, &unsignedp);
9340544b 983
4268e8bb
NB
984 if (token->type == CPP_WCHAR)
985 type = wchar_type_node;
b6baa67d
KVH
986 else if (token->type == CPP_CHAR32)
987 type = char32_type_node;
988 else if (token->type == CPP_CHAR16)
989 type = char16_type_node;
4268e8bb
NB
990 /* In C, a character constant has type 'int'.
991 In C++ 'char', but multi-char charconsts have type 'int'. */
37fa72e9 992 else if (!c_dialect_cxx () || chars_seen > 1)
4268e8bb
NB
993 type = integer_type_node;
994 else
995 type = char_type_node;
9340544b 996
4a90aeeb
NS
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)
7d60be94 1000 value = build_int_cst_wide (type, result, 0);
4a90aeeb 1001 else
7d60be94 1002 value = build_int_cst_wide (type, (cppchar_signed_t) result, -1);
4a90aeeb 1003
0e5921e8 1004 return value;
e8bbfc4e 1005}