1117415Skan/* Mainly the interface between cpplib and the C front ends.
290075Sobrien   Copyright (C) 1987, 1988, 1989, 1992, 1994, 1995, 1996, 1997
3169699Skan   1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
4169699Skan   Free Software Foundation, Inc.
518334Speter
690075SobrienThis file is part of GCC.
718334Speter
890075SobrienGCC is free software; you can redistribute it and/or modify it under
990075Sobrienthe terms of the GNU General Public License as published by the Free
1090075SobrienSoftware Foundation; either version 2, or (at your option) any later
1190075Sobrienversion.
1218334Speter
1390075SobrienGCC is distributed in the hope that it will be useful, but WITHOUT ANY
1490075SobrienWARRANTY; without even the implied warranty of MERCHANTABILITY or
1590075SobrienFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1690075Sobrienfor more details.
1718334Speter
1818334SpeterYou should have received a copy of the GNU General Public License
1990075Sobrienalong with GCC; see the file COPYING.  If not, write to the Free
20169699SkanSoftware Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
21169699Skan02110-1301, USA.  */
2218334Speter
2350397Sobrien#include "config.h"
2450397Sobrien#include "system.h"
25132727Skan#include "coretypes.h"
26132727Skan#include "tm.h"
2718334Speter
28117415Skan#include "real.h"
2918334Speter#include "rtl.h"
3018334Speter#include "tree.h"
3118334Speter#include "input.h"
3250397Sobrien#include "output.h"
3318334Speter#include "c-tree.h"
34117415Skan#include "c-common.h"
3518334Speter#include "flags.h"
3690075Sobrien#include "timevar.h"
3790075Sobrien#include "cpplib.h"
3818334Speter#include "c-pragma.h"
3950397Sobrien#include "toplev.h"
4052284Sobrien#include "intl.h"
4190075Sobrien#include "tm_p.h"
4290075Sobrien#include "splay-tree.h"
4390075Sobrien#include "debug.h"
4418334Speter
4590075Sobrien/* We may keep statistics about how long which files took to compile.  */
4690075Sobrienstatic int header_time, body_time;
4790075Sobrienstatic splay_tree file_info_tree;
4890075Sobrien
4990075Sobrienint pending_lang_change; /* If we need to switch languages - C++ only */
5090075Sobrienint c_header_level;	 /* depth in C headers - C++ only */
5118334Speter
52169699Skan/* If we need to translate characters received.  This is tri-state:
53169699Skan   0 means use only the untranslated string; 1 means use only
54169699Skan   the translated string; -1 means chain the translated string
55169699Skan   to the untranslated one.  */
56169699Skanint c_lex_string_translate = 1;
57169699Skan
58169699Skan/* True if strings should be passed to the caller of c_lex completely
59169699Skan   unmolested (no concatenation, no translation).  */
60169699Skanbool c_lex_return_raw_strings = false;
61169699Skan
62132727Skanstatic tree interpret_integer (const cpp_token *, unsigned int);
63132727Skanstatic tree interpret_float (const cpp_token *, unsigned int);
64169699Skanstatic enum integer_type_kind narrowest_unsigned_type
65169699Skan	(unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT, unsigned int);
66169699Skanstatic enum integer_type_kind narrowest_signed_type
67169699Skan	(unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT, unsigned int);
68132727Skanstatic enum cpp_ttype lex_string (const cpp_token *, tree *, bool);
69132727Skanstatic tree lex_charconst (const cpp_token *);
70132727Skanstatic void update_header_times (const char *);
71132727Skanstatic int dump_one_header (splay_tree_node, void *);
72132727Skanstatic void cb_line_change (cpp_reader *, const cpp_token *, int);
73132727Skanstatic void cb_ident (cpp_reader *, unsigned int, const cpp_string *);
74132727Skanstatic void cb_def_pragma (cpp_reader *, unsigned int);
75132727Skanstatic void cb_define (cpp_reader *, unsigned int, cpp_hashnode *);
76132727Skanstatic void cb_undef (cpp_reader *, unsigned int, cpp_hashnode *);
7718334Speter
78132727Skanvoid
79132727Skaninit_c_lex (void)
8018334Speter{
8190075Sobrien  struct cpp_callbacks *cb;
8290075Sobrien  struct c_fileinfo *toplevel;
8318334Speter
84169699Skan  /* The get_fileinfo data structure must be initialized before
85169699Skan     cpp_read_main_file is called.  */
8690075Sobrien  toplevel = get_fileinfo ("<top level>");
8790075Sobrien  if (flag_detailed_statistics)
8850397Sobrien    {
8990075Sobrien      header_time = 0;
9090075Sobrien      body_time = get_run_time ();
9190075Sobrien      toplevel->time = body_time;
9250397Sobrien    }
9318334Speter
9490075Sobrien  cb = cpp_get_callbacks (parse_in);
9518334Speter
9690075Sobrien  cb->line_change = cb_line_change;
9790075Sobrien  cb->ident = cb_ident;
9890075Sobrien  cb->def_pragma = cb_def_pragma;
99132727Skan  cb->valid_pch = c_common_valid_pch;
100132727Skan  cb->read_pch = c_common_read_pch;
10118334Speter
10290075Sobrien  /* Set the debug callbacks if we can use them.  */
10390075Sobrien  if (debug_info_level == DINFO_LEVEL_VERBOSE
104169699Skan      && (write_symbols == DWARF2_DEBUG
105169699Skan	  || write_symbols == VMS_AND_DWARF2_DEBUG))
10618334Speter    {
10790075Sobrien      cb->define = cb_define;
10890075Sobrien      cb->undef = cb_undef;
10918334Speter    }
11018334Speter}
11118334Speter
11290075Sobrienstruct c_fileinfo *
113132727Skanget_fileinfo (const char *name)
11418334Speter{
11590075Sobrien  splay_tree_node n;
11690075Sobrien  struct c_fileinfo *fi;
11718334Speter
118169699Skan  if (!file_info_tree)
119169699Skan    file_info_tree = splay_tree_new ((splay_tree_compare_fn) strcmp,
120169699Skan				     0,
121169699Skan				     (splay_tree_delete_value_fn) free);
122169699Skan
12390075Sobrien  n = splay_tree_lookup (file_info_tree, (splay_tree_key) name);
12490075Sobrien  if (n)
12590075Sobrien    return (struct c_fileinfo *) n->value;
12690075Sobrien
127169699Skan  fi = XNEW (struct c_fileinfo);
12890075Sobrien  fi->time = 0;
12990075Sobrien  fi->interface_only = 0;
13090075Sobrien  fi->interface_unknown = 1;
13190075Sobrien  splay_tree_insert (file_info_tree, (splay_tree_key) name,
13290075Sobrien		     (splay_tree_value) fi);
13390075Sobrien  return fi;
13418334Speter}
13590075Sobrien
13690075Sobrienstatic void
137132727Skanupdate_header_times (const char *name)
13850397Sobrien{
13990075Sobrien  /* Changing files again.  This means currently collected time
14090075Sobrien     is charged against header time, and body time starts back at 0.  */
14190075Sobrien  if (flag_detailed_statistics)
14250397Sobrien    {
14390075Sobrien      int this_time = get_run_time ();
14490075Sobrien      struct c_fileinfo *file = get_fileinfo (name);
14590075Sobrien      header_time += this_time - body_time;
14690075Sobrien      file->time += this_time - body_time;
14790075Sobrien      body_time = this_time;
14850397Sobrien    }
14950397Sobrien}
15050397Sobrien
15118334Speterstatic int
152169699Skandump_one_header (splay_tree_node n, void * ARG_UNUSED (dummy))
15318334Speter{
15490075Sobrien  print_time ((const char *) n->key,
15590075Sobrien	      ((struct c_fileinfo *) n->value)->time);
15690075Sobrien  return 0;
15718334Speter}
15818334Speter
15918334Spetervoid
160132727Skandump_time_statistics (void)
16118334Speter{
16290075Sobrien  struct c_fileinfo *file = get_fileinfo (input_filename);
16390075Sobrien  int this_time = get_run_time ();
16490075Sobrien  file->time += this_time - body_time;
16518334Speter
16690075Sobrien  fprintf (stderr, "\n******\n");
16790075Sobrien  print_time ("header files (total)", header_time);
16890075Sobrien  print_time ("main file (total)", this_time - body_time);
16990075Sobrien  fprintf (stderr, "ratio = %g : 1\n",
170169699Skan	   (double) header_time / (double) (this_time - body_time));
17190075Sobrien  fprintf (stderr, "\n******\n");
17218334Speter
17390075Sobrien  splay_tree_foreach (file_info_tree, dump_one_header, 0);
17418334Speter}
17518334Speter
17690075Sobrienstatic void
177169699Skancb_ident (cpp_reader * ARG_UNUSED (pfile),
178169699Skan	  unsigned int ARG_UNUSED (line),
179169699Skan	  const cpp_string * ARG_UNUSED (str))
18050397Sobrien{
18190075Sobrien#ifdef ASM_OUTPUT_IDENT
182169699Skan  if (!flag_no_ident)
18350397Sobrien    {
18490075Sobrien      /* Convert escapes in the string.  */
185132727Skan      cpp_string cstr = { 0, 0 };
186132727Skan      if (cpp_interpret_string (pfile, str, 1, &cstr, false))
187132727Skan	{
188132727Skan	  ASM_OUTPUT_IDENT (asm_out_file, (const char *) cstr.text);
189169699Skan	  free ((void *) cstr.text);
190132727Skan	}
19150397Sobrien    }
19290075Sobrien#endif
19350397Sobrien}
19450397Sobrien
19590075Sobrien/* Called at the start of every non-empty line.  TOKEN is the first
19690075Sobrien   lexed token on the line.  Used for diagnostic line numbers.  */
19790075Sobrienstatic void
198169699Skancb_line_change (cpp_reader * ARG_UNUSED (pfile), const cpp_token *token,
199132727Skan		int parsing_args)
20018334Speter{
201169699Skan  if (token->type != CPP_EOF && !parsing_args)
202169699Skan#ifdef USE_MAPPED_LOCATION
203169699Skan    input_location = token->src_loc;
204169699Skan#else
205169699Skan    {
206169699Skan      source_location loc = token->src_loc;
207169699Skan      const struct line_map *map = linemap_lookup (&line_table, loc);
208169699Skan      input_line = SOURCE_LINE (map, loc);
209169699Skan    }
210169699Skan#endif
21118334Speter}
21252284Sobrien
213132727Skanvoid
214132727Skanfe_file_change (const struct line_map *new_map)
21552284Sobrien{
216132727Skan  if (new_map == NULL)
217169699Skan    return;
21852284Sobrien
21990075Sobrien  if (new_map->reason == LC_ENTER)
22018334Speter    {
22190075Sobrien      /* Don't stack the main buffer on the input stack;
22290075Sobrien	 we already did in compile_file.  */
223169699Skan      if (!MAIN_FILE_P (new_map))
22418334Speter	{
225169699Skan#ifdef USE_MAPPED_LOCATION
226169699Skan	  int included_at = LAST_SOURCE_LINE_LOCATION (new_map - 1);
22796263Sobrien
228169699Skan	  input_location = included_at;
229169699Skan	  push_srcloc (new_map->start_location);
230169699Skan#else
231169699Skan	  int included_at = LAST_SOURCE_LINE (new_map - 1);
232169699Skan
233132727Skan	  input_line = included_at;
23490075Sobrien	  push_srcloc (new_map->to_file, 1);
235169699Skan#endif
23696263Sobrien	  (*debug_hooks->start_source_file) (included_at, new_map->to_file);
23790075Sobrien#ifndef NO_IMPLICIT_EXTERN_C
23890075Sobrien	  if (c_header_level)
23990075Sobrien	    ++c_header_level;
24090075Sobrien	  else if (new_map->sysp == 2)
24118334Speter	    {
24290075Sobrien	      c_header_level = 1;
24390075Sobrien	      ++pending_lang_change;
24418334Speter	    }
24590075Sobrien#endif
24618334Speter	}
24790075Sobrien    }
24890075Sobrien  else if (new_map->reason == LC_LEAVE)
24990075Sobrien    {
25090075Sobrien#ifndef NO_IMPLICIT_EXTERN_C
25190075Sobrien      if (c_header_level && --c_header_level == 0)
25218334Speter	{
25390075Sobrien	  if (new_map->sysp == 2)
254169699Skan	    warning (0, "badly nested C headers from preprocessor");
25590075Sobrien	  --pending_lang_change;
25618334Speter	}
25790075Sobrien#endif
25890075Sobrien      pop_srcloc ();
259132727Skan
260132727Skan      (*debug_hooks->end_source_file) (new_map->to_line);
26190075Sobrien    }
26218334Speter
26390075Sobrien  update_header_times (new_map->to_file);
264122191Skan  in_system_header = new_map->sysp != 0;
265169699Skan#ifdef USE_MAPPED_LOCATION
266169699Skan  input_location = new_map->start_location;
267169699Skan#else
26890075Sobrien  input_filename = new_map->to_file;
269132727Skan  input_line = new_map->to_line;
270169699Skan#endif
27190075Sobrien}
27218334Speter
27390075Sobrienstatic void
274169699Skancb_def_pragma (cpp_reader *pfile, source_location loc)
27590075Sobrien{
27690075Sobrien  /* Issue a warning message if we have been asked to do so.  Ignore
27790075Sobrien     unknown pragmas in system headers unless an explicit
27890075Sobrien     -Wunknown-pragmas has been given.  */
27990075Sobrien  if (warn_unknown_pragmas > in_system_header)
28090075Sobrien    {
281102791Skan      const unsigned char *space, *name;
28290075Sobrien      const cpp_token *s;
283169699Skan#ifndef USE_MAPPED_LOCATION
284169699Skan      location_t fe_loc;
285169699Skan      const struct line_map *map = linemap_lookup (&line_table, loc);
286169699Skan      fe_loc.file = map->to_file;
287169699Skan      fe_loc.line = SOURCE_LINE (map, loc);
288169699Skan#else
289169699Skan      location_t fe_loc = loc;
290169699Skan#endif
29118334Speter
292102791Skan      space = name = (const unsigned char *) "";
29390075Sobrien      s = cpp_get_token (pfile);
294102791Skan      if (s->type != CPP_EOF)
295102791Skan	{
296102791Skan	  space = cpp_token_as_text (pfile, s);
297102791Skan	  s = cpp_get_token (pfile);
298102791Skan	  if (s->type == CPP_NAME)
299102791Skan	    name = cpp_token_as_text (pfile, s);
300102791Skan	}
30118334Speter
302169699Skan      warning (OPT_Wunknown_pragmas, "%Hignoring #pragma %s %s",
303169699Skan	       &fe_loc, space, name);
30418334Speter    }
30590075Sobrien}
30618334Speter
30790075Sobrien/* #define callback for DWARF and DWARF2 debug info.  */
30890075Sobrienstatic void
309169699Skancb_define (cpp_reader *pfile, source_location loc, cpp_hashnode *node)
31090075Sobrien{
311169699Skan  const struct line_map *map = linemap_lookup (&line_table, loc);
312169699Skan  (*debug_hooks->define) (SOURCE_LINE (map, loc),
31390075Sobrien			  (const char *) cpp_macro_definition (pfile, node));
31490075Sobrien}
31518334Speter
31690075Sobrien/* #undef callback for DWARF and DWARF2 debug info.  */
31790075Sobrienstatic void
318169699Skancb_undef (cpp_reader * ARG_UNUSED (pfile), source_location loc,
319132727Skan	  cpp_hashnode *node)
32090075Sobrien{
321169699Skan  const struct line_map *map = linemap_lookup (&line_table, loc);
322169699Skan  (*debug_hooks->undef) (SOURCE_LINE (map, loc),
32390075Sobrien			 (const char *) NODE_NAME (node));
32490075Sobrien}
32518334Speter
326169699Skan/* Read a token and return its type.  Fill *VALUE with its value, if
327169699Skan   applicable.  Fill *CPP_FLAGS with the token's flags, if it is
328169699Skan   non-NULL.  */
32918334Speter
330169699Skanenum cpp_ttype
331169699Skanc_lex_with_flags (tree *value, location_t *loc, unsigned char *cpp_flags)
332132727Skan{
333169699Skan  static bool no_more_pch;
334132727Skan  const cpp_token *tok;
335169699Skan  enum cpp_ttype type;
336169699Skan  unsigned char add_flags = 0;
337132727Skan
338169699Skan  timevar_push (TV_CPP);
339132727Skan retry:
340169699Skan  tok = cpp_get_token (parse_in);
341169699Skan  type = tok->type;
342132727Skan
343132727Skan retry_after_at:
344169699Skan#ifdef USE_MAPPED_LOCATION
345169699Skan  *loc = tok->src_loc;
346169699Skan#else
347169699Skan  *loc = input_location;
348169699Skan#endif
349169699Skan  switch (type)
35018334Speter    {
351169699Skan    case CPP_PADDING:
352169699Skan      goto retry;
353169699Skan
35490075Sobrien    case CPP_NAME:
35590075Sobrien      *value = HT_IDENT_TO_GCC_IDENT (HT_NODE (tok->val.node));
35690075Sobrien      break;
35718334Speter
35890075Sobrien    case CPP_NUMBER:
359117415Skan      {
360117415Skan	unsigned int flags = cpp_classify_number (parse_in, tok);
361117415Skan
362117415Skan	switch (flags & CPP_N_CATEGORY)
363117415Skan	  {
364117415Skan	  case CPP_N_INVALID:
365117415Skan	    /* cpplib has issued an error.  */
366117415Skan	    *value = error_mark_node;
367169699Skan	    errorcount++;
368117415Skan	    break;
369117415Skan
370117415Skan	  case CPP_N_INTEGER:
371169699Skan	    /* C++ uses '0' to mark virtual functions as pure.
372169699Skan	       Set PURE_ZERO to pass this information to the C++ parser.  */
373169699Skan	    if (tok->val.str.len == 1 && *tok->val.str.text == '0')
374169699Skan	      add_flags = PURE_ZERO;
375117415Skan	    *value = interpret_integer (tok, flags);
376117415Skan	    break;
377117415Skan
378117415Skan	  case CPP_N_FLOATING:
379117415Skan	    *value = interpret_float (tok, flags);
380117415Skan	    break;
381117415Skan
382117415Skan	  default:
383169699Skan	    gcc_unreachable ();
384117415Skan	  }
385117415Skan      }
38690075Sobrien      break;
38718334Speter
388132727Skan    case CPP_ATSIGN:
389132727Skan      /* An @ may give the next token special significance in Objective-C.  */
390132727Skan      if (c_dialect_objc ())
391132727Skan	{
392169699Skan	  location_t atloc = input_location;
393169699Skan
394169699Skan	retry_at:
395169699Skan	  tok = cpp_get_token (parse_in);
396169699Skan	  type = tok->type;
397169699Skan	  switch (type)
398132727Skan	    {
399169699Skan	    case CPP_PADDING:
400169699Skan	      goto retry_at;
401169699Skan
402169699Skan	    case CPP_STRING:
403169699Skan	    case CPP_WSTRING:
404169699Skan	      type = lex_string (tok, value, true);
405169699Skan	      break;
406169699Skan
407132727Skan	    case CPP_NAME:
408169699Skan	      *value = HT_IDENT_TO_GCC_IDENT (HT_NODE (tok->val.node));
409169699Skan	      if (objc_is_reserved_word (*value))
410132727Skan		{
411169699Skan		  type = CPP_AT_NAME;
412169699Skan		  break;
413132727Skan		}
414169699Skan	      /* FALLTHROUGH */
415132727Skan
416169699Skan	    default:
417169699Skan	      /* ... or not.  */
418169699Skan	      error ("%Hstray %<@%> in program", &atloc);
419169699Skan	      goto retry_after_at;
420132727Skan	    }
421169699Skan	  break;
422132727Skan	}
423132727Skan
424169699Skan      /* FALLTHROUGH */
425169699Skan    case CPP_HASH:
426169699Skan    case CPP_PASTE:
427169699Skan      {
428169699Skan	unsigned char name[4];
429132727Skan
430169699Skan	*cpp_spell_token (parse_in, tok, name, true) = 0;
431169699Skan
432169699Skan	error ("stray %qs in program", name);
433169699Skan      }
434169699Skan
435169699Skan      goto retry;
436169699Skan
437132727Skan    case CPP_OTHER:
438132727Skan      {
439132727Skan	cppchar_t c = tok->val.str.text[0];
440132727Skan
441132727Skan	if (c == '"' || c == '\'')
442132727Skan	  error ("missing terminating %c character", (int) c);
443132727Skan	else if (ISGRAPH (c))
444169699Skan	  error ("stray %qc in program", (int) c);
445132727Skan	else
446169699Skan	  error ("stray %<\\%o%> in program", (int) c);
447132727Skan      }
448132727Skan      goto retry;
449132727Skan
45090075Sobrien    case CPP_CHAR:
45190075Sobrien    case CPP_WCHAR:
45290075Sobrien      *value = lex_charconst (tok);
45390075Sobrien      break;
45418334Speter
45590075Sobrien    case CPP_STRING:
45690075Sobrien    case CPP_WSTRING:
457169699Skan      if (!c_lex_return_raw_strings)
458169699Skan	{
459169699Skan	  type = lex_string (tok, value, false);
460169699Skan	  break;
461169699Skan	}
462169699Skan      *value = build_string (tok->val.str.len, (char *) tok->val.str.text);
46390075Sobrien      break;
464169699Skan
465169699Skan    case CPP_PRAGMA:
466169699Skan      *value = build_int_cst (NULL, tok->val.pragma);
467169699Skan      break;
46818334Speter
46990075Sobrien      /* These tokens should not be visible outside cpplib.  */
47090075Sobrien    case CPP_HEADER_NAME:
47190075Sobrien    case CPP_COMMENT:
47290075Sobrien    case CPP_MACRO_ARG:
473169699Skan      gcc_unreachable ();
47418334Speter
475132727Skan    default:
476132727Skan      *value = NULL_TREE;
477132727Skan      break;
47890075Sobrien    }
47918334Speter
480169699Skan  if (cpp_flags)
481169699Skan    *cpp_flags = tok->flags | add_flags;
482169699Skan
483169699Skan  if (!no_more_pch)
484132727Skan    {
485132727Skan      no_more_pch = true;
486132727Skan      c_common_no_more_pch ();
487132727Skan    }
488132727Skan
489169699Skan  timevar_pop (TV_CPP);
49018334Speter
491169699Skan  return type;
492132727Skan}
493132727Skan
494117415Skan/* Returns the narrowest C-visible unsigned type, starting with the
495169699Skan   minimum specified by FLAGS, that can fit HIGH:LOW, or itk_none if
496117415Skan   there isn't one.  */
497169699Skan
498117415Skanstatic enum integer_type_kind
499169699Skannarrowest_unsigned_type (unsigned HOST_WIDE_INT low,
500169699Skan			 unsigned HOST_WIDE_INT high,
501169699Skan			 unsigned int flags)
50290075Sobrien{
503117415Skan  enum integer_type_kind itk;
50418334Speter
505117415Skan  if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
506117415Skan    itk = itk_unsigned_int;
507117415Skan  else if ((flags & CPP_N_WIDTH) == CPP_N_MEDIUM)
508117415Skan    itk = itk_unsigned_long;
509117415Skan  else
510117415Skan    itk = itk_unsigned_long_long;
51118334Speter
512117415Skan  for (; itk < itk_none; itk += 2 /* skip unsigned types */)
513169699Skan    {
514169699Skan      tree upper = TYPE_MAX_VALUE (integer_types[itk]);
51518334Speter
516169699Skan      if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (upper) > high
517169699Skan	  || ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (upper) == high
518169699Skan	      && TREE_INT_CST_LOW (upper) >= low))
519169699Skan	return itk;
520169699Skan    }
521169699Skan
522117415Skan  return itk_none;
523117415Skan}
52418334Speter
525117415Skan/* Ditto, but narrowest signed type.  */
526117415Skanstatic enum integer_type_kind
527169699Skannarrowest_signed_type (unsigned HOST_WIDE_INT low,
528169699Skan		       unsigned HOST_WIDE_INT high, unsigned int flags)
529117415Skan{
530117415Skan  enum integer_type_kind itk;
53118334Speter
532117415Skan  if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
533117415Skan    itk = itk_int;
534117415Skan  else if ((flags & CPP_N_WIDTH) == CPP_N_MEDIUM)
535117415Skan    itk = itk_long;
536117415Skan  else
537117415Skan    itk = itk_long_long;
53818334Speter
53918334Speter
540117415Skan  for (; itk < itk_none; itk += 2 /* skip signed types */)
541169699Skan    {
542169699Skan      tree upper = TYPE_MAX_VALUE (integer_types[itk]);
54390075Sobrien
544169699Skan      if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (upper) > high
545169699Skan	  || ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (upper) == high
546169699Skan	      && TREE_INT_CST_LOW (upper) >= low))
547169699Skan	return itk;
548169699Skan    }
549169699Skan
550117415Skan  return itk_none;
551117415Skan}
55290075Sobrien
553117415Skan/* Interpret TOKEN, an integer with FLAGS as classified by cpplib.  */
554117415Skanstatic tree
555132727Skaninterpret_integer (const cpp_token *token, unsigned int flags)
556117415Skan{
557117415Skan  tree value, type;
558117415Skan  enum integer_type_kind itk;
559117415Skan  cpp_num integer;
560117415Skan  cpp_options *options = cpp_get_options (parse_in);
56118334Speter
562117415Skan  integer = cpp_interpret_integer (parse_in, token, flags);
563117415Skan  integer = cpp_num_sign_extend (integer, options->precision);
56418334Speter
565117415Skan  /* The type of a constant with a U suffix is straightforward.  */
566117415Skan  if (flags & CPP_N_UNSIGNED)
567169699Skan    itk = narrowest_unsigned_type (integer.low, integer.high, flags);
568117415Skan  else
56990075Sobrien    {
570117415Skan      /* The type of a potentially-signed integer constant varies
571117415Skan	 depending on the base it's in, the standard in use, and the
572117415Skan	 length suffixes.  */
573169699Skan      enum integer_type_kind itk_u
574169699Skan	= narrowest_unsigned_type (integer.low, integer.high, flags);
575169699Skan      enum integer_type_kind itk_s
576169699Skan	= narrowest_signed_type (integer.low, integer.high, flags);
57718334Speter
578117415Skan      /* In both C89 and C99, octal and hex constants may be signed or
579117415Skan	 unsigned, whichever fits tighter.  We do not warn about this
580117415Skan	 choice differing from the traditional choice, as the constant
581117415Skan	 is probably a bit pattern and either way will work.  */
582117415Skan      if ((flags & CPP_N_RADIX) != CPP_N_DECIMAL)
583117415Skan	itk = MIN (itk_u, itk_s);
584117415Skan      else
58590075Sobrien	{
586117415Skan	  /* In C99, decimal constants are always signed.
587117415Skan	     In C89, decimal constants that don't fit in long have
588117415Skan	     undefined behavior; we try to make them unsigned long.
589117415Skan	     In GCC's extended C89, that last is true of decimal
590117415Skan	     constants that don't fit in long long, too.  */
59118334Speter
592117415Skan	  itk = itk_s;
593117415Skan	  if (itk_s > itk_u && itk_s > itk_long)
59490075Sobrien	    {
595117415Skan	      if (!flag_isoc99)
59690075Sobrien		{
597117415Skan		  if (itk_u < itk_unsigned_long)
598117415Skan		    itk_u = itk_unsigned_long;
599117415Skan		  itk = itk_u;
600169699Skan		  warning (0, "this decimal constant is unsigned only in ISO C90");
60190075Sobrien		}
602169699Skan	      else
603169699Skan		warning (OPT_Wtraditional,
604169699Skan			 "this decimal constant would be unsigned in ISO C90");
60590075Sobrien	    }
60690075Sobrien	}
607117415Skan    }
60818334Speter
609117415Skan  if (itk == itk_none)
610117415Skan    /* cpplib has already issued a warning for overflow.  */
611117415Skan    type = ((flags & CPP_N_UNSIGNED)
612117415Skan	    ? widest_unsigned_literal_type_node
613117415Skan	    : widest_integer_literal_type_node);
614117415Skan  else
615117415Skan    type = integer_types[itk];
61618334Speter
617117415Skan  if (itk > itk_unsigned_long
618117415Skan      && (flags & CPP_N_WIDTH) != CPP_N_LARGE
619169699Skan      && !in_system_header && !flag_isoc99)
620169699Skan    pedwarn ("integer constant is too large for %qs type",
621117415Skan	     (flags & CPP_N_UNSIGNED) ? "unsigned long" : "long");
62252284Sobrien
623169699Skan  value = build_int_cst_wide (type, integer.low, integer.high);
62418334Speter
625117415Skan  /* Convert imaginary to a complex type.  */
626117415Skan  if (flags & CPP_N_IMAGINARY)
627169699Skan    value = build_complex (NULL_TREE, build_int_cst (type, 0), value);
62818334Speter
629117415Skan  return value;
630117415Skan}
63118334Speter
632117415Skan/* Interpret TOKEN, a floating point number with FLAGS as classified
633117415Skan   by cpplib.  */
634117415Skanstatic tree
635132727Skaninterpret_float (const cpp_token *token, unsigned int flags)
636117415Skan{
637117415Skan  tree type;
638117415Skan  tree value;
639117415Skan  REAL_VALUE_TYPE real;
640117415Skan  char *copy;
641117415Skan  size_t copylen;
64218334Speter
643250566Spfg  /* Default (no suffix) is double.  */
644250566Spfg  if (flags & CPP_N_DEFAULT)
645250566Spfg    {
646250566Spfg      flags ^= CPP_N_DEFAULT;
647250566Spfg      flags |= CPP_N_MEDIUM;
648250566Spfg    }
649250566Spfg
650169699Skan  /* Decode type based on width and properties. */
651169699Skan  if (flags & CPP_N_DFLOAT)
652169699Skan    if ((flags & CPP_N_WIDTH) == CPP_N_LARGE)
653169699Skan      type = dfloat128_type_node;
654169699Skan    else if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
655169699Skan      type = dfloat32_type_node;
656169699Skan    else
657169699Skan      type = dfloat64_type_node;
658169699Skan  else
659169699Skan    if ((flags & CPP_N_WIDTH) == CPP_N_LARGE)
660117415Skan      type = long_double_type_node;
661169699Skan    else if ((flags & CPP_N_WIDTH) == CPP_N_SMALL
662169699Skan	     || flag_single_precision_constant)
663117415Skan      type = float_type_node;
664169699Skan    else
665117415Skan      type = double_type_node;
66618334Speter
667117415Skan  /* Copy the constant to a nul-terminated buffer.  If the constant
668117415Skan     has any suffixes, cut them off; REAL_VALUE_ATOF/ REAL_VALUE_HTOF
669117415Skan     can't handle them.  */
670117415Skan  copylen = token->val.str.len;
671169699Skan  if (flags & CPP_N_DFLOAT)
672169699Skan    copylen -= 2;
673169699Skan  else
674169699Skan    {
675169699Skan      if ((flags & CPP_N_WIDTH) != CPP_N_MEDIUM)
676169699Skan	/* Must be an F or L suffix.  */
677169699Skan	copylen--;
678169699Skan      if (flags & CPP_N_IMAGINARY)
679169699Skan	/* I or J suffix.  */
680169699Skan	copylen--;
681169699Skan    }
68218334Speter
683169699Skan  copy = (char *) alloca (copylen + 1);
684117415Skan  memcpy (copy, token->val.str.text, copylen);
685117415Skan  copy[copylen] = '\0';
68652284Sobrien
687169699Skan  real_from_string3 (&real, copy, TYPE_MODE (type));
68852284Sobrien
689169699Skan  /* Both C and C++ require a diagnostic for a floating constant
690169699Skan     outside the range of representable values of its type.  Since we
691169699Skan     have __builtin_inf* to produce an infinity, it might now be
692169699Skan     appropriate for this to be a mandatory pedwarn rather than
693169699Skan     conditioned on -pedantic.  */
694117415Skan  if (REAL_VALUE_ISINF (real) && pedantic)
695169699Skan    pedwarn ("floating constant exceeds range of %qT", type);
69652284Sobrien
697117415Skan  /* Create a node with determined type and value.  */
698117415Skan  value = build_real (type, real);
699117415Skan  if (flags & CPP_N_IMAGINARY)
700117415Skan    value = build_complex (NULL_TREE, convert (type, integer_zero_node), value);
70118334Speter
70290075Sobrien  return value;
70390075Sobrien}
70418334Speter
705132727Skan/* Convert a series of STRING and/or WSTRING tokens into a tree,
706132727Skan   performing string constant concatenation.  TOK is the first of
707132727Skan   these.  VALP is the location to write the string into.  OBJC_STRING
708132727Skan   indicates whether an '@' token preceded the incoming token.
709132727Skan   Returns the CPP token type of the result (CPP_STRING, CPP_WSTRING,
710132727Skan   or CPP_OBJC_STRING).
711132727Skan
712132727Skan   This is unfortunately more work than it should be.  If any of the
713132727Skan   strings in the series has an L prefix, the result is a wide string
714132727Skan   (6.4.5p4).  Whether or not the result is a wide string affects the
715132727Skan   meaning of octal and hexadecimal escapes (6.4.4.4p6,9).  But escape
716132727Skan   sequences do not continue across the boundary between two strings in
717132727Skan   a series (6.4.5p7), so we must not lose the boundaries.  Therefore
718132727Skan   cpp_interpret_string takes a vector of cpp_string structures, which
719132727Skan   we must arrange to provide.  */
720132727Skan
721132727Skanstatic enum cpp_ttype
722132727Skanlex_string (const cpp_token *tok, tree *valp, bool objc_string)
72390075Sobrien{
72490075Sobrien  tree value;
725132727Skan  bool wide = false;
726169699Skan  size_t concats = 0;
727132727Skan  struct obstack str_ob;
728132727Skan  cpp_string istr;
72952284Sobrien
730132727Skan  /* Try to avoid the overhead of creating and destroying an obstack
731132727Skan     for the common case of just one string.  */
732132727Skan  cpp_string str = tok->val.str;
733132727Skan  cpp_string *strs = &str;
73418334Speter
735132727Skan  if (tok->type == CPP_WSTRING)
736132727Skan    wide = true;
737132727Skan
738169699Skan retry:
739169699Skan  tok = cpp_get_token (parse_in);
740169699Skan  switch (tok->type)
74190075Sobrien    {
742169699Skan    case CPP_PADDING:
743169699Skan      goto retry;
744169699Skan    case CPP_ATSIGN:
745169699Skan      if (c_dialect_objc ())
746169699Skan	{
747169699Skan	  objc_string = true;
748169699Skan	  goto retry;
749169699Skan	}
750169699Skan      /* FALLTHROUGH */
75118334Speter
752169699Skan    default:
753169699Skan      break;
754169699Skan
755169699Skan    case CPP_WSTRING:
756169699Skan      wide = true;
757169699Skan      /* FALLTHROUGH */
758169699Skan
759169699Skan    case CPP_STRING:
760169699Skan      if (!concats)
76190075Sobrien	{
762169699Skan	  gcc_obstack_init (&str_ob);
763169699Skan	  obstack_grow (&str_ob, &str, sizeof (cpp_string));
76490075Sobrien	}
765169699Skan
766169699Skan      concats++;
767169699Skan      obstack_grow (&str_ob, &tok->val.str, sizeof (cpp_string));
768169699Skan      goto retry;
76990075Sobrien    }
77018334Speter
771132727Skan  /* We have read one more token than we want.  */
772132727Skan  _cpp_backup_tokens (parse_in, 1);
773169699Skan  if (concats)
774169699Skan    strs = XOBFINISH (&str_ob, cpp_string *);
77518334Speter
776169699Skan  if (concats && !objc_string && !in_system_header)
777169699Skan    warning (OPT_Wtraditional,
778169699Skan	     "traditional C rejects string constant concatenation");
779132727Skan
780169699Skan  if ((c_lex_string_translate
781169699Skan       ? cpp_interpret_string : cpp_interpret_string_notranslate)
782169699Skan      (parse_in, strs, concats + 1, &istr, wide))
78390075Sobrien    {
784169699Skan      value = build_string (istr.len, (char *) istr.text);
785169699Skan      free ((void *) istr.text);
786169699Skan
787169699Skan      if (c_lex_string_translate == -1)
788169699Skan	{
789169699Skan	  int xlated = cpp_interpret_string_notranslate (parse_in, strs,
790169699Skan							 concats + 1,
791169699Skan							 &istr, wide);
792169699Skan	  /* Assume that, if we managed to translate the string above,
793169699Skan	     then the untranslated parsing will always succeed.  */
794169699Skan	  gcc_assert (xlated);
795169699Skan
796169699Skan	  if (TREE_STRING_LENGTH (value) != (int) istr.len
797169699Skan	      || 0 != strncmp (TREE_STRING_POINTER (value), (char *) istr.text,
798169699Skan			       istr.len))
799169699Skan	    {
800169699Skan	      /* Arrange for us to return the untranslated string in
801169699Skan		 *valp, but to set up the C type of the translated
802169699Skan		 one.  */
803169699Skan	      *valp = build_string (istr.len, (char *) istr.text);
804169699Skan	      valp = &TREE_CHAIN (*valp);
805169699Skan	    }
806169699Skan	  free ((void *) istr.text);
807169699Skan	}
80818334Speter    }
80990075Sobrien  else
81090075Sobrien    {
811132727Skan      /* Callers cannot generally handle error_mark_node in this context,
812132727Skan	 so return the empty string instead.  cpp_interpret_string has
813132727Skan	 issued an error.  */
814132727Skan      if (wide)
815132727Skan	value = build_string (TYPE_PRECISION (wchar_type_node)
816132727Skan			      / TYPE_PRECISION (char_type_node),
817132727Skan			      "\0\0\0");  /* widest supported wchar_t
818132727Skan					     is 32 bits */
819132727Skan      else
820132727Skan	value = build_string (1, "");
82190075Sobrien    }
82218334Speter
823132727Skan  TREE_TYPE (value) = wide ? wchar_array_type_node : char_array_type_node;
824132727Skan  *valp = fix_string_type (value);
82518334Speter
826169699Skan  if (concats)
827132727Skan    obstack_free (&str_ob, 0);
828132727Skan
829132727Skan  return objc_string ? CPP_OBJC_STRING : wide ? CPP_WSTRING : CPP_STRING;
83018334Speter}
83118334Speter
83290075Sobrien/* Converts a (possibly wide) character constant token into a tree.  */
83390075Sobrienstatic tree
834132727Skanlex_charconst (const cpp_token *token)
83518334Speter{
836117415Skan  cppchar_t result;
83796263Sobrien  tree type, value;
83890075Sobrien  unsigned int chars_seen;
839117415Skan  int unsignedp;
84096263Sobrien
841117415Skan  result = cpp_interpret_charconst (parse_in, token,
842132727Skan				    &chars_seen, &unsignedp);
84396263Sobrien
844117415Skan  if (token->type == CPP_WCHAR)
845117415Skan    type = wchar_type_node;
846117415Skan  /* In C, a character constant has type 'int'.
847117415Skan     In C++ 'char', but multi-char charconsts have type 'int'.  */
848132727Skan  else if (!c_dialect_cxx () || chars_seen > 1)
849117415Skan    type = integer_type_node;
850117415Skan  else
851117415Skan    type = char_type_node;
85296263Sobrien
853169699Skan  /* Cast to cppchar_signed_t to get correct sign-extension of RESULT
854169699Skan     before possibly widening to HOST_WIDE_INT for build_int_cst.  */
855169699Skan  if (unsignedp || (cppchar_signed_t) result >= 0)
856169699Skan    value = build_int_cst_wide (type, result, 0);
857169699Skan  else
858169699Skan    value = build_int_cst_wide (type, (cppchar_signed_t) result, -1);
859169699Skan
86090075Sobrien  return value;
86118334Speter}
862