OSDN Git Service

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