]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/c-family/c-lex.c
Eliminate source_location in favor of location_t
[thirdparty/gcc.git] / gcc / c-family / c-lex.c
CommitLineData
b9305c66 1/* Mainly the interface between cpplib and the C front ends.
85ec4feb 2 Copyright (C) 1987-2018 Free Software Foundation, Inc.
e8bbfc4e 3
1322177d 4This file is part of GCC.
e8bbfc4e 5
1322177d
LB
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
9dcd6f09 8Software Foundation; either version 3, or (at your option) any later
1322177d 9version.
e8bbfc4e 10
1322177d
LB
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14for more details.
e8bbfc4e
RK
15
16You should have received a copy of the GNU General Public License
9dcd6f09
NC
17along with GCC; see the file COPYING3. If not see
18<http://www.gnu.org/licenses/>. */
e8bbfc4e 19
e9a25f70 20#include "config.h"
670ee920 21#include "system.h"
4977bab6 22#include "coretypes.h"
2adfab87 23#include "target.h"
2adfab87
AM
24#include "c-common.h"
25#include "timevar.h"
d8a2d370
DN
26#include "stringpool.h"
27#include "stor-layout.h"
3d6f7931 28#include "c-pragma.h"
7f905405 29#include "debug.h"
7365279f 30#include "file-prefix-map.h" /* remap_macro_filename() */
ab87f8c8 31
42fd12b1
ESR
32#include "attribs.h"
33
0e5921e8
ZW
34/* We may keep statistics about how long which files took to compile. */
35static int header_time, body_time;
36static splay_tree file_info_tree;
3ab6dd7c 37
0e5921e8
ZW
38int pending_lang_change; /* If we need to switch languages - C++ only */
39int c_header_level; /* depth in C headers - C++ only */
0173bb6f 40
2d7aa578
ESR
41static tree interpret_integer (const cpp_token *, unsigned int,
42 enum overflow_type *);
43static tree interpret_float (const cpp_token *, unsigned int, const char *,
44 enum overflow_type *);
14c931f1 45static tree interpret_fixed (const cpp_token *, unsigned int);
5e9754af 46static enum integer_type_kind narrowest_unsigned_type
807e902e 47 (const widest_int &, unsigned int);
5e9754af 48static enum integer_type_kind narrowest_signed_type
807e902e 49 (const widest_int &, unsigned int);
46c2514e 50static enum cpp_ttype lex_string (const cpp_token *, tree *, bool, bool);
2f6e4e97
AJ
51static tree lex_charconst (const cpp_token *);
52static void update_header_times (const char *);
53static int dump_one_header (splay_tree_node, void *);
54static void cb_line_change (cpp_reader *, const cpp_token *, int);
55static void cb_ident (cpp_reader *, unsigned int, const cpp_string *);
56static void cb_def_pragma (cpp_reader *, unsigned int);
57static void cb_define (cpp_reader *, unsigned int, cpp_hashnode *);
58static void cb_undef (cpp_reader *, unsigned int, cpp_hashnode *);
e31c7eec 59\f
63973df3 60void
2f6e4e97 61init_c_lex (void)
e3d1fd32 62{
b61c5ed0 63 struct cpp_callbacks *cb;
0e5921e8
ZW
64 struct c_fileinfo *toplevel;
65
5d709b00
ZW
66 /* The get_fileinfo data structure must be initialized before
67 cpp_read_main_file is called. */
a8a05998 68 toplevel = get_fileinfo ("<top level>");
0e5921e8
ZW
69 if (flag_detailed_statistics)
70 {
71 header_time = 0;
72 body_time = get_run_time ();
73 toplevel->time = body_time;
74 }
2f6e4e97 75
b61c5ed0
NB
76 cb = cpp_get_callbacks (parse_in);
77
97293897 78 cb->line_change = cb_line_change;
b61c5ed0 79 cb->ident = cb_ident;
b61c5ed0 80 cb->def_pragma = cb_def_pragma;
17211ab5
GK
81 cb->valid_pch = c_common_valid_pch;
82 cb->read_pch = c_common_read_pch;
1f8d3e84 83 cb->has_attribute = c_common_has_attribute;
15c98b2e 84 cb->get_source_date_epoch = cb_get_source_date_epoch;
cb18fd07 85 cb->get_suggestion = cb_get_suggestion;
7365279f 86 cb->remap_filename = remap_macro_filename;
0e5921e8 87
65289a3a 88 /* Set the debug callbacks if we can use them. */
c6a13190
ILT
89 if ((debug_info_level == DINFO_LEVEL_VERBOSE
90 && (write_symbols == DWARF2_DEBUG
91 || write_symbols == VMS_AND_DWARF2_DEBUG))
92 || flag_dump_go_spec != NULL)
65289a3a 93 {
b61c5ed0
NB
94 cb->define = cb_define;
95 cb->undef = cb_undef;
65289a3a 96 }
e3d1fd32
PB
97}
98
0e5921e8 99struct c_fileinfo *
2f6e4e97 100get_fileinfo (const char *name)
e3d1fd32 101{
0e5921e8
ZW
102 splay_tree_node n;
103 struct c_fileinfo *fi;
104
5d709b00 105 if (!file_info_tree)
b0c31bc6 106 file_info_tree = splay_tree_new (splay_tree_compare_strings,
5d709b00 107 0,
b0c31bc6 108 splay_tree_delete_pointers);
5d709b00 109
0e5921e8
ZW
110 n = splay_tree_lookup (file_info_tree, (splay_tree_key) name);
111 if (n)
112 return (struct c_fileinfo *) n->value;
113
5d038c4c 114 fi = XNEW (struct c_fileinfo);
0e5921e8
ZW
115 fi->time = 0;
116 fi->interface_only = 0;
117 fi->interface_unknown = 1;
118 splay_tree_insert (file_info_tree, (splay_tree_key) name,
119 (splay_tree_value) fi);
120 return fi;
e56e519d 121}
e3d1fd32 122
0e5921e8 123static void
2f6e4e97 124update_header_times (const char *name)
e8bbfc4e 125{
0e5921e8
ZW
126 /* Changing files again. This means currently collected time
127 is charged against header time, and body time starts back at 0. */
128 if (flag_detailed_statistics)
e8bbfc4e 129 {
0e5921e8
ZW
130 int this_time = get_run_time ();
131 struct c_fileinfo *file = get_fileinfo (name);
132 header_time += this_time - body_time;
133 file->time += this_time - body_time;
134 body_time = this_time;
e8bbfc4e
RK
135 }
136}
137
0e5921e8 138static int
e18476eb 139dump_one_header (splay_tree_node n, void * ARG_UNUSED (dummy))
e8bbfc4e 140{
0e5921e8
ZW
141 print_time ((const char *) n->key,
142 ((struct c_fileinfo *) n->value)->time);
143 return 0;
e8bbfc4e 144}
e8bbfc4e
RK
145
146void
2f6e4e97 147dump_time_statistics (void)
e8bbfc4e 148{
8400e75e 149 struct c_fileinfo *file = get_fileinfo (LOCATION_FILE (input_location));
0e5921e8
ZW
150 int this_time = get_run_time ();
151 file->time += this_time - body_time;
152
153 fprintf (stderr, "\n******\n");
154 print_time ("header files (total)", header_time);
155 print_time ("main file (total)", this_time - body_time);
156 fprintf (stderr, "ratio = %g : 1\n",
3f75a254 157 (double) header_time / (double) (this_time - body_time));
0e5921e8
ZW
158 fprintf (stderr, "\n******\n");
159
160 splay_tree_foreach (file_info_tree, dump_one_header, 0);
e8bbfc4e 161}
a6124a42 162
0e5921e8 163static void
e18476eb
BI
164cb_ident (cpp_reader * ARG_UNUSED (pfile),
165 unsigned int ARG_UNUSED (line),
166 const cpp_string * ARG_UNUSED (str))
0e5921e8 167{
3f75a254 168 if (!flag_no_ident)
0e5921e8 169 {
27e2564a 170 /* Convert escapes in the string. */
e6cc3a24 171 cpp_string cstr = { 0, 0 };
b6baa67d 172 if (cpp_interpret_string (pfile, str, 1, &cstr, CPP_STRING))
e6cc3a24 173 {
a8781821 174 targetm.asm_out.output_ident ((const char *) cstr.text);
b1d5455a 175 free (CONST_CAST (unsigned char *, cstr.text));
e6cc3a24 176 }
0e5921e8 177 }
27e2564a
NB
178}
179
97293897
NB
180/* Called at the start of every non-empty line. TOKEN is the first
181 lexed token on the line. Used for diagnostic line numbers. */
182static void
e18476eb 183cb_line_change (cpp_reader * ARG_UNUSED (pfile), const cpp_token *token,
7b9a5a66 184 int parsing_args)
97293897 185{
12f9df4e 186 if (token->type != CPP_EOF && !parsing_args)
3c20847b 187 input_location = token->src_loc;
97293897
NB
188}
189
23345bbb 190void
0e50b624 191fe_file_change (const line_map_ordinary *new_map)
27e2564a 192{
f4b2bde7 193 if (new_map == NULL)
12f9df4e 194 return;
f4b2bde7 195
47d89cf3 196 if (new_map->reason == LC_ENTER)
fbb18613 197 {
5bea1ccf
JM
198 /* Don't stack the main buffer on the input stack;
199 we already did in compile_file. */
3f75a254 200 if (!MAIN_FILE_P (new_map))
0e5921e8 201 {
f10a9135 202 location_t included_at = linemap_included_from (new_map);
711b2510
TT
203 int line = 0;
204 if (included_at > BUILTINS_LOCATION)
205 line = SOURCE_LINE (new_map - 1, included_at);
3c20847b 206
966e8f4d 207 input_location = new_map->start_location;
46427374 208 (*debug_hooks->start_source_file) (line, LINEMAP_FILE (new_map));
09cff37b 209#ifdef SYSTEM_IMPLICIT_EXTERN_C
27e2564a
NB
210 if (c_header_level)
211 ++c_header_level;
d17687f6 212 else if (LINEMAP_SYSP (new_map) == 2)
27e2564a
NB
213 {
214 c_header_level = 1;
215 ++pending_lang_change;
216 }
0e5921e8 217#endif
27e2564a 218 }
fbb18613 219 }
47d89cf3 220 else if (new_map->reason == LC_LEAVE)
fbb18613 221 {
09cff37b 222#ifdef SYSTEM_IMPLICIT_EXTERN_C
47d89cf3
NB
223 if (c_header_level && --c_header_level == 0)
224 {
d17687f6 225 if (LINEMAP_SYSP (new_map) == 2)
d4ee4d25 226 warning (0, "badly nested C headers from preprocessor");
47d89cf3
NB
227 --pending_lang_change;
228 }
47d89cf3 229#endif
966e8f4d 230 input_location = new_map->start_location;
2f6e4e97 231
46427374 232 (*debug_hooks->end_source_file) (LINEMAP_LINE (new_map));
e8bbfc4e 233 }
fbb18613 234
46427374 235 update_header_times (LINEMAP_FILE (new_map));
3c20847b 236 input_location = new_map->start_location;
0e5921e8 237}
8b97c5f8
ZW
238
239static void
620e594b 240cb_def_pragma (cpp_reader *pfile, location_t loc)
8b97c5f8
ZW
241{
242 /* Issue a warning message if we have been asked to do so. Ignore
243 unknown pragmas in system headers unless an explicit
ec5c56db 244 -Wunknown-pragmas has been given. */
8400e75e 245 if (warn_unknown_pragmas > in_system_header_at (input_location))
8b97c5f8 246 {
b6ff777c
ZW
247 const unsigned char *space, *name;
248 const cpp_token *s;
b6ff777c 249 location_t fe_loc = loc;
23356f93 250
06470238 251 space = name = (const unsigned char *) "";
4ed5bcfb 252 s = cpp_get_token (pfile);
06470238
NB
253 if (s->type != CPP_EOF)
254 {
255 space = cpp_token_as_text (pfile, s);
256 s = cpp_get_token (pfile);
257 if (s->type == CPP_NAME)
258 name = cpp_token_as_text (pfile, s);
259 }
8b97c5f8 260
fab922b1
MLI
261 warning_at (fe_loc, OPT_Wunknown_pragmas, "ignoring #pragma %s %s",
262 space, name);
8b97c5f8
ZW
263 }
264}
0e5921e8 265
65289a3a
NB
266/* #define callback for DWARF and DWARF2 debug info. */
267static void
620e594b 268cb_define (cpp_reader *pfile, location_t loc, cpp_hashnode *node)
65289a3a 269{
5ffeb913 270 const struct line_map *map = linemap_lookup (line_table, loc);
0e50b624 271 (*debug_hooks->define) (SOURCE_LINE (linemap_check_ordinary (map), loc),
7f905405 272 (const char *) cpp_macro_definition (pfile, node));
65289a3a
NB
273}
274
275/* #undef callback for DWARF and DWARF2 debug info. */
276static void
620e594b 277cb_undef (cpp_reader * ARG_UNUSED (pfile), location_t loc,
2f6e4e97 278 cpp_hashnode *node)
65289a3a 279{
5ffeb913 280 const struct line_map *map = linemap_lookup (line_table, loc);
0e50b624 281 (*debug_hooks->undef) (SOURCE_LINE (linemap_check_ordinary (map), loc),
7f905405 282 (const char *) NODE_NAME (node));
65289a3a 283}
42fd12b1 284
1f8d3e84
JJ
285/* Wrapper around cpp_get_token to skip CPP_PADDING tokens
286 and not consume CPP_EOF. */
287static const cpp_token *
288get_token_no_padding (cpp_reader *pfile)
289{
290 for (;;)
291 {
292 const cpp_token *ret = cpp_peek_token (pfile, 0);
293 if (ret->type == CPP_EOF)
294 return ret;
295 ret = cpp_get_token (pfile);
296 if (ret->type != CPP_PADDING)
297 return ret;
298 }
299}
300
42fd12b1 301/* Callback for has_attribute. */
1f8d3e84
JJ
302int
303c_common_has_attribute (cpp_reader *pfile)
42fd12b1
ESR
304{
305 int result = 0;
1f8d3e84 306 tree attr_name = NULL_TREE;
42fd12b1
ESR
307 const cpp_token *token;
308
1f8d3e84
JJ
309 token = get_token_no_padding (pfile);
310 if (token->type != CPP_OPEN_PAREN)
42fd12b1 311 {
1f8d3e84
JJ
312 cpp_error (pfile, CPP_DL_ERROR,
313 "missing '(' after \"__has_attribute\"");
314 return 0;
42fd12b1 315 }
1f8d3e84 316 token = get_token_no_padding (pfile);
42fd12b1
ESR
317 if (token->type == CPP_NAME)
318 {
1f8d3e84
JJ
319 attr_name = get_identifier ((const char *)
320 cpp_token_as_text (pfile, token));
577eec56 321 attr_name = canonicalize_attr_name (attr_name);
1f8d3e84 322 if (c_dialect_cxx ())
42fd12b1 323 {
1f8d3e84
JJ
324 int idx = 0;
325 const cpp_token *nxt_token;
326 do
327 nxt_token = cpp_peek_token (pfile, idx++);
328 while (nxt_token->type == CPP_PADDING);
329 if (nxt_token->type == CPP_SCOPE)
42fd12b1 330 {
1f8d3e84
JJ
331 get_token_no_padding (pfile); // Eat scope.
332 nxt_token = get_token_no_padding (pfile);
333 if (nxt_token->type == CPP_NAME)
334 {
335 tree attr_ns = attr_name;
336 tree attr_id
337 = get_identifier ((const char *)
338 cpp_token_as_text (pfile, nxt_token));
339 attr_name = build_tree_list (attr_ns, attr_id);
340 }
341 else
342 {
343 cpp_error (pfile, CPP_DL_ERROR,
344 "attribute identifier required after scope");
345 attr_name = NULL_TREE;
346 }
42fd12b1 347 }
d067e05f 348 else
42fd12b1 349 {
d067e05f 350 /* Some standard attributes need special handling. */
1f8d3e84 351 if (is_attribute_p ("noreturn", attr_name))
42fd12b1 352 result = 200809;
1f8d3e84 353 else if (is_attribute_p ("deprecated", attr_name))
42fd12b1 354 result = 201309;
b632761d 355 else if (is_attribute_p ("maybe_unused", attr_name)
c6147dc4
MP
356 || is_attribute_p ("nodiscard", attr_name)
357 || is_attribute_p ("fallthrough", attr_name))
d067e05f 358 result = 201603;
bedf03a2 359 else if (is_attribute_p ("no_unique_address", attr_name))
46c62690 360 result = 201803;
d067e05f
JM
361 if (result)
362 attr_name = NULL_TREE;
42fd12b1
ESR
363 }
364 }
d067e05f
JM
365 if (attr_name)
366 {
367 init_attributes ();
368 const struct attribute_spec *attr = lookup_attribute_spec (attr_name);
369 if (attr)
370 result = 1;
371 }
42fd12b1
ESR
372 }
373 else
1f8d3e84
JJ
374 {
375 cpp_error (pfile, CPP_DL_ERROR,
376 "macro \"__has_attribute\" requires an identifier");
377 return 0;
378 }
42fd12b1 379
1f8d3e84 380 if (get_token_no_padding (pfile)->type != CPP_CLOSE_PAREN)
42fd12b1 381 cpp_error (pfile, CPP_DL_ERROR,
1f8d3e84 382 "missing ')' after \"__has_attribute\"");
42fd12b1
ESR
383
384 return result;
385}
e8bbfc4e 386\f
51e63e60
NS
387/* Read a token and return its type. Fill *VALUE with its value, if
388 applicable. Fill *CPP_FLAGS with the token's flags, if it is
389 non-NULL. */
e6cc3a24 390
f4086145 391enum cpp_ttype
46c2514e
TT
392c_lex_with_flags (tree *value, location_t *loc, unsigned char *cpp_flags,
393 int lex_flags)
e6cc3a24 394{
18c81520 395 static bool no_more_pch;
51e63e60
NS
396 const cpp_token *tok;
397 enum cpp_ttype type;
ab84748a 398 unsigned char add_flags = 0;
2d7aa578 399 enum overflow_type overflow = OT_NONE;
e6cc3a24 400
51e63e60 401 timevar_push (TV_CPP);
e6cc3a24 402 retry:
5ffeb913 403 tok = cpp_get_token_with_location (parse_in, loc);
5ffeb913
TT
404 type = tok->type;
405
406 retry_after_at:
51e63e60 407 switch (type)
0e5921e8 408 {
51e63e60
NS
409 case CPP_PADDING:
410 goto retry;
c22cacf3 411
0e5921e8 412 case CPP_NAME:
9a0c6187 413 *value = HT_IDENT_TO_GCC_IDENT (HT_NODE (tok->val.node.node));
0e5921e8 414 break;
fbb18613 415
0e5921e8 416 case CPP_NUMBER:
ceeedfc1 417 {
3ce4f9e4 418 const char *suffix = NULL;
0b2c4be5 419 unsigned int flags = cpp_classify_number (parse_in, tok, &suffix, *loc);
ceeedfc1
NB
420
421 switch (flags & CPP_N_CATEGORY)
422 {
423 case CPP_N_INVALID:
424 /* cpplib has issued an error. */
e8f2b18d 425 *value = error_mark_node;
ceeedfc1
NB
426 break;
427
428 case CPP_N_INTEGER:
ab84748a
VR
429 /* C++ uses '0' to mark virtual functions as pure.
430 Set PURE_ZERO to pass this information to the C++ parser. */
431 if (tok->val.str.len == 1 && *tok->val.str.text == '0')
432 add_flags = PURE_ZERO;
2d7aa578 433 *value = interpret_integer (tok, flags, &overflow);
ceeedfc1
NB
434 break;
435
436 case CPP_N_FLOATING:
2d7aa578 437 *value = interpret_float (tok, flags, suffix, &overflow);
ceeedfc1
NB
438 break;
439
440 default:
366de0ce 441 gcc_unreachable ();
ceeedfc1 442 }
3ce4f9e4
ESR
443
444 if (flags & CPP_N_USERDEF)
445 {
573ac65e
WB
446 char *str;
447 tree literal;
3ce4f9e4
ESR
448 tree suffix_id = get_identifier (suffix);
449 int len = tok->val.str.len - strlen (suffix);
1ca3916f
JM
450 /* If this is going to be used as a C string to pass to a
451 raw literal operator, we need to add a trailing NUL. */
3ce4f9e4
ESR
452 tree num_string = build_string (len + 1,
453 (const char *) tok->val.str.text);
454 TREE_TYPE (num_string) = char_array_type_node;
455 num_string = fix_string_type (num_string);
573ac65e 456 str = CONST_CAST (char *, TREE_STRING_POINTER (num_string));
3ce4f9e4 457 str[len] = '\0';
2d7aa578
ESR
458 literal = build_userdef_literal (suffix_id, *value, overflow,
459 num_string);
3ce4f9e4
ESR
460 *value = literal;
461 }
ceeedfc1 462 }
0e5921e8 463 break;
93868d11 464
e6cc3a24
ZW
465 case CPP_ATSIGN:
466 /* An @ may give the next token special significance in Objective-C. */
e6cc3a24
ZW
467 if (c_dialect_objc ())
468 {
5ffeb913
TT
469 location_t atloc = *loc;
470 location_t newloc;
c22cacf3 471
51e63e60 472 retry_at:
5ffeb913 473 tok = cpp_get_token_with_location (parse_in, &newloc);
51e63e60
NS
474 type = tok->type;
475 switch (type)
e6cc3a24 476 {
51e63e60
NS
477 case CPP_PADDING:
478 goto retry_at;
c22cacf3 479
51e63e60
NS
480 case CPP_STRING:
481 case CPP_WSTRING:
b6baa67d
KVH
482 case CPP_STRING16:
483 case CPP_STRING32:
2c6e3f55 484 case CPP_UTF8STRING:
46c2514e 485 type = lex_string (tok, value, true, true);
51e63e60
NS
486 break;
487
e6cc3a24 488 case CPP_NAME:
9a0c6187 489 *value = HT_IDENT_TO_GCC_IDENT (HT_NODE (tok->val.node.node));
1973201f
NP
490 if (OBJC_IS_AT_KEYWORD (C_RID_CODE (*value))
491 || OBJC_IS_CXX_KEYWORD (C_RID_CODE (*value)))
e6cc3a24 492 {
51e63e60 493 type = CPP_AT_NAME;
49b91f05
NP
494 /* Note the complication: if we found an OBJC_CXX
495 keyword, for example, 'class', we will be
496 returning a token of type CPP_AT_NAME and rid
497 code RID_CLASS (not RID_AT_CLASS). The language
498 parser needs to convert that to RID_AT_CLASS.
499 */
51e63e60 500 break;
e6cc3a24 501 }
51e63e60 502 /* FALLTHROUGH */
e6cc3a24 503
51e63e60
NS
504 default:
505 /* ... or not. */
fab922b1 506 error_at (atloc, "stray %<@%> in program");
5ffeb913 507 *loc = newloc;
51e63e60 508 goto retry_after_at;
e6cc3a24 509 }
51e63e60 510 break;
e6cc3a24
ZW
511 }
512
51e63e60
NS
513 /* FALLTHROUGH */
514 case CPP_HASH:
515 case CPP_PASTE:
516 {
065312cf 517 unsigned char name[8];
c22cacf3 518
47e20491 519 *cpp_spell_token (parse_in, tok, name, true) = 0;
c22cacf3 520
0b2c4be5 521 error_at (*loc, "stray %qs in program", name);
51e63e60 522 }
c22cacf3 523
51e63e60 524 goto retry;
e6cc3a24 525
6338b358
NB
526 case CPP_OTHER:
527 {
528 cppchar_t c = tok->val.str.text[0];
529
530 if (c == '"' || c == '\'')
584a7c46 531 error_at (*loc, "missing terminating %c character", (int) c);
6338b358 532 else if (ISGRAPH (c))
584a7c46 533 error_at (*loc, "stray %qc in program", (int) c);
6338b358 534 else
584a7c46 535 error_at (*loc, "stray %<\\%o%> in program", (int) c);
6338b358
NB
536 }
537 goto retry;
538
3ce4f9e4
ESR
539 case CPP_CHAR_USERDEF:
540 case CPP_WCHAR_USERDEF:
541 case CPP_CHAR16_USERDEF:
542 case CPP_CHAR32_USERDEF:
fe95b036 543 case CPP_UTF8CHAR_USERDEF:
3ce4f9e4
ESR
544 {
545 tree literal;
546 cpp_token temp_tok = *tok;
547 const char *suffix = cpp_get_userdef_suffix (tok);
548 temp_tok.val.str.len -= strlen (suffix);
549 temp_tok.type = cpp_userdef_char_remove_type (type);
550 literal = build_userdef_literal (get_identifier (suffix),
2d7aa578
ESR
551 lex_charconst (&temp_tok),
552 OT_NONE, NULL_TREE);
3ce4f9e4
ESR
553 *value = literal;
554 }
555 break;
556
0e5921e8
ZW
557 case CPP_CHAR:
558 case CPP_WCHAR:
b6baa67d
KVH
559 case CPP_CHAR16:
560 case CPP_CHAR32:
fe95b036 561 case CPP_UTF8CHAR:
4ed5bcfb 562 *value = lex_charconst (tok);
0e5921e8 563 break;
fbb18613 564
3ce4f9e4
ESR
565 case CPP_STRING_USERDEF:
566 case CPP_WSTRING_USERDEF:
567 case CPP_STRING16_USERDEF:
568 case CPP_STRING32_USERDEF:
569 case CPP_UTF8STRING_USERDEF:
570 {
571 tree literal, string;
572 const char *suffix = cpp_get_userdef_suffix (tok);
573 string = build_string (tok->val.str.len - strlen (suffix),
574 (const char *) tok->val.str.text);
575 literal = build_userdef_literal (get_identifier (suffix),
2d7aa578 576 string, OT_NONE, NULL_TREE);
3ce4f9e4
ESR
577 *value = literal;
578 }
579 break;
580
0e5921e8
ZW
581 case CPP_STRING:
582 case CPP_WSTRING:
b6baa67d
KVH
583 case CPP_STRING16:
584 case CPP_STRING32:
2c6e3f55
JJ
585 case CPP_UTF8STRING:
586 if ((lex_flags & C_LEX_STRING_NO_JOIN) == 0)
51e63e60 587 {
46c2514e
TT
588 type = lex_string (tok, value, false,
589 (lex_flags & C_LEX_STRING_NO_TRANSLATE) == 0);
51e63e60
NS
590 break;
591 }
5f754896 592 *value = build_string (tok->val.str.len, (const char *) tok->val.str.text);
bc4071dd 593 break;
b8698a0f 594
c162c75e 595 case CPP_PRAGMA:
c62c040f 596 *value = build_int_cst (integer_type_node, tok->val.pragma);
0e5921e8 597 break;
fbb18613 598
0e5921e8
ZW
599 /* These tokens should not be visible outside cpplib. */
600 case CPP_HEADER_NAME:
0e5921e8 601 case CPP_MACRO_ARG:
366de0ce 602 gcc_unreachable ();
0e5921e8 603
7bad794a
JJ
604 /* CPP_COMMENT will appear when compiling with -C. Ignore, except
605 when it is a FALLTHROUGH comment, in that case set
606 PREV_FALLTHROUGH flag on the next non-comment token. */
607 case CPP_COMMENT:
608 if (tok->flags & PREV_FALLTHROUGH)
609 {
610 do
611 {
612 tok = cpp_get_token_with_location (parse_in, loc);
613 type = tok->type;
614 }
615 while (type == CPP_PADDING || type == CPP_COMMENT);
616 add_flags |= PREV_FALLTHROUGH;
617 goto retry_after_at;
618 }
9cc54940
AC
619 goto retry;
620
e6cc3a24
ZW
621 default:
622 *value = NULL_TREE;
623 break;
0e5921e8
ZW
624 }
625
51e63e60 626 if (cpp_flags)
ab84748a 627 *cpp_flags = tok->flags | add_flags;
51e63e60 628
3f75a254 629 if (!no_more_pch)
18c81520
GK
630 {
631 no_more_pch = true;
632 c_common_no_more_pch ();
633 }
c22cacf3 634
51e63e60 635 timevar_pop (TV_CPP);
c22cacf3 636
51e63e60 637 return type;
0e5921e8 638}
8d9bfdc5 639
ceeedfc1 640/* Returns the narrowest C-visible unsigned type, starting with the
5e9754af 641 minimum specified by FLAGS, that can fit HIGH:LOW, or itk_none if
ceeedfc1 642 there isn't one. */
5e9754af 643
ceeedfc1 644static enum integer_type_kind
807e902e 645narrowest_unsigned_type (const widest_int &val, unsigned int flags)
0e5921e8 646{
d75d71e0 647 int itk;
56f48ce9 648
ceeedfc1
NB
649 if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
650 itk = itk_unsigned_int;
651 else if ((flags & CPP_N_WIDTH) == CPP_N_MEDIUM)
652 itk = itk_unsigned_long;
653 else
654 itk = itk_unsigned_long_long;
e8bbfc4e 655
ceeedfc1 656 for (; itk < itk_none; itk += 2 /* skip unsigned types */)
5e9754af 657 {
64c31785
KT
658 tree upper;
659
660 if (integer_types[itk] == NULL_TREE)
661 continue;
662 upper = TYPE_MAX_VALUE (integer_types[itk]);
5e9754af 663
807e902e 664 if (wi::geu_p (wi::to_widest (upper), val))
d75d71e0 665 return (enum integer_type_kind) itk;
5e9754af 666 }
56f48ce9 667
ceeedfc1
NB
668 return itk_none;
669}
e8bbfc4e 670
ceeedfc1
NB
671/* Ditto, but narrowest signed type. */
672static enum integer_type_kind
807e902e 673narrowest_signed_type (const widest_int &val, unsigned int flags)
ceeedfc1 674{
d75d71e0 675 int itk;
e8bbfc4e 676
ceeedfc1
NB
677 if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
678 itk = itk_int;
679 else if ((flags & CPP_N_WIDTH) == CPP_N_MEDIUM)
680 itk = itk_long;
681 else
682 itk = itk_long_long;
e8bbfc4e 683
ceeedfc1 684 for (; itk < itk_none; itk += 2 /* skip signed types */)
5e9754af 685 {
64c31785
KT
686 tree upper;
687
688 if (integer_types[itk] == NULL_TREE)
689 continue;
690 upper = TYPE_MAX_VALUE (integer_types[itk]);
c22cacf3 691
807e902e 692 if (wi::geu_p (wi::to_widest (upper), val))
d75d71e0 693 return (enum integer_type_kind) itk;
5e9754af 694 }
15e5ad76 695
ceeedfc1
NB
696 return itk_none;
697}
15e5ad76 698
ceeedfc1
NB
699/* Interpret TOKEN, an integer with FLAGS as classified by cpplib. */
700static tree
2d7aa578
ESR
701interpret_integer (const cpp_token *token, unsigned int flags,
702 enum overflow_type *overflow)
ceeedfc1
NB
703{
704 tree value, type;
705 enum integer_type_kind itk;
706 cpp_num integer;
807e902e 707 HOST_WIDE_INT ival[3];
ceeedfc1 708
2d7aa578
ESR
709 *overflow = OT_NONE;
710
ceeedfc1 711 integer = cpp_interpret_integer (parse_in, token, flags);
2d7aa578
ESR
712 if (integer.overflow)
713 *overflow = OT_OVERFLOW;
ceeedfc1 714
807e902e
KZ
715 ival[0] = integer.low;
716 ival[1] = integer.high;
717 ival[2] = 0;
718 widest_int wval = widest_int::from_array (ival, 3);
719
ceeedfc1
NB
720 /* The type of a constant with a U suffix is straightforward. */
721 if (flags & CPP_N_UNSIGNED)
807e902e 722 itk = narrowest_unsigned_type (wval, flags);
0e5921e8
ZW
723 else
724 {
ceeedfc1
NB
725 /* The type of a potentially-signed integer constant varies
726 depending on the base it's in, the standard in use, and the
727 length suffixes. */
5e9754af 728 enum integer_type_kind itk_u
807e902e 729 = narrowest_unsigned_type (wval, flags);
5e9754af 730 enum integer_type_kind itk_s
807e902e 731 = narrowest_signed_type (wval, flags);
ceeedfc1
NB
732
733 /* In both C89 and C99, octal and hex constants may be signed or
734 unsigned, whichever fits tighter. We do not warn about this
735 choice differing from the traditional choice, as the constant
736 is probably a bit pattern and either way will work. */
737 if ((flags & CPP_N_RADIX) != CPP_N_DECIMAL)
738 itk = MIN (itk_u, itk_s);
739 else
0e5921e8 740 {
ceeedfc1
NB
741 /* In C99, decimal constants are always signed.
742 In C89, decimal constants that don't fit in long have
8d9afc4e 743 undefined behavior; we try to make them unsigned long.
ceeedfc1
NB
744 In GCC's extended C89, that last is true of decimal
745 constants that don't fit in long long, too. */
746
747 itk = itk_s;
748 if (itk_s > itk_u && itk_s > itk_long)
0e5921e8 749 {
ceeedfc1 750 if (!flag_isoc99)
0e5921e8 751 {
ceeedfc1
NB
752 if (itk_u < itk_unsigned_long)
753 itk_u = itk_unsigned_long;
754 itk = itk_u;
d4ee4d25 755 warning (0, "this decimal constant is unsigned only in ISO C90");
0e5921e8 756 }
44c21c7f
DD
757 else
758 warning (OPT_Wtraditional,
759 "this decimal constant would be unsigned in ISO C90");
0e5921e8
ZW
760 }
761 }
ceeedfc1 762 }
56f48ce9 763
ceeedfc1
NB
764 if (itk == itk_none)
765 /* cpplib has already issued a warning for overflow. */
766 type = ((flags & CPP_N_UNSIGNED)
767 ? widest_unsigned_literal_type_node
768 : widest_integer_literal_type_node);
769 else
9c650d90
MLI
770 {
771 type = integer_types[itk];
772 if (itk > itk_unsigned_long
773 && (flags & CPP_N_WIDTH) != CPP_N_LARGE)
b8698a0f 774 emit_diagnostic
9c650d90
MLI
775 ((c_dialect_cxx () ? cxx_dialect == cxx98 : !flag_isoc99)
776 ? DK_PEDWARN : DK_WARNING,
777 input_location, OPT_Wlong_long,
b8698a0f 778 (flags & CPP_N_UNSIGNED)
9c650d90
MLI
779 ? "integer constant is too large for %<unsigned long%> type"
780 : "integer constant is too large for %<long%> type");
781 }
0468bc75 782
807e902e 783 value = wide_int_to_tree (type, wval);
e8bbfc4e 784
ceeedfc1
NB
785 /* Convert imaginary to a complex type. */
786 if (flags & CPP_N_IMAGINARY)
7d60be94 787 value = build_complex (NULL_TREE, build_int_cst (type, 0), value);
e8bbfc4e 788
ceeedfc1
NB
789 return value;
790}
e8bbfc4e 791
ceeedfc1 792/* Interpret TOKEN, a floating point number with FLAGS as classified
36a85135 793 by cpplib. For C++11 SUFFIX may contain a user-defined literal suffix. */
ceeedfc1 794static tree
3ce4f9e4 795interpret_float (const cpp_token *token, unsigned int flags,
2d7aa578 796 const char *suffix, enum overflow_type *overflow)
ceeedfc1
NB
797{
798 tree type;
8ce94e44 799 tree const_type;
ceeedfc1
NB
800 tree value;
801 REAL_VALUE_TYPE real;
8ce94e44 802 REAL_VALUE_TYPE real_trunc;
ceeedfc1
NB
803 char *copy;
804 size_t copylen;
e8bbfc4e 805
2d7aa578
ESR
806 *overflow = OT_NONE;
807
6ec637a4
JJ
808 /* Default (no suffix) depends on whether the FLOAT_CONST_DECIMAL64
809 pragma has been used and is either double or _Decimal64. Types
810 that are not allowed with decimal float default to double. */
839a3b8a
JJ
811 if (flags & CPP_N_DEFAULT)
812 {
813 flags ^= CPP_N_DEFAULT;
814 flags |= CPP_N_MEDIUM;
6ec637a4
JJ
815
816 if (((flags & CPP_N_HEX) == 0) && ((flags & CPP_N_IMAGINARY) == 0))
817 {
818 warning (OPT_Wunsuffixed_float_constants,
819 "unsuffixed float constant");
820 if (float_const_decimal64_p ())
821 flags |= CPP_N_DFLOAT;
822 }
839a3b8a
JJ
823 }
824
14c931f1
CF
825 /* Decode _Fract and _Accum. */
826 if (flags & CPP_N_FRACT || flags & CPP_N_ACCUM)
827 return interpret_fixed (token, flags);
828
9a8ce21f
JG
829 /* Decode type based on width and properties. */
830 if (flags & CPP_N_DFLOAT)
831 if ((flags & CPP_N_WIDTH) == CPP_N_LARGE)
832 type = dfloat128_type_node;
833 else if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
834 type = dfloat32_type_node;
835 else
836 type = dfloat64_type_node;
837 else
c77cd3d1
UB
838 if (flags & CPP_N_WIDTH_MD)
839 {
840 char suffix;
ef4bddc2 841 machine_mode mode;
c77cd3d1
UB
842
843 if ((flags & CPP_N_WIDTH_MD) == CPP_N_MD_W)
844 suffix = 'w';
845 else
846 suffix = 'q';
847
848 mode = targetm.c.mode_for_suffix (suffix);
849 if (mode == VOIDmode)
850 {
851 error ("unsupported non-standard suffix on floating constant");
c77cd3d1
UB
852
853 return error_mark_node;
854 }
fcf73884 855 else
c1771a20 856 pedwarn (input_location, OPT_Wpedantic, "non-standard suffix on floating constant");
c77cd3d1
UB
857
858 type = c_common_type_for_mode (mode, 0);
859 gcc_assert (type);
860 }
c65699ef
JM
861 else if ((flags & (CPP_N_FLOATN | CPP_N_FLOATNX)) != 0)
862 {
863 unsigned int n = (flags & CPP_N_WIDTH_FLOATN_NX) >> CPP_FLOATN_SHIFT;
864 bool extended = (flags & CPP_N_FLOATNX) != 0;
865 type = NULL_TREE;
866 for (int i = 0; i < NUM_FLOATN_NX_TYPES; i++)
867 if (floatn_nx_types[i].n == (int) n
868 && floatn_nx_types[i].extended == extended)
869 {
870 type = FLOATN_NX_TYPE_NODE (i);
871 break;
872 }
873 if (type == NULL_TREE)
874 {
875 error ("unsupported non-standard suffix on floating constant");
876 return error_mark_node;
877 }
878 else
879 pedwarn (input_location, OPT_Wpedantic, "non-standard suffix on floating constant");
880 }
c77cd3d1 881 else if ((flags & CPP_N_WIDTH) == CPP_N_LARGE)
ceeedfc1 882 type = long_double_type_node;
9a8ce21f
JG
883 else if ((flags & CPP_N_WIDTH) == CPP_N_SMALL
884 || flag_single_precision_constant)
ceeedfc1 885 type = float_type_node;
9a8ce21f 886 else
ceeedfc1 887 type = double_type_node;
e8bbfc4e 888
8ce94e44
JM
889 const_type = excess_precision_type (type);
890 if (!const_type)
891 const_type = type;
892
ceeedfc1
NB
893 /* Copy the constant to a nul-terminated buffer. If the constant
894 has any suffixes, cut them off; REAL_VALUE_ATOF/ REAL_VALUE_HTOF
895 can't handle them. */
896 copylen = token->val.str.len;
3ce4f9e4
ESR
897 if (flags & CPP_N_USERDEF)
898 copylen -= strlen (suffix);
899 else if (flags & CPP_N_DFLOAT)
9a8ce21f 900 copylen -= 2;
b8698a0f 901 else
9a8ce21f
JG
902 {
903 if ((flags & CPP_N_WIDTH) != CPP_N_MEDIUM)
c77cd3d1 904 /* Must be an F or L or machine defined suffix. */
9a8ce21f
JG
905 copylen--;
906 if (flags & CPP_N_IMAGINARY)
907 /* I or J suffix. */
908 copylen--;
c65699ef
JM
909 if (flags & CPP_N_FLOATNX)
910 copylen--;
911 if (flags & (CPP_N_FLOATN | CPP_N_FLOATNX))
912 {
913 unsigned int n = (flags & CPP_N_WIDTH_FLOATN_NX) >> CPP_FLOATN_SHIFT;
914 while (n > 0)
915 {
916 copylen--;
917 n /= 10;
918 }
919 }
9a8ce21f 920 }
ceeedfc1 921
28dab132 922 copy = (char *) alloca (copylen + 1);
7057e645
ESR
923 if (cxx_dialect > cxx11)
924 {
925 size_t maxlen = 0;
926 for (size_t i = 0; i < copylen; ++i)
927 if (token->val.str.text[i] != '\'')
928 copy[maxlen++] = token->val.str.text[i];
929 copy[maxlen] = '\0';
930 }
931 else
932 {
933 memcpy (copy, token->val.str.text, copylen);
934 copy[copylen] = '\0';
935 }
ceeedfc1 936
8ce94e44
JM
937 real_from_string3 (&real, copy, TYPE_MODE (const_type));
938 if (const_type != type)
939 /* Diagnosing if the result of converting the value with excess
940 precision to the semantic type would overflow (with associated
941 double rounding) is more appropriate than diagnosing if the
942 result of converting the string directly to the semantic type
943 would overflow. */
944 real_convert (&real_trunc, TYPE_MODE (type), &real);
fbb18613 945
6d84156b
JM
946 /* Both C and C++ require a diagnostic for a floating constant
947 outside the range of representable values of its type. Since we
92ef5cf9
MLI
948 have __builtin_inf* to produce an infinity, this is now a
949 mandatory pedwarn if the target does not support infinities. */
8ce94e44
JM
950 if (REAL_VALUE_ISINF (real)
951 || (const_type != type && REAL_VALUE_ISINF (real_trunc)))
92ef5cf9 952 {
2d7aa578
ESR
953 *overflow = OT_OVERFLOW;
954 if (!(flags & CPP_N_USERDEF))
955 {
956 if (!MODE_HAS_INFINITIES (TYPE_MODE (type)))
957 pedwarn (input_location, 0,
958 "floating constant exceeds range of %qT", type);
959 else
960 warning (OPT_Woverflow,
961 "floating constant exceeds range of %qT", type);
962 }
92ef5cf9
MLI
963 }
964 /* We also give a warning if the value underflows. */
624d31fe 965 else if (real_equal (&real, &dconst0)
2d7aa578 966 || (const_type != type
624d31fe 967 && real_equal (&real_trunc, &dconst0)))
92ef5cf9
MLI
968 {
969 REAL_VALUE_TYPE realvoidmode;
2d7aa578
ESR
970 int oflow = real_from_string (&realvoidmode, copy);
971 *overflow = (oflow == 0 ? OT_NONE
972 : (oflow < 0 ? OT_UNDERFLOW : OT_OVERFLOW));
973 if (!(flags & CPP_N_USERDEF))
974 {
624d31fe 975 if (oflow < 0 || !real_equal (&realvoidmode, &dconst0))
2d7aa578
ESR
976 warning (OPT_Woverflow, "floating constant truncated to zero");
977 }
92ef5cf9 978 }
fbb18613 979
ceeedfc1 980 /* Create a node with determined type and value. */
8ce94e44 981 value = build_real (const_type, real);
ceeedfc1 982 if (flags & CPP_N_IMAGINARY)
7273813a 983 {
269e63b7
KT
984 value = build_complex (NULL_TREE,
985 fold_convert (const_type,
986 integer_zero_node), value);
7273813a
JJ
987 if (type != const_type)
988 {
989 const_type = TREE_TYPE (value);
990 type = build_complex_type (type);
991 }
992 }
8ce94e44
JM
993
994 if (type != const_type)
14e18d71 995 value = build1_loc (token->src_loc, EXCESS_PRECISION_EXPR, type, value);
e8bbfc4e 996
0e5921e8 997 return value;
0e5921e8 998}
e8bbfc4e 999
14c931f1
CF
1000/* Interpret TOKEN, a fixed-point number with FLAGS as classified
1001 by cpplib. */
1002
1003static tree
1004interpret_fixed (const cpp_token *token, unsigned int flags)
1005{
1006 tree type;
1007 tree value;
1008 FIXED_VALUE_TYPE fixed;
1009 char *copy;
1010 size_t copylen;
1011
1012 copylen = token->val.str.len;
1013
1014 if (flags & CPP_N_FRACT) /* _Fract. */
1015 {
1016 if (flags & CPP_N_UNSIGNED) /* Unsigned _Fract. */
1017 {
1018 if ((flags & CPP_N_WIDTH) == CPP_N_LARGE)
1019 {
1020 type = unsigned_long_long_fract_type_node;
1021 copylen -= 4;
1022 }
1023 else if ((flags & CPP_N_WIDTH) == CPP_N_MEDIUM)
1024 {
1025 type = unsigned_long_fract_type_node;
1026 copylen -= 3;
1027 }
1028 else if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
1029 {
1030 type = unsigned_short_fract_type_node;
1031 copylen -= 3;
1032 }
1033 else
1034 {
1035 type = unsigned_fract_type_node;
1036 copylen -= 2;
1037 }
1038 }
1039 else /* Signed _Fract. */
1040 {
1041 if ((flags & CPP_N_WIDTH) == CPP_N_LARGE)
1042 {
1043 type = long_long_fract_type_node;
1044 copylen -= 3;
1045 }
1046 else if ((flags & CPP_N_WIDTH) == CPP_N_MEDIUM)
1047 {
1048 type = long_fract_type_node;
1049 copylen -= 2;
1050 }
1051 else if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
1052 {
1053 type = short_fract_type_node;
1054 copylen -= 2;
1055 }
1056 else
1057 {
1058 type = fract_type_node;
1059 copylen --;
1060 }
1061 }
1062 }
1063 else /* _Accum. */
1064 {
1065 if (flags & CPP_N_UNSIGNED) /* Unsigned _Accum. */
1066 {
1067 if ((flags & CPP_N_WIDTH) == CPP_N_LARGE)
1068 {
1069 type = unsigned_long_long_accum_type_node;
1070 copylen -= 4;
1071 }
1072 else if ((flags & CPP_N_WIDTH) == CPP_N_MEDIUM)
1073 {
1074 type = unsigned_long_accum_type_node;
1075 copylen -= 3;
1076 }
1077 else if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
1078 {
1079 type = unsigned_short_accum_type_node;
1080 copylen -= 3;
1081 }
1082 else
1083 {
1084 type = unsigned_accum_type_node;
1085 copylen -= 2;
1086 }
1087 }
1088 else /* Signed _Accum. */
1089 {
1090 if ((flags & CPP_N_WIDTH) == CPP_N_LARGE)
1091 {
1092 type = long_long_accum_type_node;
1093 copylen -= 3;
1094 }
1095 else if ((flags & CPP_N_WIDTH) == CPP_N_MEDIUM)
1096 {
1097 type = long_accum_type_node;
1098 copylen -= 2;
1099 }
1100 else if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
1101 {
1102 type = short_accum_type_node;
1103 copylen -= 2;
1104 }
1105 else
1106 {
1107 type = accum_type_node;
1108 copylen --;
1109 }
1110 }
1111 }
1112
1113 copy = (char *) alloca (copylen + 1);
1114 memcpy (copy, token->val.str.text, copylen);
1115 copy[copylen] = '\0';
1116
b397965c 1117 fixed_from_string (&fixed, copy, SCALAR_TYPE_MODE (type));
14c931f1
CF
1118
1119 /* Create a node with determined type and value. */
1120 value = build_fixed (type, fixed);
1121
1122 return value;
1123}
1124
2c6e3f55
JJ
1125/* Convert a series of STRING, WSTRING, STRING16, STRING32 and/or
1126 UTF8STRING tokens into a tree, performing string constant
a9546771
NP
1127 concatenation. TOK is the first of these. VALP is the location to
1128 write the string into. OBJC_STRING indicates whether an '@' token
1129 preceded the incoming token (in that case, the strings can either
1130 be ObjC strings, preceded by a single '@', or normal strings, not
1131 preceded by '@'. The result will be a CPP_OBJC_STRING). Returns
1132 the CPP token type of the result (CPP_STRING, CPP_WSTRING,
2c6e3f55 1133 CPP_STRING32, CPP_STRING16, CPP_UTF8STRING, or CPP_OBJC_STRING).
e6cc3a24
ZW
1134
1135 This is unfortunately more work than it should be. If any of the
1136 strings in the series has an L prefix, the result is a wide string
1137 (6.4.5p4). Whether or not the result is a wide string affects the
1138 meaning of octal and hexadecimal escapes (6.4.4.4p6,9). But escape
1139 sequences do not continue across the boundary between two strings in
1140 a series (6.4.5p7), so we must not lose the boundaries. Therefore
1141 cpp_interpret_string takes a vector of cpp_string structures, which
1142 we must arrange to provide. */
1143
1144static enum cpp_ttype
46c2514e 1145lex_string (const cpp_token *tok, tree *valp, bool objc_string, bool translate)
0e5921e8
ZW
1146{
1147 tree value;
51e63e60 1148 size_t concats = 0;
e6cc3a24 1149 struct obstack str_ob;
88fa5555 1150 struct obstack loc_ob;
e6cc3a24 1151 cpp_string istr;
b6baa67d 1152 enum cpp_ttype type = tok->type;
2f6e4e97 1153
e6cc3a24
ZW
1154 /* Try to avoid the overhead of creating and destroying an obstack
1155 for the common case of just one string. */
1156 cpp_string str = tok->val.str;
88fa5555 1157 location_t init_loc = tok->src_loc;
e6cc3a24 1158 cpp_string *strs = &str;
88fa5555 1159 location_t *locs = NULL;
e9a25f70 1160
a9546771
NP
1161 /* objc_at_sign_was_seen is only used when doing Objective-C string
1162 concatenation. It is 'true' if we have seen an '@' before the
1163 current string, and 'false' if not. We must see exactly one or
1164 zero '@' before each string. */
1165 bool objc_at_sign_was_seen = false;
1166
51e63e60
NS
1167 retry:
1168 tok = cpp_get_token (parse_in);
1169 switch (tok->type)
e6cc3a24 1170 {
51e63e60
NS
1171 case CPP_PADDING:
1172 goto retry;
1173 case CPP_ATSIGN:
a9546771 1174 if (objc_string)
0e5921e8 1175 {
a9546771
NP
1176 if (objc_at_sign_was_seen)
1177 error ("repeated %<@%> before Objective-C string");
1178
1179 objc_at_sign_was_seen = true;
51e63e60
NS
1180 goto retry;
1181 }
1182 /* FALLTHROUGH */
c22cacf3 1183
51e63e60
NS
1184 default:
1185 break;
c22cacf3 1186
51e63e60 1187 case CPP_WSTRING:
b6baa67d
KVH
1188 case CPP_STRING16:
1189 case CPP_STRING32:
2c6e3f55 1190 case CPP_UTF8STRING:
b6baa67d
KVH
1191 if (type != tok->type)
1192 {
1193 if (type == CPP_STRING)
1194 type = tok->type;
1195 else
1196 error ("unsupported non-standard concatenation of string literals");
1197 }
88fa5555 1198 /* FALLTHROUGH */
c22cacf3 1199
51e63e60
NS
1200 case CPP_STRING:
1201 if (!concats)
1202 {
1203 gcc_obstack_init (&str_ob);
88fa5555 1204 gcc_obstack_init (&loc_ob);
51e63e60 1205 obstack_grow (&str_ob, &str, sizeof (cpp_string));
88fa5555 1206 obstack_grow (&loc_ob, &init_loc, sizeof (location_t));
0e5921e8 1207 }
c22cacf3 1208
51e63e60
NS
1209 concats++;
1210 obstack_grow (&str_ob, &tok->val.str, sizeof (cpp_string));
88fa5555
DM
1211 obstack_grow (&loc_ob, &tok->src_loc, sizeof (location_t));
1212
a9546771
NP
1213 if (objc_string)
1214 objc_at_sign_was_seen = false;
51e63e60 1215 goto retry;
e8bbfc4e
RK
1216 }
1217
a9546771
NP
1218 /* It is an error if we saw a '@' with no following string. */
1219 if (objc_at_sign_was_seen)
1220 error ("stray %<@%> in program");
1221
e6cc3a24
ZW
1222 /* We have read one more token than we want. */
1223 _cpp_backup_tokens (parse_in, 1);
51e63e60 1224 if (concats)
88fa5555
DM
1225 {
1226 strs = XOBFINISH (&str_ob, cpp_string *);
1227 locs = XOBFINISH (&loc_ob, location_t *);
1228 }
e6cc3a24 1229
8400e75e 1230 if (concats && !objc_string && !in_system_header_at (input_location))
44c21c7f
DD
1231 warning (OPT_Wtraditional,
1232 "traditional C rejects string constant concatenation");
e8bbfc4e 1233
46c2514e 1234 if ((translate
21526606 1235 ? cpp_interpret_string : cpp_interpret_string_notranslate)
b6baa67d 1236 (parse_in, strs, concats + 1, &istr, type))
0e5921e8 1237 {
5f754896 1238 value = build_string (istr.len, (const char *) istr.text);
b1d5455a 1239 free (CONST_CAST (unsigned char *, istr.text));
88fa5555
DM
1240 if (concats)
1241 {
1242 gcc_assert (locs);
1243 gcc_assert (g_string_concat_db);
1244 g_string_concat_db->record_string_concatenation (concats + 1, locs);
1245 }
0e5921e8
ZW
1246 }
1247 else
1248 {
e6cc3a24
ZW
1249 /* Callers cannot generally handle error_mark_node in this context,
1250 so return the empty string instead. cpp_interpret_string has
1251 issued an error. */
b6baa67d
KVH
1252 switch (type)
1253 {
1254 default:
1255 case CPP_STRING:
2c6e3f55 1256 case CPP_UTF8STRING:
b6baa67d
KVH
1257 value = build_string (1, "");
1258 break;
1259 case CPP_STRING16:
1260 value = build_string (TYPE_PRECISION (char16_type_node)
1261 / TYPE_PRECISION (char_type_node),
1262 "\0"); /* char16_t is 16 bits */
1263 break;
1264 case CPP_STRING32:
1265 value = build_string (TYPE_PRECISION (char32_type_node)
1266 / TYPE_PRECISION (char_type_node),
1267 "\0\0\0"); /* char32_t is 32 bits */
1268 break;
1269 case CPP_WSTRING:
1270 value = build_string (TYPE_PRECISION (wchar_type_node)
1271 / TYPE_PRECISION (char_type_node),
1272 "\0\0\0"); /* widest supported wchar_t
1273 is 32 bits */
1274 break;
1275 }
0e5921e8
ZW
1276 }
1277
b6baa67d
KVH
1278 switch (type)
1279 {
1280 default:
1281 case CPP_STRING:
2c6e3f55 1282 case CPP_UTF8STRING:
b6baa67d
KVH
1283 TREE_TYPE (value) = char_array_type_node;
1284 break;
1285 case CPP_STRING16:
1286 TREE_TYPE (value) = char16_array_type_node;
1287 break;
1288 case CPP_STRING32:
1289 TREE_TYPE (value) = char32_array_type_node;
1290 break;
1291 case CPP_WSTRING:
1292 TREE_TYPE (value) = wchar_array_type_node;
1293 }
e6cc3a24 1294 *valp = fix_string_type (value);
0e5921e8 1295
51e63e60 1296 if (concats)
88fa5555
DM
1297 {
1298 obstack_free (&str_ob, 0);
1299 obstack_free (&loc_ob, 0);
1300 }
e6cc3a24 1301
b6baa67d 1302 return objc_string ? CPP_OBJC_STRING : type;
e8bbfc4e
RK
1303}
1304
c8a96070 1305/* Converts a (possibly wide) character constant token into a tree. */
0e5921e8 1306static tree
2f6e4e97 1307lex_charconst (const cpp_token *token)
e8bbfc4e 1308{
4268e8bb 1309 cppchar_t result;
9340544b 1310 tree type, value;
c8a96070 1311 unsigned int chars_seen;
098b9c46 1312 int unsignedp = 0;
ceeedfc1 1313
a5a49440 1314 result = cpp_interpret_charconst (parse_in, token,
2f6e4e97 1315 &chars_seen, &unsignedp);
9340544b 1316
4268e8bb
NB
1317 if (token->type == CPP_WCHAR)
1318 type = wchar_type_node;
b6baa67d
KVH
1319 else if (token->type == CPP_CHAR32)
1320 type = char32_type_node;
1321 else if (token->type == CPP_CHAR16)
1322 type = char16_type_node;
fe95b036
ESR
1323 else if (token->type == CPP_UTF8CHAR)
1324 type = char_type_node;
4268e8bb
NB
1325 /* In C, a character constant has type 'int'.
1326 In C++ 'char', but multi-char charconsts have type 'int'. */
37fa72e9 1327 else if (!c_dialect_cxx () || chars_seen > 1)
4268e8bb
NB
1328 type = integer_type_node;
1329 else
1330 type = char_type_node;
9340544b 1331
4a90aeeb
NS
1332 /* Cast to cppchar_signed_t to get correct sign-extension of RESULT
1333 before possibly widening to HOST_WIDE_INT for build_int_cst. */
1334 if (unsignedp || (cppchar_signed_t) result >= 0)
807e902e 1335 value = build_int_cst (type, result);
4a90aeeb 1336 else
807e902e 1337 value = build_int_cst (type, (cppchar_signed_t) result);
4a90aeeb 1338
0e5921e8 1339 return value;
e8bbfc4e 1340}
de67c4c3
DM
1341
1342/* Helper function for c_parser_peek_conflict_marker
1343 and cp_lexer_peek_conflict_marker.
1344 Given a possible conflict marker token of kind TOK1_KIND
1345 consisting of a pair of characters, get the token kind for the
1346 standalone final character. */
1347
1348enum cpp_ttype
1349conflict_marker_get_final_tok_kind (enum cpp_ttype tok1_kind)
1350{
1351 switch (tok1_kind)
1352 {
1353 default: gcc_unreachable ();
1354 case CPP_LSHIFT:
1355 /* "<<" and '<' */
1356 return CPP_LESS;
1357
1358 case CPP_EQ_EQ:
1359 /* "==" and '=' */
1360 return CPP_EQ;
1361
1362 case CPP_RSHIFT:
1363 /* ">>" and '>' */
1364 return CPP_GREATER;
1365 }
1366}