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