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