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