OSDN Git Service

2001-07-04 Daniel Berlin <dan@cgsoftware.com>
[pf3gnuchains/gcc-fork.git] / gcc / c-lex.c
1 /* Lexical analyzer for C and Objective C.
2    Copyright (C) 1987, 1988, 1989, 1992, 1994, 1995, 1996, 1997
3    1998, 1999, 2000 Free Software Foundation, Inc.
4
5 This file is part of GNU CC.
6
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING.  If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.  */
21
22 #include "config.h"
23 #include "system.h"
24
25 #include "rtl.h"
26 #include "expr.h"
27 #include "tree.h"
28 #include "input.h"
29 #include "output.h"
30 #include "c-lex.h"
31 #include "c-tree.h"
32 #include "flags.h"
33 #include "timevar.h"
34 #include "cpplib.h"
35 #include "c-pragma.h"
36 #include "toplev.h"
37 #include "intl.h"
38 #include "tm_p.h"
39 #include "splay-tree.h"
40
41 /* MULTIBYTE_CHARS support only works for native compilers.
42    ??? Ideally what we want is to model widechar support after
43    the current floating point support.  */
44 #ifdef CROSS_COMPILE
45 #undef MULTIBYTE_CHARS
46 #endif
47
48 #ifdef MULTIBYTE_CHARS
49 #include "mbchar.h"
50 #include <locale.h>
51 #endif /* MULTIBYTE_CHARS */
52 #ifndef GET_ENVIRONMENT
53 #define GET_ENVIRONMENT(ENV_VALUE,ENV_NAME) ((ENV_VALUE) = getenv (ENV_NAME))
54 #endif
55
56 /* The input filename as understood by CPP, where "" represents stdin.  */
57 static const char *cpp_filename;
58
59 /* We may keep statistics about how long which files took to compile.  */
60 static int header_time, body_time;
61 static splay_tree file_info_tree;
62
63 /* Cause the `yydebug' variable to be defined.  */
64 #define YYDEBUG 1
65
66 /* File used for outputting assembler code.  */
67 extern FILE *asm_out_file;
68
69 #undef WCHAR_TYPE_SIZE
70 #define WCHAR_TYPE_SIZE TYPE_PRECISION (wchar_type_node)
71
72 /* Number of bytes in a wide character.  */
73 #define WCHAR_BYTES (WCHAR_TYPE_SIZE / BITS_PER_UNIT)
74
75 int indent_level;        /* Number of { minus number of }. */
76 int pending_lang_change; /* If we need to switch languages - C++ only */
77 int c_header_level;      /* depth in C headers - C++ only */
78
79 /* Nonzero tells yylex to ignore \ in string constants.  */
80 static int ignore_escape_flag;
81
82 static void parse_float         PARAMS ((PTR));
83 static tree lex_number          PARAMS ((const char *, unsigned int));
84 static tree lex_string          PARAMS ((const char *, unsigned int, int));
85 static tree lex_charconst       PARAMS ((const cpp_token *));
86 static void update_header_times PARAMS ((const char *));
87 static int dump_one_header      PARAMS ((splay_tree_node, void *));
88 static void cb_ident            PARAMS ((cpp_reader *, const cpp_string *));
89 static void cb_file_change    PARAMS ((cpp_reader *, const cpp_file_change *));
90 static void cb_def_pragma       PARAMS ((cpp_reader *));
91 static void cb_define           PARAMS ((cpp_reader *, cpp_hashnode *));
92 static void cb_undef            PARAMS ((cpp_reader *, cpp_hashnode *));
93 \f
94 const char *
95 init_c_lex (filename)
96      const char *filename;
97 {
98   struct cpp_callbacks *cb;
99   struct c_fileinfo *toplevel;
100
101   /* Set up filename timing.  Must happen before cpp_start_read.  */
102   file_info_tree = splay_tree_new ((splay_tree_compare_fn)strcmp,
103                                    0,
104                                    (splay_tree_delete_value_fn)free);
105   toplevel = get_fileinfo ("<top level>");
106   if (flag_detailed_statistics)
107     {
108       header_time = 0;
109       body_time = get_run_time ();
110       toplevel->time = body_time;
111     }
112   
113 #ifdef MULTIBYTE_CHARS
114   /* Change to the native locale for multibyte conversions.  */
115   setlocale (LC_CTYPE, "");
116   GET_ENVIRONMENT (literal_codeset, "LANG");
117 #endif
118
119   cb = cpp_get_callbacks (parse_in);
120
121   cb->ident = cb_ident;
122   cb->file_change = cb_file_change;
123   cb->def_pragma = cb_def_pragma;
124
125   /* Set the debug callbacks if we can use them.  */
126   if (debug_info_level == DINFO_LEVEL_VERBOSE
127       && (write_symbols == DWARF_DEBUG || write_symbols == DWARF2_DEBUG))
128     {
129       cb->define = cb_define;
130       cb->undef = cb_undef;
131     }
132
133
134   if (filename == 0 || !strcmp (filename, "-"))
135     filename = "stdin", cpp_filename = "";
136   else
137     cpp_filename = filename;
138
139   /* Start it at 0.  */
140   lineno = 0;
141
142   return filename;
143 }
144
145 /* A thin wrapper around the real parser that initializes the 
146    integrated preprocessor after debug output has been initialized.  */
147
148 int
149 yyparse()
150 {
151   if (! cpp_start_read (parse_in, cpp_filename))
152     return 1;                   /* cpplib has emitted an error.  */
153
154   return yyparse_1();
155 }
156
157 struct c_fileinfo *
158 get_fileinfo (name)
159      const char *name;
160 {
161   splay_tree_node n;
162   struct c_fileinfo *fi;
163
164   n = splay_tree_lookup (file_info_tree, (splay_tree_key) name);
165   if (n)
166     return (struct c_fileinfo *) n->value;
167
168   fi = (struct c_fileinfo *) xmalloc (sizeof (struct c_fileinfo));
169   fi->time = 0;
170   fi->interface_only = 0;
171   fi->interface_unknown = 1;
172   splay_tree_insert (file_info_tree, (splay_tree_key) name,
173                      (splay_tree_value) fi);
174   return fi;
175 }
176
177 static void
178 update_header_times (name)
179      const char *name;
180 {
181   /* Changing files again.  This means currently collected time
182      is charged against header time, and body time starts back at 0.  */
183   if (flag_detailed_statistics)
184     {
185       int this_time = get_run_time ();
186       struct c_fileinfo *file = get_fileinfo (name);
187       header_time += this_time - body_time;
188       file->time += this_time - body_time;
189       body_time = this_time;
190     }
191 }
192
193 static int
194 dump_one_header (n, dummy)
195      splay_tree_node n;
196      void *dummy ATTRIBUTE_UNUSED;
197 {
198   print_time ((const char *) n->key,
199               ((struct c_fileinfo *) n->value)->time);
200   return 0;
201 }
202
203 void
204 dump_time_statistics ()
205 {
206   struct c_fileinfo *file = get_fileinfo (input_filename);
207   int this_time = get_run_time ();
208   file->time += this_time - body_time;
209
210   fprintf (stderr, "\n******\n");
211   print_time ("header files (total)", header_time);
212   print_time ("main file (total)", this_time - body_time);
213   fprintf (stderr, "ratio = %g : 1\n",
214            (double)header_time / (double)(this_time - body_time));
215   fprintf (stderr, "\n******\n");
216
217   splay_tree_foreach (file_info_tree, dump_one_header, 0);
218 }
219
220 /* Not yet handled: #pragma, #define, #undef.
221    No need to deal with linemarkers under normal conditions.  */
222
223 static void
224 cb_ident (pfile, str)
225      cpp_reader *pfile ATTRIBUTE_UNUSED;
226      const cpp_string *str ATTRIBUTE_UNUSED;
227 {
228 #ifdef ASM_OUTPUT_IDENT
229   if (! flag_no_ident)
230     {
231       /* Convert escapes in the string.  */
232       tree value = lex_string ((const char *)str->text, str->len, 0);
233       ASM_OUTPUT_IDENT (asm_out_file, TREE_STRING_POINTER (value));
234     }
235 #endif
236 }
237
238 static void
239 cb_file_change (pfile, fc)
240      cpp_reader *pfile ATTRIBUTE_UNUSED;
241      const cpp_file_change *fc;
242 {
243   if (fc->reason == FC_ENTER)
244     {
245       /* Don't stack the main buffer on the input stack;
246          we already did in compile_file.  */
247       if (fc->from.filename)
248         {
249           lineno = fc->from.lineno;
250           push_srcloc (fc->to.filename, 1);
251           input_file_stack->indent_level = indent_level;
252           debug_start_source_file (fc->from.lineno, fc->to.filename);
253 #ifndef NO_IMPLICIT_EXTERN_C
254           if (c_header_level)
255             ++c_header_level;
256           else if (fc->externc)
257             {
258               c_header_level = 1;
259               ++pending_lang_change;
260             }
261 #endif
262         }
263       else
264         main_input_filename = fc->to.filename;
265     }
266   else if (fc->reason == FC_LEAVE)
267     {
268       /* Popping out of a file.  */
269       if (input_file_stack->next)
270         {
271 #ifndef NO_IMPLICIT_EXTERN_C
272           if (c_header_level && --c_header_level == 0)
273             {
274               if (fc->externc)
275                 warning ("badly nested C headers from preprocessor");
276               --pending_lang_change;
277             }
278 #endif
279 #if 0
280           if (indent_level != input_file_stack->indent_level)
281             {
282               warning_with_file_and_line
283                 (input_filename, lineno,
284                  "This file contains more '%c's than '%c's.",
285                  indent_level > input_file_stack->indent_level ? '{' : '}',
286                  indent_level > input_file_stack->indent_level ? '}' : '{');
287             }
288 #endif
289           pop_srcloc ();
290           debug_end_source_file (input_file_stack->line);
291         }
292       else
293         error ("leaving more files than we entered");
294     }
295
296   update_header_times (fc->to.filename);
297   in_system_header = fc->sysp != 0;
298   input_filename = fc->to.filename;
299   lineno = fc->to.lineno;       /* Do we need this?  */
300
301   /* Hook for C++.  */
302   extract_interface_info ();
303 }
304
305 static void
306 cb_def_pragma (pfile)
307      cpp_reader *pfile;
308 {
309   /* Issue a warning message if we have been asked to do so.  Ignore
310      unknown pragmas in system headers unless an explicit
311      -Wunknown-pragmas has been given. */
312   if (warn_unknown_pragmas > in_system_header)
313     {
314       const unsigned char *space, *name = 0;
315       cpp_token s;
316
317       cpp_get_token (pfile, &s);
318       space = cpp_token_as_text (pfile, &s);
319       cpp_get_token (pfile, &s);
320       if (s.type == CPP_NAME)
321         name = cpp_token_as_text (pfile, &s);
322
323       lineno = cpp_get_line (parse_in)->line;
324       if (name)
325         warning ("ignoring #pragma %s %s", space, name);
326       else
327         warning ("ignoring #pragma %s", space);
328     }
329 }
330
331 /* #define callback for DWARF and DWARF2 debug info.  */
332 static void
333 cb_define (pfile, node)
334      cpp_reader *pfile;
335      cpp_hashnode *node;
336 {
337   debug_define (cpp_get_line (parse_in)->line,  (const char *) cpp_macro_definition (pfile, node));
338 }
339
340 /* #undef callback for DWARF and DWARF2 debug info.  */
341 static void
342 cb_undef (pfile, node)
343      cpp_reader *pfile ATTRIBUTE_UNUSED;
344      cpp_hashnode *node;
345 {
346   debug_undef (cpp_get_line (parse_in)->line, (const char *) NODE_NAME (node));
347 }
348
349 #if 0 /* not yet */
350 /* Returns nonzero if C is a universal-character-name.  Give an error if it
351    is not one which may appear in an identifier, as per [extendid].
352
353    Note that extended character support in identifiers has not yet been
354    implemented.  It is my personal opinion that this is not a desirable
355    feature.  Portable code cannot count on support for more than the basic
356    identifier character set.  */
357
358 static inline int
359 is_extended_char (c)
360      int c;
361 {
362 #ifdef TARGET_EBCDIC
363   return 0;
364 #else
365   /* ASCII.  */
366   if (c < 0x7f)
367     return 0;
368
369   /* None of the valid chars are outside the Basic Multilingual Plane (the
370      low 16 bits).  */
371   if (c > 0xffff)
372     {
373       error ("universal-character-name '\\U%08x' not valid in identifier", c);
374       return 1;
375     }
376   
377   /* Latin */
378   if ((c >= 0x00c0 && c <= 0x00d6)
379       || (c >= 0x00d8 && c <= 0x00f6)
380       || (c >= 0x00f8 && c <= 0x01f5)
381       || (c >= 0x01fa && c <= 0x0217)
382       || (c >= 0x0250 && c <= 0x02a8)
383       || (c >= 0x1e00 && c <= 0x1e9a)
384       || (c >= 0x1ea0 && c <= 0x1ef9))
385     return 1;
386
387   /* Greek */
388   if ((c == 0x0384)
389       || (c >= 0x0388 && c <= 0x038a)
390       || (c == 0x038c)
391       || (c >= 0x038e && c <= 0x03a1)
392       || (c >= 0x03a3 && c <= 0x03ce)
393       || (c >= 0x03d0 && c <= 0x03d6)
394       || (c == 0x03da)
395       || (c == 0x03dc)
396       || (c == 0x03de)
397       || (c == 0x03e0)
398       || (c >= 0x03e2 && c <= 0x03f3)
399       || (c >= 0x1f00 && c <= 0x1f15)
400       || (c >= 0x1f18 && c <= 0x1f1d)
401       || (c >= 0x1f20 && c <= 0x1f45)
402       || (c >= 0x1f48 && c <= 0x1f4d)
403       || (c >= 0x1f50 && c <= 0x1f57)
404       || (c == 0x1f59)
405       || (c == 0x1f5b)
406       || (c == 0x1f5d)
407       || (c >= 0x1f5f && c <= 0x1f7d)
408       || (c >= 0x1f80 && c <= 0x1fb4)
409       || (c >= 0x1fb6 && c <= 0x1fbc)
410       || (c >= 0x1fc2 && c <= 0x1fc4)
411       || (c >= 0x1fc6 && c <= 0x1fcc)
412       || (c >= 0x1fd0 && c <= 0x1fd3)
413       || (c >= 0x1fd6 && c <= 0x1fdb)
414       || (c >= 0x1fe0 && c <= 0x1fec)
415       || (c >= 0x1ff2 && c <= 0x1ff4)
416       || (c >= 0x1ff6 && c <= 0x1ffc))
417     return 1;
418
419   /* Cyrillic */
420   if ((c >= 0x0401 && c <= 0x040d)
421       || (c >= 0x040f && c <= 0x044f)
422       || (c >= 0x0451 && c <= 0x045c)
423       || (c >= 0x045e && c <= 0x0481)
424       || (c >= 0x0490 && c <= 0x04c4)
425       || (c >= 0x04c7 && c <= 0x04c8)
426       || (c >= 0x04cb && c <= 0x04cc)
427       || (c >= 0x04d0 && c <= 0x04eb)
428       || (c >= 0x04ee && c <= 0x04f5)
429       || (c >= 0x04f8 && c <= 0x04f9))
430     return 1;
431
432   /* Armenian */
433   if ((c >= 0x0531 && c <= 0x0556)
434       || (c >= 0x0561 && c <= 0x0587))
435     return 1;
436
437   /* Hebrew */
438   if ((c >= 0x05d0 && c <= 0x05ea)
439       || (c >= 0x05f0 && c <= 0x05f4))
440     return 1;
441
442   /* Arabic */
443   if ((c >= 0x0621 && c <= 0x063a)
444       || (c >= 0x0640 && c <= 0x0652)
445       || (c >= 0x0670 && c <= 0x06b7)
446       || (c >= 0x06ba && c <= 0x06be)
447       || (c >= 0x06c0 && c <= 0x06ce)
448       || (c >= 0x06e5 && c <= 0x06e7))
449     return 1;
450
451   /* Devanagari */
452   if ((c >= 0x0905 && c <= 0x0939)
453       || (c >= 0x0958 && c <= 0x0962))
454     return 1;
455
456   /* Bengali */
457   if ((c >= 0x0985 && c <= 0x098c)
458       || (c >= 0x098f && c <= 0x0990)
459       || (c >= 0x0993 && c <= 0x09a8)
460       || (c >= 0x09aa && c <= 0x09b0)
461       || (c == 0x09b2)
462       || (c >= 0x09b6 && c <= 0x09b9)
463       || (c >= 0x09dc && c <= 0x09dd)
464       || (c >= 0x09df && c <= 0x09e1)
465       || (c >= 0x09f0 && c <= 0x09f1))
466     return 1;
467
468   /* Gurmukhi */
469   if ((c >= 0x0a05 && c <= 0x0a0a)
470       || (c >= 0x0a0f && c <= 0x0a10)
471       || (c >= 0x0a13 && c <= 0x0a28)
472       || (c >= 0x0a2a && c <= 0x0a30)
473       || (c >= 0x0a32 && c <= 0x0a33)
474       || (c >= 0x0a35 && c <= 0x0a36)
475       || (c >= 0x0a38 && c <= 0x0a39)
476       || (c >= 0x0a59 && c <= 0x0a5c)
477       || (c == 0x0a5e))
478     return 1;
479
480   /* Gujarati */
481   if ((c >= 0x0a85 && c <= 0x0a8b)
482       || (c == 0x0a8d)
483       || (c >= 0x0a8f && c <= 0x0a91)
484       || (c >= 0x0a93 && c <= 0x0aa8)
485       || (c >= 0x0aaa && c <= 0x0ab0)
486       || (c >= 0x0ab2 && c <= 0x0ab3)
487       || (c >= 0x0ab5 && c <= 0x0ab9)
488       || (c == 0x0ae0))
489     return 1;
490
491   /* Oriya */
492   if ((c >= 0x0b05 && c <= 0x0b0c)
493       || (c >= 0x0b0f && c <= 0x0b10)
494       || (c >= 0x0b13 && c <= 0x0b28)
495       || (c >= 0x0b2a && c <= 0x0b30)
496       || (c >= 0x0b32 && c <= 0x0b33)
497       || (c >= 0x0b36 && c <= 0x0b39)
498       || (c >= 0x0b5c && c <= 0x0b5d)
499       || (c >= 0x0b5f && c <= 0x0b61))
500     return 1;
501
502   /* Tamil */
503   if ((c >= 0x0b85 && c <= 0x0b8a)
504       || (c >= 0x0b8e && c <= 0x0b90)
505       || (c >= 0x0b92 && c <= 0x0b95)
506       || (c >= 0x0b99 && c <= 0x0b9a)
507       || (c == 0x0b9c)
508       || (c >= 0x0b9e && c <= 0x0b9f)
509       || (c >= 0x0ba3 && c <= 0x0ba4)
510       || (c >= 0x0ba8 && c <= 0x0baa)
511       || (c >= 0x0bae && c <= 0x0bb5)
512       || (c >= 0x0bb7 && c <= 0x0bb9))
513     return 1;
514
515   /* Telugu */
516   if ((c >= 0x0c05 && c <= 0x0c0c)
517       || (c >= 0x0c0e && c <= 0x0c10)
518       || (c >= 0x0c12 && c <= 0x0c28)
519       || (c >= 0x0c2a && c <= 0x0c33)
520       || (c >= 0x0c35 && c <= 0x0c39)
521       || (c >= 0x0c60 && c <= 0x0c61))
522     return 1;
523
524   /* Kannada */
525   if ((c >= 0x0c85 && c <= 0x0c8c)
526       || (c >= 0x0c8e && c <= 0x0c90)
527       || (c >= 0x0c92 && c <= 0x0ca8)
528       || (c >= 0x0caa && c <= 0x0cb3)
529       || (c >= 0x0cb5 && c <= 0x0cb9)
530       || (c >= 0x0ce0 && c <= 0x0ce1))
531     return 1;
532
533   /* Malayalam */
534   if ((c >= 0x0d05 && c <= 0x0d0c)
535       || (c >= 0x0d0e && c <= 0x0d10)
536       || (c >= 0x0d12 && c <= 0x0d28)
537       || (c >= 0x0d2a && c <= 0x0d39)
538       || (c >= 0x0d60 && c <= 0x0d61))
539     return 1;
540
541   /* Thai */
542   if ((c >= 0x0e01 && c <= 0x0e30)
543       || (c >= 0x0e32 && c <= 0x0e33)
544       || (c >= 0x0e40 && c <= 0x0e46)
545       || (c >= 0x0e4f && c <= 0x0e5b))
546     return 1;
547
548   /* Lao */
549   if ((c >= 0x0e81 && c <= 0x0e82)
550       || (c == 0x0e84)
551       || (c == 0x0e87)
552       || (c == 0x0e88)
553       || (c == 0x0e8a)
554       || (c == 0x0e0d)
555       || (c >= 0x0e94 && c <= 0x0e97)
556       || (c >= 0x0e99 && c <= 0x0e9f)
557       || (c >= 0x0ea1 && c <= 0x0ea3)
558       || (c == 0x0ea5)
559       || (c == 0x0ea7)
560       || (c == 0x0eaa)
561       || (c == 0x0eab)
562       || (c >= 0x0ead && c <= 0x0eb0)
563       || (c == 0x0eb2)
564       || (c == 0x0eb3)
565       || (c == 0x0ebd)
566       || (c >= 0x0ec0 && c <= 0x0ec4)
567       || (c == 0x0ec6))
568     return 1;
569
570   /* Georgian */
571   if ((c >= 0x10a0 && c <= 0x10c5)
572       || (c >= 0x10d0 && c <= 0x10f6))
573     return 1;
574
575   /* Hiragana */
576   if ((c >= 0x3041 && c <= 0x3094)
577       || (c >= 0x309b && c <= 0x309e))
578     return 1;
579
580   /* Katakana */
581   if ((c >= 0x30a1 && c <= 0x30fe))
582     return 1;
583
584   /* Bopmofo */
585   if ((c >= 0x3105 && c <= 0x312c))
586     return 1;
587
588   /* Hangul */
589   if ((c >= 0x1100 && c <= 0x1159)
590       || (c >= 0x1161 && c <= 0x11a2)
591       || (c >= 0x11a8 && c <= 0x11f9))
592     return 1;
593
594   /* CJK Unified Ideographs */
595   if ((c >= 0xf900 && c <= 0xfa2d)
596       || (c >= 0xfb1f && c <= 0xfb36)
597       || (c >= 0xfb38 && c <= 0xfb3c)
598       || (c == 0xfb3e)
599       || (c >= 0xfb40 && c <= 0xfb41)
600       || (c >= 0xfb42 && c <= 0xfb44)
601       || (c >= 0xfb46 && c <= 0xfbb1)
602       || (c >= 0xfbd3 && c <= 0xfd3f)
603       || (c >= 0xfd50 && c <= 0xfd8f)
604       || (c >= 0xfd92 && c <= 0xfdc7)
605       || (c >= 0xfdf0 && c <= 0xfdfb)
606       || (c >= 0xfe70 && c <= 0xfe72)
607       || (c == 0xfe74)
608       || (c >= 0xfe76 && c <= 0xfefc)
609       || (c >= 0xff21 && c <= 0xff3a)
610       || (c >= 0xff41 && c <= 0xff5a)
611       || (c >= 0xff66 && c <= 0xffbe)
612       || (c >= 0xffc2 && c <= 0xffc7)
613       || (c >= 0xffca && c <= 0xffcf)
614       || (c >= 0xffd2 && c <= 0xffd7)
615       || (c >= 0xffda && c <= 0xffdc)
616       || (c >= 0x4e00 && c <= 0x9fa5))
617     return 1;
618
619   error ("universal-character-name '\\u%04x' not valid in identifier", c);
620   return 1;
621 #endif
622 }
623
624 /* Add the UTF-8 representation of C to the token_buffer.  */
625
626 static void
627 utf8_extend_token (c)
628      int c;
629 {
630   int shift, mask;
631
632   if      (c <= 0x0000007f)
633     {
634       extend_token (c);
635       return;
636     }
637   else if (c <= 0x000007ff)
638     shift = 6, mask = 0xc0;
639   else if (c <= 0x0000ffff)
640     shift = 12, mask = 0xe0;
641   else if (c <= 0x001fffff)
642     shift = 18, mask = 0xf0;
643   else if (c <= 0x03ffffff)
644     shift = 24, mask = 0xf8;
645   else
646     shift = 30, mask = 0xfc;
647
648   extend_token (mask | (c >> shift));
649   do
650     {
651       shift -= 6;
652       extend_token ((unsigned char) (0x80 | (c >> shift)));
653     }
654   while (shift);
655 }
656 #endif
657
658 #if 0
659 struct try_type
660 {
661   tree *node_var;
662   char unsigned_flag;
663   char long_flag;
664   char long_long_flag;
665 };
666
667 struct try_type type_sequence[] =
668 {
669   { &integer_type_node, 0, 0, 0},
670   { &unsigned_type_node, 1, 0, 0},
671   { &long_integer_type_node, 0, 1, 0},
672   { &long_unsigned_type_node, 1, 1, 0},
673   { &long_long_integer_type_node, 0, 1, 1},
674   { &long_long_unsigned_type_node, 1, 1, 1}
675 };
676 #endif /* 0 */
677 \f
678 struct pf_args
679 {
680   /* Input */
681   const char *str;
682   int fflag;
683   int lflag;
684   int base;
685   /* Output */
686   int conversion_errno;
687   REAL_VALUE_TYPE value;
688   tree type;
689 };
690  
691 static void
692 parse_float (data)
693   PTR data;
694 {
695   struct pf_args * args = (struct pf_args *) data;
696   const char *typename;
697
698   args->conversion_errno = 0;
699   args->type = double_type_node;
700   typename = "double";
701
702   /* The second argument, machine_mode, of REAL_VALUE_ATOF
703      tells the desired precision of the binary result
704      of decimal-to-binary conversion.  */
705
706   if (args->fflag)
707     {
708       if (args->lflag)
709         error ("both 'f' and 'l' suffixes on floating constant");
710
711       args->type = float_type_node;
712       typename = "float";
713     }
714   else if (args->lflag)
715     {
716       args->type = long_double_type_node;
717       typename = "long double";
718     }
719   else if (flag_single_precision_constant)
720     {
721       args->type = float_type_node;
722       typename = "float";
723     }
724
725   errno = 0;
726   if (args->base == 16)
727     args->value = REAL_VALUE_HTOF (args->str, TYPE_MODE (args->type));
728   else
729     args->value = REAL_VALUE_ATOF (args->str, TYPE_MODE (args->type));
730
731   args->conversion_errno = errno;
732   /* A diagnostic is required here by some ISO C testsuites.
733      This is not pedwarn, because some people don't want
734      an error for this.  */
735   if (REAL_VALUE_ISINF (args->value) && pedantic)
736     warning ("floating point number exceeds range of '%s'", typename);
737 }
738  
739 int
740 c_lex (value)
741      tree *value;
742 {
743   cpp_token tok;
744   enum cpp_ttype type;
745
746   retry:
747   timevar_push (TV_CPP);
748   cpp_get_token (parse_in, &tok);
749   timevar_pop (TV_CPP);
750
751   /* The C++ front end does horrible things with the current line
752      number.  To ensure an accurate line number, we must reset it
753      every time we return a token.  */
754   lineno = cpp_get_line (parse_in)->line;
755
756   *value = NULL_TREE;
757   type = tok.type;
758   switch (type)
759     {
760     case CPP_OPEN_BRACE:  indent_level++;  break;
761     case CPP_CLOSE_BRACE: indent_level--;  break;
762
763     /* Issue this error here, where we can get at tok.val.c.  */
764     case CPP_OTHER:
765       if (ISGRAPH (tok.val.c))
766         error ("stray '%c' in program", tok.val.c);
767       else
768         error ("stray '\\%o' in program", tok.val.c);
769       goto retry;
770       
771     case CPP_NAME:
772       *value = HT_IDENT_TO_GCC_IDENT (HT_NODE (tok.val.node));
773       break;
774
775     case CPP_INT:
776     case CPP_FLOAT:
777     case CPP_NUMBER:
778       *value = lex_number ((const char *)tok.val.str.text, tok.val.str.len);
779       break;
780
781     case CPP_CHAR:
782     case CPP_WCHAR:
783       *value = lex_charconst (&tok);
784       break;
785
786     case CPP_STRING:
787     case CPP_WSTRING:
788       *value = lex_string ((const char *)tok.val.str.text,
789                            tok.val.str.len, tok.type == CPP_WSTRING);
790       break;
791
792       /* These tokens should not be visible outside cpplib.  */
793     case CPP_HEADER_NAME:
794     case CPP_COMMENT:
795     case CPP_MACRO_ARG:
796       abort ();
797
798     default: break;
799     }
800
801   return type;
802 }
803
804 #define ERROR(msgid) do { error(msgid); goto syntax_error; } while(0)
805
806 static tree
807 lex_number (str, len)
808      const char *str;
809      unsigned int len;
810 {
811   int base = 10;
812   int count = 0;
813   int largest_digit = 0;
814   int numdigits = 0;
815   int overflow = 0;
816   int c;
817   tree value;
818   const char *p;
819   enum anon1 { NOT_FLOAT = 0, AFTER_POINT, AFTER_EXPON } floatflag = NOT_FLOAT;
820   
821   /* We actually store only HOST_BITS_PER_CHAR bits in each part.
822      The code below which fills the parts array assumes that a host
823      int is at least twice as wide as a host char, and that 
824      HOST_BITS_PER_WIDE_INT is an even multiple of HOST_BITS_PER_CHAR.
825      Two HOST_WIDE_INTs is the largest int literal we can store.
826      In order to detect overflow below, the number of parts (TOTAL_PARTS)
827      must be exactly the number of parts needed to hold the bits
828      of two HOST_WIDE_INTs. */
829 #define TOTAL_PARTS ((HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR) * 2)
830   unsigned int parts[TOTAL_PARTS];
831   
832   /* Optimize for most frequent case.  */
833   if (len == 1)
834     {
835       if (*str == '0')
836         return integer_zero_node;
837       else if (*str == '1')
838         return integer_one_node;
839       else
840         return build_int_2 (*str - '0', 0);
841     }
842
843   for (count = 0; count < TOTAL_PARTS; count++)
844     parts[count] = 0;
845
846   /* len is known to be >1 at this point.  */
847   p = str;
848
849   if (len > 2 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
850     {
851       base = 16;
852       p = str + 2;
853     }
854   /* The ISDIGIT check is so we are not confused by a suffix on 0.  */
855   else if (str[0] == '0' && ISDIGIT (str[1]))
856     {
857       base = 8;
858       p = str + 1;
859     }
860
861   do
862     {
863       c = *p++;
864
865       if (c == '.')
866         {
867           if (floatflag == AFTER_POINT)
868             ERROR ("too many decimal points in floating constant");
869           else if (floatflag == AFTER_EXPON)
870             ERROR ("decimal point in exponent - impossible!");
871           else
872             floatflag = AFTER_POINT;
873
874           if (base == 8)
875             base = 10;
876         }
877       else if (c == '_')
878         /* Possible future extension: silently ignore _ in numbers,
879            permitting cosmetic grouping - e.g. 0x8000_0000 == 0x80000000
880            but somewhat easier to read.  Ada has this?  */
881         ERROR ("underscore in number");
882       else
883         {
884           int n;
885           /* It is not a decimal point.
886              It should be a digit (perhaps a hex digit).  */
887
888           if (ISDIGIT (c))
889             {
890               n = c - '0';
891             }
892           else if (base <= 10 && (c == 'e' || c == 'E'))
893             {
894               base = 10;
895               floatflag = AFTER_EXPON;
896               break;
897             }
898           else if (base == 16 && (c == 'p' || c == 'P'))
899             {
900               floatflag = AFTER_EXPON;
901               break;   /* start of exponent */
902             }
903           else if (base == 16 && c >= 'a' && c <= 'f')
904             {
905               n = c - 'a' + 10;
906             }
907           else if (base == 16 && c >= 'A' && c <= 'F')
908             {
909               n = c - 'A' + 10;
910             }
911           else
912             {
913               p--;
914               break;  /* start of suffix */
915             }
916
917           if (n >= largest_digit)
918             largest_digit = n;
919           numdigits++;
920
921           for (count = 0; count < TOTAL_PARTS; count++)
922             {
923               parts[count] *= base;
924               if (count)
925                 {
926                   parts[count]
927                     += (parts[count-1] >> HOST_BITS_PER_CHAR);
928                   parts[count-1]
929                     &= (1 << HOST_BITS_PER_CHAR) - 1;
930                 }
931               else
932                 parts[0] += n;
933             }
934
935           /* If the highest-order part overflows (gets larger than
936              a host char will hold) then the whole number has 
937              overflowed.  Record this and truncate the highest-order
938              part. */
939           if (parts[TOTAL_PARTS - 1] >> HOST_BITS_PER_CHAR)
940             {
941               overflow = 1;
942               parts[TOTAL_PARTS - 1] &= (1 << HOST_BITS_PER_CHAR) - 1;
943             }
944         }
945     }
946   while (p < str + len);
947
948   /* This can happen on input like `int i = 0x;' */
949   if (numdigits == 0)
950     ERROR ("numeric constant with no digits");
951
952   if (largest_digit >= base)
953     ERROR ("numeric constant contains digits beyond the radix");
954
955   if (floatflag != NOT_FLOAT)
956     {
957       tree type;
958       int imag, fflag, lflag, conversion_errno;
959       REAL_VALUE_TYPE real;
960       struct pf_args args;
961       char *copy;
962
963       if (base == 16 && pedantic && !flag_isoc99)
964         pedwarn ("floating constant may not be in radix 16");
965
966       if (base == 16 && floatflag != AFTER_EXPON)
967         ERROR ("hexadecimal floating constant has no exponent");
968
969       /* Read explicit exponent if any, and put it in tokenbuf.  */
970       if ((base == 10 && ((c == 'e') || (c == 'E')))
971           || (base == 16 && (c == 'p' || c == 'P')))
972         {
973           if (p < str + len)
974             c = *p++;
975           if (p < str + len && (c == '+' || c == '-'))
976             c = *p++;
977           /* Exponent is decimal, even if string is a hex float.  */
978           if (! ISDIGIT (c))
979             ERROR ("floating constant exponent has no digits");
980           while (p < str + len && ISDIGIT (c))
981             c = *p++;
982           if (! ISDIGIT (c))
983             p--;
984         }
985
986       /* Copy the float constant now; we don't want any suffixes in the
987          string passed to parse_float.  */
988       copy = alloca (p - str + 1);
989       memcpy (copy, str, p - str);
990       copy[p - str] = '\0';
991
992       /* Now parse suffixes.  */
993       fflag = lflag = imag = 0;
994       while (p < str + len)
995         switch (*p++)
996           {
997           case 'f': case 'F':
998             if (fflag)
999               ERROR ("more than one 'f' suffix on floating constant");
1000             else if (warn_traditional && !in_system_header
1001                      && ! cpp_sys_macro_p (parse_in))
1002               warning ("traditional C rejects the 'f' suffix");
1003
1004             fflag = 1;
1005             break;
1006
1007           case 'l': case 'L':
1008             if (lflag)
1009               ERROR ("more than one 'l' suffix on floating constant");
1010             else if (warn_traditional && !in_system_header
1011                      && ! cpp_sys_macro_p (parse_in))
1012               warning ("traditional C rejects the 'l' suffix");
1013
1014             lflag = 1;
1015             break;
1016
1017           case 'i': case 'I':
1018           case 'j': case 'J':
1019             if (imag)
1020               ERROR ("more than one 'i' or 'j' suffix on floating constant");
1021             else if (pedantic)
1022               pedwarn ("ISO C forbids imaginary numeric constants");
1023             imag = 1;
1024             break;
1025
1026           default:
1027             ERROR ("invalid suffix on floating constant");
1028           }
1029
1030       /* Setup input for parse_float() */
1031       args.str = copy;
1032       args.fflag = fflag;
1033       args.lflag = lflag;
1034       args.base = base;
1035
1036       /* Convert string to a double, checking for overflow.  */
1037       if (do_float_handler (parse_float, (PTR) &args))
1038         {
1039           /* Receive output from parse_float() */
1040           real = args.value;
1041         }
1042       else
1043           /* We got an exception from parse_float() */
1044           ERROR ("floating constant out of range");
1045
1046       /* Receive output from parse_float() */
1047       conversion_errno = args.conversion_errno;
1048       type = args.type;
1049             
1050 #ifdef ERANGE
1051       /* ERANGE is also reported for underflow,
1052          so test the value to distinguish overflow from that.  */
1053       if (conversion_errno == ERANGE && !flag_traditional && pedantic
1054           && (REAL_VALUES_LESS (dconst1, real)
1055               || REAL_VALUES_LESS (real, dconstm1)))
1056         warning ("floating point number exceeds range of 'double'");
1057 #endif
1058
1059       /* Create a node with determined type and value.  */
1060       if (imag)
1061         value = build_complex (NULL_TREE, convert (type, integer_zero_node),
1062                                build_real (type, real));
1063       else
1064         value = build_real (type, real);
1065     }
1066   else
1067     {
1068       tree trad_type, ansi_type, type;
1069       HOST_WIDE_INT high, low;
1070       int spec_unsigned = 0;
1071       int spec_long = 0;
1072       int spec_long_long = 0;
1073       int spec_imag = 0;
1074       int suffix_lu = 0;
1075       int warn = 0, i;
1076
1077       trad_type = ansi_type = type = NULL_TREE;
1078       while (p < str + len)
1079         {
1080           c = *p++;
1081           switch (c)
1082             {
1083             case 'u': case 'U':
1084               if (spec_unsigned)
1085                 error ("two 'u' suffixes on integer constant");
1086               else if (warn_traditional && !in_system_header
1087                        && ! cpp_sys_macro_p (parse_in))
1088                 warning ("traditional C rejects the 'u' suffix");
1089
1090               spec_unsigned = 1;
1091               if (spec_long)
1092                 suffix_lu = 1;
1093               break;
1094
1095             case 'l': case 'L':
1096               if (spec_long)
1097                 {
1098                   if (spec_long_long)
1099                     error ("three 'l' suffixes on integer constant");
1100                   else if (suffix_lu)
1101                     error ("'lul' is not a valid integer suffix");
1102                   else if (c != spec_long)
1103                     error ("'Ll' and 'lL' are not valid integer suffixes");
1104                   else if (pedantic && ! flag_isoc99
1105                            && ! in_system_header && warn_long_long)
1106                     pedwarn ("ISO C89 forbids long long integer constants");
1107                   spec_long_long = 1;
1108                 }
1109               spec_long = c;
1110               break;
1111
1112             case 'i': case 'I': case 'j': case 'J':
1113               if (spec_imag)
1114                 error ("more than one 'i' or 'j' suffix on integer constant");
1115               else if (pedantic)
1116                 pedwarn ("ISO C forbids imaginary numeric constants");
1117               spec_imag = 1;
1118               break;
1119
1120             default:
1121               ERROR ("invalid suffix on integer constant");
1122             }
1123         }
1124
1125       /* If the literal overflowed, pedwarn about it now. */
1126       if (overflow)
1127         {
1128           warn = 1;
1129           pedwarn ("integer constant is too large for this configuration of the compiler - truncated to %d bits", HOST_BITS_PER_WIDE_INT * 2);
1130         }
1131
1132       /* This is simplified by the fact that our constant
1133          is always positive.  */
1134
1135       high = low = 0;
1136
1137       for (i = 0; i < HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR; i++)
1138         {
1139           high |= ((HOST_WIDE_INT) parts[i + (HOST_BITS_PER_WIDE_INT
1140                                               / HOST_BITS_PER_CHAR)]
1141                    << (i * HOST_BITS_PER_CHAR));
1142           low |= (HOST_WIDE_INT) parts[i] << (i * HOST_BITS_PER_CHAR);
1143         }
1144
1145       value = build_int_2 (low, high);
1146       TREE_TYPE (value) = long_long_unsigned_type_node;
1147
1148       /* If warn_traditional, calculate both the ISO type and the
1149          traditional type, then see if they disagree.
1150          Otherwise, calculate only the type for the dialect in use.  */
1151       if (warn_traditional || flag_traditional)
1152         {
1153           /* Calculate the traditional type.  */
1154           /* Traditionally, any constant is signed; but if unsigned is
1155              specified explicitly, obey that.  Use the smallest size
1156              with the right number of bits, except for one special
1157              case with decimal constants.  */
1158           if (! spec_long && base != 10
1159               && int_fits_type_p (value, unsigned_type_node))
1160             trad_type = spec_unsigned ? unsigned_type_node : integer_type_node;
1161           /* A decimal constant must be long if it does not fit in
1162              type int.  I think this is independent of whether the
1163              constant is signed.  */
1164           else if (! spec_long && base == 10
1165                    && int_fits_type_p (value, integer_type_node))
1166             trad_type = spec_unsigned ? unsigned_type_node : integer_type_node;
1167           else if (! spec_long_long)
1168             trad_type = (spec_unsigned
1169                          ? long_unsigned_type_node
1170                          : long_integer_type_node);
1171           else if (int_fits_type_p (value,
1172                                     spec_unsigned 
1173                                     ? long_long_unsigned_type_node
1174                                     : long_long_integer_type_node)) 
1175             trad_type = (spec_unsigned
1176                          ? long_long_unsigned_type_node
1177                          : long_long_integer_type_node);
1178           else
1179             trad_type = (spec_unsigned
1180                          ? widest_unsigned_literal_type_node
1181                          : widest_integer_literal_type_node);
1182         }
1183       if (warn_traditional || ! flag_traditional)
1184         {
1185           /* Calculate the ISO type.  */
1186           if (! spec_long && ! spec_unsigned
1187               && int_fits_type_p (value, integer_type_node))
1188             ansi_type = integer_type_node;
1189           else if (! spec_long && (base != 10 || spec_unsigned)
1190                    && int_fits_type_p (value, unsigned_type_node))
1191             ansi_type = unsigned_type_node;
1192           else if (! spec_unsigned && !spec_long_long
1193                    && int_fits_type_p (value, long_integer_type_node))
1194             ansi_type = long_integer_type_node;
1195           else if (! spec_long_long
1196                    && int_fits_type_p (value, long_unsigned_type_node))
1197             ansi_type = long_unsigned_type_node;
1198           else if (! spec_unsigned
1199                    && int_fits_type_p (value, long_long_integer_type_node))
1200             ansi_type = long_long_integer_type_node;
1201           else if (int_fits_type_p (value, long_long_unsigned_type_node))
1202             ansi_type = long_long_unsigned_type_node;
1203           else if (! spec_unsigned
1204                    && int_fits_type_p (value, widest_integer_literal_type_node))
1205             ansi_type = widest_integer_literal_type_node;
1206           else
1207             ansi_type = widest_unsigned_literal_type_node;
1208         }
1209
1210       type = flag_traditional ? trad_type : ansi_type;
1211
1212       /* We assume that constants specified in a non-decimal
1213          base are bit patterns, and that the programmer really
1214          meant what they wrote.  */
1215       if (warn_traditional && !in_system_header
1216           && base == 10 && trad_type != ansi_type)
1217         {
1218           if (TYPE_PRECISION (trad_type) != TYPE_PRECISION (ansi_type))
1219             warning ("width of integer constant changes with -traditional");
1220           else if (TREE_UNSIGNED (trad_type) != TREE_UNSIGNED (ansi_type))
1221             warning ("integer constant is unsigned in ISO C, signed with -traditional");
1222           else
1223             warning ("width of integer constant may change on other systems with -traditional");
1224         }
1225
1226       if (pedantic && !flag_traditional && (flag_isoc99 || !spec_long_long)
1227           && !warn
1228           && ((flag_isoc99
1229                ? TYPE_PRECISION (long_long_integer_type_node)
1230                : TYPE_PRECISION (long_integer_type_node)) < TYPE_PRECISION (type)))
1231         {
1232           warn = 1;
1233           pedwarn ("integer constant larger than the maximum value of %s",
1234                    (flag_isoc99
1235                     ? (TREE_UNSIGNED (type)
1236                        ? "an unsigned long long int"
1237                        : "a long long int")
1238                     : "an unsigned long int"));
1239         }
1240
1241       if (base == 10 && ! spec_unsigned && TREE_UNSIGNED (type))
1242         warning ("decimal constant is so large that it is unsigned");
1243
1244       if (spec_imag)
1245         {
1246           if (TYPE_PRECISION (type)
1247               <= TYPE_PRECISION (integer_type_node))
1248             value = build_complex (NULL_TREE, integer_zero_node,
1249                                    convert (integer_type_node, value));
1250           else
1251             ERROR ("complex integer constant is too wide for 'complex int'");
1252         }
1253       else if (flag_traditional && !int_fits_type_p (value, type))
1254         /* The traditional constant 0x80000000 is signed
1255            but doesn't fit in the range of int.
1256            This will change it to -0x80000000, which does fit.  */
1257         {
1258           TREE_TYPE (value) = unsigned_type (type);
1259           value = convert (type, value);
1260           TREE_OVERFLOW (value) = TREE_CONSTANT_OVERFLOW (value) = 0;
1261         }
1262       else
1263         TREE_TYPE (value) = type;
1264
1265       /* If it's still an integer (not a complex), and it doesn't
1266          fit in the type we choose for it, then pedwarn. */
1267
1268       if (! warn
1269           && TREE_CODE (TREE_TYPE (value)) == INTEGER_TYPE
1270           && ! int_fits_type_p (value, TREE_TYPE (value)))
1271         pedwarn ("integer constant is larger than the maximum value for its type");
1272     }
1273
1274   if (p < str + len)
1275     error ("missing white space after number '%.*s'", (int) (p - str), str);
1276
1277   return value;
1278
1279  syntax_error:
1280   return integer_zero_node;
1281 }
1282
1283 static tree
1284 lex_string (str, len, wide)
1285      const char *str;
1286      unsigned int len;
1287      int wide;
1288 {
1289   tree value;
1290   char *buf = alloca ((len + 1) * (wide ? WCHAR_BYTES : 1));
1291   char *q = buf;
1292   const char *p = str, *limit = str + len;
1293   unsigned int c;
1294   unsigned width = wide ? WCHAR_TYPE_SIZE
1295                         : TYPE_PRECISION (char_type_node);
1296
1297 #ifdef MULTIBYTE_CHARS
1298   /* Reset multibyte conversion state.  */
1299   (void) local_mbtowc (NULL, NULL, 0);
1300 #endif
1301
1302   while (p < limit)
1303     {
1304 #ifdef MULTIBYTE_CHARS
1305       wchar_t wc;
1306       int char_len;
1307
1308       char_len = local_mbtowc (&wc, p, limit - p);
1309       if (char_len == -1)
1310         {
1311           warning ("Ignoring invalid multibyte character");
1312           char_len = 1;
1313           c = *p++;
1314         }
1315       else
1316         {
1317           p += char_len;
1318           c = wc;
1319         }
1320 #else
1321       c = *p++;
1322 #endif
1323
1324       if (c == '\\' && !ignore_escape_flag)
1325         {
1326           unsigned int mask;
1327
1328           if (width < HOST_BITS_PER_INT)
1329             mask = ((unsigned int) 1 << width) - 1;
1330           else
1331             mask = ~0;
1332           c = cpp_parse_escape (parse_in, (const unsigned char **) &p,
1333                                 (const unsigned char *) limit,
1334                                 mask, flag_traditional);
1335         }
1336         
1337       /* Add this single character into the buffer either as a wchar_t
1338          or as a single byte.  */
1339       if (wide)
1340         {
1341           unsigned charwidth = TYPE_PRECISION (char_type_node);
1342           unsigned bytemask = (1 << charwidth) - 1;
1343           int byte;
1344
1345           for (byte = 0; byte < WCHAR_BYTES; ++byte)
1346             {
1347               int n;
1348               if (byte >= (int) sizeof (c))
1349                 n = 0;
1350               else
1351                 n = (c >> (byte * charwidth)) & bytemask;
1352               if (BYTES_BIG_ENDIAN)
1353                 q[WCHAR_BYTES - byte - 1] = n;
1354               else
1355                 q[byte] = n;
1356             }
1357           q += WCHAR_BYTES;
1358         }
1359       else
1360         {
1361           *q++ = c;
1362         }
1363     }
1364
1365   /* Terminate the string value, either with a single byte zero
1366      or with a wide zero.  */
1367
1368   if (wide)
1369     {
1370       memset (q, 0, WCHAR_BYTES);
1371       q += WCHAR_BYTES;
1372     }
1373   else
1374     {
1375       *q++ = '\0';
1376     }
1377
1378   value = build_string (q - buf, buf);
1379
1380   if (wide)
1381     TREE_TYPE (value) = wchar_array_type_node;
1382   else
1383     TREE_TYPE (value) = char_array_type_node;
1384   return value;
1385 }
1386
1387 /* Converts a (possibly wide) character constant token into a tree.  */
1388 static tree
1389 lex_charconst (token)
1390      const cpp_token *token;
1391 {
1392   HOST_WIDE_INT result;
1393   tree value;
1394   unsigned int chars_seen;
1395  
1396   result = cpp_interpret_charconst (parse_in, token, warn_multichar,
1397                                     flag_traditional, &chars_seen);
1398   if (token->type == CPP_WCHAR)
1399     {
1400       value = build_int_2 (result, 0);
1401       TREE_TYPE (value) = wchar_type_node;
1402     }
1403   else
1404     {
1405       if (result < 0)
1406         value = build_int_2 (result, -1);
1407       else
1408         value = build_int_2 (result, 0);
1409  
1410       /* In C, a character constant has type 'int'.
1411          In C++ 'char', but multi-char charconsts have type 'int'.  */
1412       if (c_language == clk_cplusplus && chars_seen <= 1)
1413         TREE_TYPE (value) = char_type_node;
1414       else
1415         TREE_TYPE (value) = integer_type_node;
1416     }
1417  
1418   return value;
1419 }