xref: /dragonfly/contrib/gcc-8.0/gcc/c-family/c-lex.c (revision e6d22e9b)
1 /* Mainly the interface between cpplib and the C front ends.
2    Copyright (C) 1987-2018 Free Software Foundation, Inc.
3 
4 This file is part of GCC.
5 
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10 
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19 
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "target.h"
24 #include "c-common.h"
25 #include "timevar.h"
26 #include "stringpool.h"
27 #include "stor-layout.h"
28 #include "c-pragma.h"
29 #include "debug.h"
30 #include "file-prefix-map.h" /* remap_macro_filename()  */
31 
32 #include "attribs.h"
33 
34 /* We may keep statistics about how long which files took to compile.  */
35 static int header_time, body_time;
36 static splay_tree file_info_tree;
37 
38 int pending_lang_change; /* If we need to switch languages - C++ only */
39 int c_header_level;	 /* depth in C headers - C++ only */
40 
41 static tree interpret_integer (const cpp_token *, unsigned int,
42 			       enum overflow_type *);
43 static tree interpret_float (const cpp_token *, unsigned int, const char *,
44 			     enum overflow_type *);
45 static tree interpret_fixed (const cpp_token *, unsigned int);
46 static enum integer_type_kind narrowest_unsigned_type
47 	(const widest_int &, unsigned int);
48 static enum integer_type_kind narrowest_signed_type
49 	(const widest_int &, unsigned int);
50 static enum cpp_ttype lex_string (const cpp_token *, tree *, bool, bool);
51 static tree lex_charconst (const cpp_token *);
52 static void update_header_times (const char *);
53 static int dump_one_header (splay_tree_node, void *);
54 static void cb_line_change (cpp_reader *, const cpp_token *, int);
55 static void cb_ident (cpp_reader *, unsigned int, const cpp_string *);
56 static void cb_def_pragma (cpp_reader *, unsigned int);
57 static void cb_define (cpp_reader *, unsigned int, cpp_hashnode *);
58 static void cb_undef (cpp_reader *, unsigned int, cpp_hashnode *);
59 
60 void
61 init_c_lex (void)
62 {
63   struct cpp_callbacks *cb;
64   struct c_fileinfo *toplevel;
65 
66   /* The get_fileinfo data structure must be initialized before
67      cpp_read_main_file is called.  */
68   toplevel = get_fileinfo ("<top level>");
69   if (flag_detailed_statistics)
70     {
71       header_time = 0;
72       body_time = get_run_time ();
73       toplevel->time = body_time;
74     }
75 
76   cb = cpp_get_callbacks (parse_in);
77 
78   cb->line_change = cb_line_change;
79   cb->ident = cb_ident;
80   cb->def_pragma = cb_def_pragma;
81   cb->valid_pch = c_common_valid_pch;
82   cb->read_pch = c_common_read_pch;
83   cb->has_attribute = c_common_has_attribute;
84   cb->get_source_date_epoch = cb_get_source_date_epoch;
85   cb->get_suggestion = cb_get_suggestion;
86   cb->remap_filename = remap_macro_filename;
87 
88   /* Set the debug callbacks if we can use them.  */
89   if ((debug_info_level == DINFO_LEVEL_VERBOSE
90        && (write_symbols == DWARF2_DEBUG
91 	   || write_symbols == VMS_AND_DWARF2_DEBUG))
92       || flag_dump_go_spec != NULL)
93     {
94       cb->define = cb_define;
95       cb->undef = cb_undef;
96     }
97 }
98 
99 struct c_fileinfo *
100 get_fileinfo (const char *name)
101 {
102   splay_tree_node n;
103   struct c_fileinfo *fi;
104 
105   if (!file_info_tree)
106     file_info_tree = splay_tree_new ((splay_tree_compare_fn)
107 				     (void (*) (void)) strcmp,
108 				     0,
109 				     (splay_tree_delete_value_fn)
110 				     (void (*) (void)) free);
111 
112   n = splay_tree_lookup (file_info_tree, (splay_tree_key) name);
113   if (n)
114     return (struct c_fileinfo *) n->value;
115 
116   fi = XNEW (struct c_fileinfo);
117   fi->time = 0;
118   fi->interface_only = 0;
119   fi->interface_unknown = 1;
120   splay_tree_insert (file_info_tree, (splay_tree_key) name,
121 		     (splay_tree_value) fi);
122   return fi;
123 }
124 
125 static void
126 update_header_times (const char *name)
127 {
128   /* Changing files again.  This means currently collected time
129      is charged against header time, and body time starts back at 0.  */
130   if (flag_detailed_statistics)
131     {
132       int this_time = get_run_time ();
133       struct c_fileinfo *file = get_fileinfo (name);
134       header_time += this_time - body_time;
135       file->time += this_time - body_time;
136       body_time = this_time;
137     }
138 }
139 
140 static int
141 dump_one_header (splay_tree_node n, void * ARG_UNUSED (dummy))
142 {
143   print_time ((const char *) n->key,
144 	      ((struct c_fileinfo *) n->value)->time);
145   return 0;
146 }
147 
148 void
149 dump_time_statistics (void)
150 {
151   struct c_fileinfo *file = get_fileinfo (LOCATION_FILE (input_location));
152   int this_time = get_run_time ();
153   file->time += this_time - body_time;
154 
155   fprintf (stderr, "\n******\n");
156   print_time ("header files (total)", header_time);
157   print_time ("main file (total)", this_time - body_time);
158   fprintf (stderr, "ratio = %g : 1\n",
159 	   (double) header_time / (double) (this_time - body_time));
160   fprintf (stderr, "\n******\n");
161 
162   splay_tree_foreach (file_info_tree, dump_one_header, 0);
163 }
164 
165 static void
166 cb_ident (cpp_reader * ARG_UNUSED (pfile),
167 	  unsigned int ARG_UNUSED (line),
168 	  const cpp_string * ARG_UNUSED (str))
169 {
170   if (!flag_no_ident)
171     {
172       /* Convert escapes in the string.  */
173       cpp_string cstr = { 0, 0 };
174       if (cpp_interpret_string (pfile, str, 1, &cstr, CPP_STRING))
175 	{
176 	  targetm.asm_out.output_ident ((const char *) cstr.text);
177 	  free (CONST_CAST (unsigned char *, cstr.text));
178 	}
179     }
180 }
181 
182 /* Called at the start of every non-empty line.  TOKEN is the first
183    lexed token on the line.  Used for diagnostic line numbers.  */
184 static void
185 cb_line_change (cpp_reader * ARG_UNUSED (pfile), const cpp_token *token,
186 		int parsing_args)
187 {
188   if (token->type != CPP_EOF && !parsing_args)
189     input_location = token->src_loc;
190 }
191 
192 void
193 fe_file_change (const line_map_ordinary *new_map)
194 {
195   if (new_map == NULL)
196     return;
197 
198   if (new_map->reason == LC_ENTER)
199     {
200       /* Don't stack the main buffer on the input stack;
201 	 we already did in compile_file.  */
202       if (!MAIN_FILE_P (new_map))
203 	{
204 	  unsigned int included_at = LAST_SOURCE_LINE_LOCATION (new_map - 1);
205 	  int line = 0;
206 	  if (included_at > BUILTINS_LOCATION)
207 	    line = SOURCE_LINE (new_map - 1, included_at);
208 
209 	  input_location = new_map->start_location;
210 	  (*debug_hooks->start_source_file) (line, LINEMAP_FILE (new_map));
211 #ifndef NO_IMPLICIT_EXTERN_C
212 	  if (c_header_level)
213 	    ++c_header_level;
214 	  else if (LINEMAP_SYSP (new_map) == 2)
215 	    {
216 	      c_header_level = 1;
217 	      ++pending_lang_change;
218 	    }
219 #endif
220 	}
221     }
222   else if (new_map->reason == LC_LEAVE)
223     {
224 #ifndef NO_IMPLICIT_EXTERN_C
225       if (c_header_level && --c_header_level == 0)
226 	{
227 	  if (LINEMAP_SYSP (new_map) == 2)
228 	    warning (0, "badly nested C headers from preprocessor");
229 	  --pending_lang_change;
230 	}
231 #endif
232       input_location = new_map->start_location;
233 
234       (*debug_hooks->end_source_file) (LINEMAP_LINE (new_map));
235     }
236 
237   update_header_times (LINEMAP_FILE (new_map));
238   input_location = new_map->start_location;
239 }
240 
241 static void
242 cb_def_pragma (cpp_reader *pfile, source_location loc)
243 {
244   /* Issue a warning message if we have been asked to do so.  Ignore
245      unknown pragmas in system headers unless an explicit
246      -Wunknown-pragmas has been given.  */
247   if (warn_unknown_pragmas > in_system_header_at (input_location))
248     {
249       const unsigned char *space, *name;
250       const cpp_token *s;
251       location_t fe_loc = loc;
252 
253       space = name = (const unsigned char *) "";
254       s = cpp_get_token (pfile);
255       if (s->type != CPP_EOF)
256 	{
257 	  space = cpp_token_as_text (pfile, s);
258 	  s = cpp_get_token (pfile);
259 	  if (s->type == CPP_NAME)
260 	    name = cpp_token_as_text (pfile, s);
261 	}
262 
263       warning_at (fe_loc, OPT_Wunknown_pragmas, "ignoring #pragma %s %s",
264 		  space, name);
265     }
266 }
267 
268 /* #define callback for DWARF and DWARF2 debug info.  */
269 static void
270 cb_define (cpp_reader *pfile, source_location loc, cpp_hashnode *node)
271 {
272   const struct line_map *map = linemap_lookup (line_table, loc);
273   (*debug_hooks->define) (SOURCE_LINE (linemap_check_ordinary (map), loc),
274 			  (const char *) cpp_macro_definition (pfile, node));
275 }
276 
277 /* #undef callback for DWARF and DWARF2 debug info.  */
278 static void
279 cb_undef (cpp_reader * ARG_UNUSED (pfile), source_location loc,
280 	  cpp_hashnode *node)
281 {
282   const struct line_map *map = linemap_lookup (line_table, loc);
283   (*debug_hooks->undef) (SOURCE_LINE (linemap_check_ordinary (map), loc),
284 			 (const char *) NODE_NAME (node));
285 }
286 
287 /* Wrapper around cpp_get_token to skip CPP_PADDING tokens
288    and not consume CPP_EOF.  */
289 static const cpp_token *
290 get_token_no_padding (cpp_reader *pfile)
291 {
292   for (;;)
293     {
294       const cpp_token *ret = cpp_peek_token (pfile, 0);
295       if (ret->type == CPP_EOF)
296 	return ret;
297       ret = cpp_get_token (pfile);
298       if (ret->type != CPP_PADDING)
299 	return ret;
300     }
301 }
302 
303 /* Callback for has_attribute.  */
304 int
305 c_common_has_attribute (cpp_reader *pfile)
306 {
307   int result = 0;
308   tree attr_name = NULL_TREE;
309   const cpp_token *token;
310 
311   token = get_token_no_padding (pfile);
312   if (token->type != CPP_OPEN_PAREN)
313     {
314       cpp_error (pfile, CPP_DL_ERROR,
315 		 "missing '(' after \"__has_attribute\"");
316       return 0;
317     }
318   token = get_token_no_padding (pfile);
319   if (token->type == CPP_NAME)
320     {
321       attr_name = get_identifier ((const char *)
322 				  cpp_token_as_text (pfile, token));
323       attr_name = canonicalize_attr_name (attr_name);
324       if (c_dialect_cxx ())
325 	{
326 	  int idx = 0;
327 	  const cpp_token *nxt_token;
328 	  do
329 	    nxt_token = cpp_peek_token (pfile, idx++);
330 	  while (nxt_token->type == CPP_PADDING);
331 	  if (nxt_token->type == CPP_SCOPE)
332 	    {
333 	      get_token_no_padding (pfile); // Eat scope.
334 	      nxt_token = get_token_no_padding (pfile);
335 	      if (nxt_token->type == CPP_NAME)
336 		{
337 		  tree attr_ns = attr_name;
338 		  tree attr_id
339 		    = get_identifier ((const char *)
340 				      cpp_token_as_text (pfile, nxt_token));
341 		  attr_name = build_tree_list (attr_ns, attr_id);
342 		}
343 	      else
344 		{
345 		  cpp_error (pfile, CPP_DL_ERROR,
346 			     "attribute identifier required after scope");
347 		  attr_name = NULL_TREE;
348 		}
349 	    }
350 	  else
351 	    {
352 	      /* Some standard attributes need special handling.  */
353 	      if (is_attribute_p ("noreturn", attr_name))
354 		result = 200809;
355 	      else if (is_attribute_p ("deprecated", attr_name))
356 		result = 201309;
357 	      else if (is_attribute_p ("maybe_unused", attr_name)
358 		       || is_attribute_p ("nodiscard", attr_name)
359 		       || is_attribute_p ("fallthrough", attr_name))
360 		result = 201603;
361 	      if (result)
362 		attr_name = NULL_TREE;
363 	    }
364 	}
365       if (attr_name)
366 	{
367 	  init_attributes ();
368 	  const struct attribute_spec *attr = lookup_attribute_spec (attr_name);
369 	  if (attr)
370 	    result = 1;
371 	}
372     }
373   else
374     {
375       cpp_error (pfile, CPP_DL_ERROR,
376 		 "macro \"__has_attribute\" requires an identifier");
377       return 0;
378     }
379 
380   if (get_token_no_padding (pfile)->type != CPP_CLOSE_PAREN)
381     cpp_error (pfile, CPP_DL_ERROR,
382 	       "missing ')' after \"__has_attribute\"");
383 
384   return result;
385 }
386 
387 /* Read a token and return its type.  Fill *VALUE with its value, if
388    applicable.  Fill *CPP_FLAGS with the token's flags, if it is
389    non-NULL.  */
390 
391 enum cpp_ttype
392 c_lex_with_flags (tree *value, location_t *loc, unsigned char *cpp_flags,
393 		  int lex_flags)
394 {
395   static bool no_more_pch;
396   const cpp_token *tok;
397   enum cpp_ttype type;
398   unsigned char add_flags = 0;
399   enum overflow_type overflow = OT_NONE;
400 
401   timevar_push (TV_CPP);
402  retry:
403   tok = cpp_get_token_with_location (parse_in, loc);
404   type = tok->type;
405 
406  retry_after_at:
407   switch (type)
408     {
409     case CPP_PADDING:
410       goto retry;
411 
412     case CPP_NAME:
413       *value = HT_IDENT_TO_GCC_IDENT (HT_NODE (tok->val.node.node));
414       break;
415 
416     case CPP_NUMBER:
417       {
418 	const char *suffix = NULL;
419 	unsigned int flags = cpp_classify_number (parse_in, tok, &suffix, *loc);
420 
421 	switch (flags & CPP_N_CATEGORY)
422 	  {
423 	  case CPP_N_INVALID:
424 	    /* cpplib has issued an error.  */
425 	    *value = error_mark_node;
426 	    break;
427 
428 	  case CPP_N_INTEGER:
429 	    /* C++ uses '0' to mark virtual functions as pure.
430 	       Set PURE_ZERO to pass this information to the C++ parser.  */
431 	    if (tok->val.str.len == 1 && *tok->val.str.text == '0')
432 	      add_flags = PURE_ZERO;
433 	    *value = interpret_integer (tok, flags, &overflow);
434 	    break;
435 
436 	  case CPP_N_FLOATING:
437 	    *value = interpret_float (tok, flags, suffix, &overflow);
438 	    break;
439 
440 	  default:
441 	    gcc_unreachable ();
442 	  }
443 
444 	if (flags & CPP_N_USERDEF)
445 	  {
446 	    char *str;
447 	    tree literal;
448 	    tree suffix_id = get_identifier (suffix);
449 	    int len = tok->val.str.len - strlen (suffix);
450 	    /* If this is going to be used as a C string to pass to a
451 	       raw literal operator, we need to add a trailing NUL.  */
452 	    tree num_string = build_string (len + 1,
453 					    (const char *) tok->val.str.text);
454 	    TREE_TYPE (num_string) = char_array_type_node;
455 	    num_string = fix_string_type (num_string);
456 	    str = CONST_CAST (char *, TREE_STRING_POINTER (num_string));
457 	    str[len] = '\0';
458 	    literal = build_userdef_literal (suffix_id, *value, overflow,
459 					     num_string);
460 	    *value = literal;
461 	  }
462       }
463       break;
464 
465     case CPP_ATSIGN:
466       /* An @ may give the next token special significance in Objective-C.  */
467       if (c_dialect_objc ())
468 	{
469 	  location_t atloc = *loc;
470 	  location_t newloc;
471 
472 	retry_at:
473 	  tok = cpp_get_token_with_location (parse_in, &newloc);
474 	  type = tok->type;
475 	  switch (type)
476 	    {
477 	    case CPP_PADDING:
478 	      goto retry_at;
479 
480 	    case CPP_STRING:
481 	    case CPP_WSTRING:
482 	    case CPP_STRING16:
483 	    case CPP_STRING32:
484 	    case CPP_UTF8STRING:
485 	      type = lex_string (tok, value, true, true);
486 	      break;
487 
488 	    case CPP_NAME:
489 	      *value = HT_IDENT_TO_GCC_IDENT (HT_NODE (tok->val.node.node));
490 	      if (OBJC_IS_AT_KEYWORD (C_RID_CODE (*value))
491 		  || OBJC_IS_CXX_KEYWORD (C_RID_CODE (*value)))
492 		{
493 		  type = CPP_AT_NAME;
494 		  /* Note the complication: if we found an OBJC_CXX
495 		     keyword, for example, 'class', we will be
496 		     returning a token of type CPP_AT_NAME and rid
497 		     code RID_CLASS (not RID_AT_CLASS).  The language
498 		     parser needs to convert that to RID_AT_CLASS.
499 		  */
500 		  break;
501 		}
502 	      /* FALLTHROUGH */
503 
504 	    default:
505 	      /* ... or not.  */
506 	      error_at (atloc, "stray %<@%> in program");
507 	      *loc = newloc;
508 	      goto retry_after_at;
509 	    }
510 	  break;
511 	}
512 
513       /* FALLTHROUGH */
514     case CPP_HASH:
515     case CPP_PASTE:
516       {
517 	unsigned char name[8];
518 
519 	*cpp_spell_token (parse_in, tok, name, true) = 0;
520 
521 	error_at (*loc, "stray %qs in program", name);
522       }
523 
524       goto retry;
525 
526     case CPP_OTHER:
527       {
528 	cppchar_t c = tok->val.str.text[0];
529 
530 	if (c == '"' || c == '\'')
531 	  error_at (*loc, "missing terminating %c character", (int) c);
532 	else if (ISGRAPH (c))
533 	  error_at (*loc, "stray %qc in program", (int) c);
534 	else
535 	  error_at (*loc, "stray %<\\%o%> in program", (int) c);
536       }
537       goto retry;
538 
539     case CPP_CHAR_USERDEF:
540     case CPP_WCHAR_USERDEF:
541     case CPP_CHAR16_USERDEF:
542     case CPP_CHAR32_USERDEF:
543     case CPP_UTF8CHAR_USERDEF:
544       {
545 	tree literal;
546 	cpp_token temp_tok = *tok;
547 	const char *suffix = cpp_get_userdef_suffix (tok);
548 	temp_tok.val.str.len -= strlen (suffix);
549 	temp_tok.type = cpp_userdef_char_remove_type (type);
550 	literal = build_userdef_literal (get_identifier (suffix),
551 					 lex_charconst (&temp_tok),
552 					 OT_NONE, NULL_TREE);
553 	*value = literal;
554       }
555       break;
556 
557     case CPP_CHAR:
558     case CPP_WCHAR:
559     case CPP_CHAR16:
560     case CPP_CHAR32:
561     case CPP_UTF8CHAR:
562       *value = lex_charconst (tok);
563       break;
564 
565     case CPP_STRING_USERDEF:
566     case CPP_WSTRING_USERDEF:
567     case CPP_STRING16_USERDEF:
568     case CPP_STRING32_USERDEF:
569     case CPP_UTF8STRING_USERDEF:
570       {
571 	tree literal, string;
572 	const char *suffix = cpp_get_userdef_suffix (tok);
573 	string = build_string (tok->val.str.len - strlen (suffix),
574 			       (const char *) tok->val.str.text);
575 	literal = build_userdef_literal (get_identifier (suffix),
576 					 string, OT_NONE, NULL_TREE);
577 	*value = literal;
578       }
579       break;
580 
581     case CPP_STRING:
582     case CPP_WSTRING:
583     case CPP_STRING16:
584     case CPP_STRING32:
585     case CPP_UTF8STRING:
586       if ((lex_flags & C_LEX_STRING_NO_JOIN) == 0)
587 	{
588 	  type = lex_string (tok, value, false,
589 			     (lex_flags & C_LEX_STRING_NO_TRANSLATE) == 0);
590 	  break;
591 	}
592       *value = build_string (tok->val.str.len, (const char *) tok->val.str.text);
593       break;
594 
595     case CPP_PRAGMA:
596       *value = build_int_cst (integer_type_node, tok->val.pragma);
597       break;
598 
599       /* These tokens should not be visible outside cpplib.  */
600     case CPP_HEADER_NAME:
601     case CPP_MACRO_ARG:
602       gcc_unreachable ();
603 
604     /* CPP_COMMENT will appear when compiling with -C.  Ignore, except
605        when it is a FALLTHROUGH comment, in that case set
606        PREV_FALLTHROUGH flag on the next non-comment token.  */
607     case CPP_COMMENT:
608       if (tok->flags & PREV_FALLTHROUGH)
609 	{
610 	  do
611 	    {
612 	      tok = cpp_get_token_with_location (parse_in, loc);
613 	      type = tok->type;
614 	    }
615 	  while (type == CPP_PADDING || type == CPP_COMMENT);
616 	  add_flags |= PREV_FALLTHROUGH;
617 	  goto retry_after_at;
618 	}
619        goto retry;
620 
621     default:
622       *value = NULL_TREE;
623       break;
624     }
625 
626   if (cpp_flags)
627     *cpp_flags = tok->flags | add_flags;
628 
629   if (!no_more_pch)
630     {
631       no_more_pch = true;
632       c_common_no_more_pch ();
633     }
634 
635   timevar_pop (TV_CPP);
636 
637   return type;
638 }
639 
640 /* Returns the narrowest C-visible unsigned type, starting with the
641    minimum specified by FLAGS, that can fit HIGH:LOW, or itk_none if
642    there isn't one.  */
643 
644 static enum integer_type_kind
645 narrowest_unsigned_type (const widest_int &val, unsigned int flags)
646 {
647   int itk;
648 
649   if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
650     itk = itk_unsigned_int;
651   else if ((flags & CPP_N_WIDTH) == CPP_N_MEDIUM)
652     itk = itk_unsigned_long;
653   else
654     itk = itk_unsigned_long_long;
655 
656   for (; itk < itk_none; itk += 2 /* skip unsigned types */)
657     {
658       tree upper;
659 
660       if (integer_types[itk] == NULL_TREE)
661 	continue;
662       upper = TYPE_MAX_VALUE (integer_types[itk]);
663 
664       if (wi::geu_p (wi::to_widest (upper), val))
665 	return (enum integer_type_kind) itk;
666     }
667 
668   return itk_none;
669 }
670 
671 /* Ditto, but narrowest signed type.  */
672 static enum integer_type_kind
673 narrowest_signed_type (const widest_int &val, unsigned int flags)
674 {
675   int itk;
676 
677   if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
678     itk = itk_int;
679   else if ((flags & CPP_N_WIDTH) == CPP_N_MEDIUM)
680     itk = itk_long;
681   else
682     itk = itk_long_long;
683 
684   for (; itk < itk_none; itk += 2 /* skip signed types */)
685     {
686       tree upper;
687 
688       if (integer_types[itk] == NULL_TREE)
689 	continue;
690       upper = TYPE_MAX_VALUE (integer_types[itk]);
691 
692       if (wi::geu_p (wi::to_widest (upper), val))
693 	return (enum integer_type_kind) itk;
694     }
695 
696   return itk_none;
697 }
698 
699 /* Interpret TOKEN, an integer with FLAGS as classified by cpplib.  */
700 static tree
701 interpret_integer (const cpp_token *token, unsigned int flags,
702 		   enum overflow_type *overflow)
703 {
704   tree value, type;
705   enum integer_type_kind itk;
706   cpp_num integer;
707   HOST_WIDE_INT ival[3];
708 
709   *overflow = OT_NONE;
710 
711   integer = cpp_interpret_integer (parse_in, token, flags);
712   if (integer.overflow)
713     *overflow = OT_OVERFLOW;
714 
715   ival[0] = integer.low;
716   ival[1] = integer.high;
717   ival[2] = 0;
718   widest_int wval = widest_int::from_array (ival, 3);
719 
720   /* The type of a constant with a U suffix is straightforward.  */
721   if (flags & CPP_N_UNSIGNED)
722     itk = narrowest_unsigned_type (wval, flags);
723   else
724     {
725       /* The type of a potentially-signed integer constant varies
726 	 depending on the base it's in, the standard in use, and the
727 	 length suffixes.  */
728       enum integer_type_kind itk_u
729 	= narrowest_unsigned_type (wval, flags);
730       enum integer_type_kind itk_s
731 	= narrowest_signed_type (wval, flags);
732 
733       /* In both C89 and C99, octal and hex constants may be signed or
734 	 unsigned, whichever fits tighter.  We do not warn about this
735 	 choice differing from the traditional choice, as the constant
736 	 is probably a bit pattern and either way will work.  */
737       if ((flags & CPP_N_RADIX) != CPP_N_DECIMAL)
738 	itk = MIN (itk_u, itk_s);
739       else
740 	{
741 	  /* In C99, decimal constants are always signed.
742 	     In C89, decimal constants that don't fit in long have
743 	     undefined behavior; we try to make them unsigned long.
744 	     In GCC's extended C89, that last is true of decimal
745 	     constants that don't fit in long long, too.  */
746 
747 	  itk = itk_s;
748 	  if (itk_s > itk_u && itk_s > itk_long)
749 	    {
750 	      if (!flag_isoc99)
751 		{
752 		  if (itk_u < itk_unsigned_long)
753 		    itk_u = itk_unsigned_long;
754 		  itk = itk_u;
755 		  warning (0, "this decimal constant is unsigned only in ISO C90");
756 		}
757 	      else
758 		warning (OPT_Wtraditional,
759 			 "this decimal constant would be unsigned in ISO C90");
760 	    }
761 	}
762     }
763 
764   if (itk == itk_none)
765     /* cpplib has already issued a warning for overflow.  */
766     type = ((flags & CPP_N_UNSIGNED)
767 	    ? widest_unsigned_literal_type_node
768 	    : widest_integer_literal_type_node);
769   else
770     {
771       type = integer_types[itk];
772       if (itk > itk_unsigned_long
773 	  && (flags & CPP_N_WIDTH) != CPP_N_LARGE)
774 	emit_diagnostic
775 	  ((c_dialect_cxx () ? cxx_dialect == cxx98 : !flag_isoc99)
776 	   ? DK_PEDWARN : DK_WARNING,
777 	   input_location, OPT_Wlong_long,
778 	   (flags & CPP_N_UNSIGNED)
779 	   ? "integer constant is too large for %<unsigned long%> type"
780 	   : "integer constant is too large for %<long%> type");
781     }
782 
783   value = wide_int_to_tree (type, wval);
784 
785   /* Convert imaginary to a complex type.  */
786   if (flags & CPP_N_IMAGINARY)
787     value = build_complex (NULL_TREE, build_int_cst (type, 0), value);
788 
789   return value;
790 }
791 
792 /* Interpret TOKEN, a floating point number with FLAGS as classified
793    by cpplib.  For C++11 SUFFIX may contain a user-defined literal suffix.  */
794 static tree
795 interpret_float (const cpp_token *token, unsigned int flags,
796 		 const char *suffix, enum overflow_type *overflow)
797 {
798   tree type;
799   tree const_type;
800   tree value;
801   REAL_VALUE_TYPE real;
802   REAL_VALUE_TYPE real_trunc;
803   char *copy;
804   size_t copylen;
805 
806   *overflow = OT_NONE;
807 
808   /* Default (no suffix) depends on whether the FLOAT_CONST_DECIMAL64
809      pragma has been used and is either double or _Decimal64.  Types
810      that are not allowed with decimal float default to double.  */
811   if (flags & CPP_N_DEFAULT)
812     {
813       flags ^= CPP_N_DEFAULT;
814       flags |= CPP_N_MEDIUM;
815 
816       if (((flags & CPP_N_HEX) == 0) && ((flags & CPP_N_IMAGINARY) == 0))
817 	{
818 	  warning (OPT_Wunsuffixed_float_constants,
819 		   "unsuffixed float constant");
820 	  if (float_const_decimal64_p ())
821 	    flags |= CPP_N_DFLOAT;
822 	}
823     }
824 
825   /* Decode _Fract and _Accum.  */
826   if (flags & CPP_N_FRACT || flags & CPP_N_ACCUM)
827     return interpret_fixed (token, flags);
828 
829   /* Decode type based on width and properties. */
830   if (flags & CPP_N_DFLOAT)
831     if ((flags & CPP_N_WIDTH) == CPP_N_LARGE)
832       type = dfloat128_type_node;
833     else if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
834       type = dfloat32_type_node;
835     else
836       type = dfloat64_type_node;
837   else
838     if (flags & CPP_N_WIDTH_MD)
839       {
840 	char suffix;
841 	machine_mode mode;
842 
843 	if ((flags & CPP_N_WIDTH_MD) == CPP_N_MD_W)
844 	  suffix = 'w';
845 	else
846 	  suffix = 'q';
847 
848 	mode = targetm.c.mode_for_suffix (suffix);
849 	if (mode == VOIDmode)
850 	  {
851 	    error ("unsupported non-standard suffix on floating constant");
852 
853 	    return error_mark_node;
854 	  }
855 	else
856 	  pedwarn (input_location, OPT_Wpedantic, "non-standard suffix on floating constant");
857 
858 	type = c_common_type_for_mode (mode, 0);
859 	gcc_assert (type);
860       }
861     else if ((flags & (CPP_N_FLOATN | CPP_N_FLOATNX)) != 0)
862       {
863 	unsigned int n = (flags & CPP_N_WIDTH_FLOATN_NX) >> CPP_FLOATN_SHIFT;
864 	bool extended = (flags & CPP_N_FLOATNX) != 0;
865 	type = NULL_TREE;
866 	for (int i = 0; i < NUM_FLOATN_NX_TYPES; i++)
867 	  if (floatn_nx_types[i].n == (int) n
868 	      && floatn_nx_types[i].extended == extended)
869 	    {
870 	      type = FLOATN_NX_TYPE_NODE (i);
871 	      break;
872 	    }
873 	if (type == NULL_TREE)
874 	  {
875 	    error ("unsupported non-standard suffix on floating constant");
876 	    return error_mark_node;
877 	  }
878 	else
879 	  pedwarn (input_location, OPT_Wpedantic, "non-standard suffix on floating constant");
880       }
881     else if ((flags & CPP_N_WIDTH) == CPP_N_LARGE)
882       type = long_double_type_node;
883     else if ((flags & CPP_N_WIDTH) == CPP_N_SMALL
884 	     || flag_single_precision_constant)
885       type = float_type_node;
886     else
887       type = double_type_node;
888 
889   const_type = excess_precision_type (type);
890   if (!const_type)
891     const_type = type;
892 
893   /* Copy the constant to a nul-terminated buffer.  If the constant
894      has any suffixes, cut them off; REAL_VALUE_ATOF/ REAL_VALUE_HTOF
895      can't handle them.  */
896   copylen = token->val.str.len;
897   if (flags & CPP_N_USERDEF)
898     copylen -= strlen (suffix);
899   else if (flags & CPP_N_DFLOAT)
900     copylen -= 2;
901   else
902     {
903       if ((flags & CPP_N_WIDTH) != CPP_N_MEDIUM)
904 	/* Must be an F or L or machine defined suffix.  */
905 	copylen--;
906       if (flags & CPP_N_IMAGINARY)
907 	/* I or J suffix.  */
908 	copylen--;
909       if (flags & CPP_N_FLOATNX)
910 	copylen--;
911       if (flags & (CPP_N_FLOATN | CPP_N_FLOATNX))
912 	{
913 	  unsigned int n = (flags & CPP_N_WIDTH_FLOATN_NX) >> CPP_FLOATN_SHIFT;
914 	  while (n > 0)
915 	    {
916 	      copylen--;
917 	      n /= 10;
918 	    }
919 	}
920     }
921 
922   copy = (char *) alloca (copylen + 1);
923   if (cxx_dialect > cxx11)
924     {
925       size_t maxlen = 0;
926       for (size_t i = 0; i < copylen; ++i)
927         if (token->val.str.text[i] != '\'')
928           copy[maxlen++] = token->val.str.text[i];
929       copy[maxlen] = '\0';
930     }
931   else
932     {
933       memcpy (copy, token->val.str.text, copylen);
934       copy[copylen] = '\0';
935     }
936 
937   real_from_string3 (&real, copy, TYPE_MODE (const_type));
938   if (const_type != type)
939     /* Diagnosing if the result of converting the value with excess
940        precision to the semantic type would overflow (with associated
941        double rounding) is more appropriate than diagnosing if the
942        result of converting the string directly to the semantic type
943        would overflow.  */
944     real_convert (&real_trunc, TYPE_MODE (type), &real);
945 
946   /* Both C and C++ require a diagnostic for a floating constant
947      outside the range of representable values of its type.  Since we
948      have __builtin_inf* to produce an infinity, this is now a
949      mandatory pedwarn if the target does not support infinities.  */
950   if (REAL_VALUE_ISINF (real)
951       || (const_type != type && REAL_VALUE_ISINF (real_trunc)))
952     {
953       *overflow = OT_OVERFLOW;
954       if (!(flags & CPP_N_USERDEF))
955 	{
956 	  if (!MODE_HAS_INFINITIES (TYPE_MODE (type)))
957 	    pedwarn (input_location, 0,
958 		     "floating constant exceeds range of %qT", type);
959 	  else
960 	    warning (OPT_Woverflow,
961 		     "floating constant exceeds range of %qT", type);
962 	}
963     }
964   /* We also give a warning if the value underflows.  */
965   else if (real_equal (&real, &dconst0)
966 	   || (const_type != type
967 	       && real_equal (&real_trunc, &dconst0)))
968     {
969       REAL_VALUE_TYPE realvoidmode;
970       int oflow = real_from_string (&realvoidmode, copy);
971       *overflow = (oflow == 0 ? OT_NONE
972 			      : (oflow < 0 ? OT_UNDERFLOW : OT_OVERFLOW));
973       if (!(flags & CPP_N_USERDEF))
974 	{
975 	  if (oflow < 0 || !real_equal (&realvoidmode, &dconst0))
976 	    warning (OPT_Woverflow, "floating constant truncated to zero");
977 	}
978     }
979 
980   /* Create a node with determined type and value.  */
981   value = build_real (const_type, real);
982   if (flags & CPP_N_IMAGINARY)
983     {
984       value = build_complex (NULL_TREE,
985 			     fold_convert (const_type,
986 					   integer_zero_node), value);
987       if (type != const_type)
988 	{
989 	  const_type = TREE_TYPE (value);
990 	  type = build_complex_type (type);
991 	}
992     }
993 
994   if (type != const_type)
995     value = build1_loc (token->src_loc, EXCESS_PRECISION_EXPR, type, value);
996 
997   return value;
998 }
999 
1000 /* Interpret TOKEN, a fixed-point number with FLAGS as classified
1001    by cpplib.  */
1002 
1003 static tree
1004 interpret_fixed (const cpp_token *token, unsigned int flags)
1005 {
1006   tree type;
1007   tree value;
1008   FIXED_VALUE_TYPE fixed;
1009   char *copy;
1010   size_t copylen;
1011 
1012   copylen = token->val.str.len;
1013 
1014   if (flags & CPP_N_FRACT) /* _Fract.  */
1015     {
1016       if (flags & CPP_N_UNSIGNED) /* Unsigned _Fract.  */
1017 	{
1018 	  if ((flags & CPP_N_WIDTH) == CPP_N_LARGE)
1019 	    {
1020 	      type = unsigned_long_long_fract_type_node;
1021 	      copylen -= 4;
1022 	    }
1023 	  else if ((flags & CPP_N_WIDTH) == CPP_N_MEDIUM)
1024 	    {
1025 	      type = unsigned_long_fract_type_node;
1026 	      copylen -= 3;
1027 	    }
1028 	  else if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
1029 	    {
1030 	      type = unsigned_short_fract_type_node;
1031 	      copylen -= 3;
1032 	    }
1033           else
1034 	    {
1035 	      type = unsigned_fract_type_node;
1036 	      copylen -= 2;
1037 	    }
1038 	}
1039       else /* Signed _Fract.  */
1040 	{
1041 	  if ((flags & CPP_N_WIDTH) == CPP_N_LARGE)
1042 	    {
1043 	      type = long_long_fract_type_node;
1044 	      copylen -= 3;
1045 	    }
1046 	  else if ((flags & CPP_N_WIDTH) == CPP_N_MEDIUM)
1047 	    {
1048 	      type = long_fract_type_node;
1049 	      copylen -= 2;
1050 	    }
1051 	  else if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
1052 	    {
1053 	      type = short_fract_type_node;
1054 	      copylen -= 2;
1055 	    }
1056           else
1057 	    {
1058 	      type = fract_type_node;
1059 	      copylen --;
1060 	    }
1061 	  }
1062     }
1063   else /* _Accum.  */
1064     {
1065       if (flags & CPP_N_UNSIGNED) /* Unsigned _Accum.  */
1066 	{
1067 	  if ((flags & CPP_N_WIDTH) == CPP_N_LARGE)
1068 	    {
1069 	      type = unsigned_long_long_accum_type_node;
1070 	      copylen -= 4;
1071 	    }
1072 	  else if ((flags & CPP_N_WIDTH) == CPP_N_MEDIUM)
1073 	    {
1074 	      type = unsigned_long_accum_type_node;
1075 	      copylen -= 3;
1076 	    }
1077 	  else if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
1078 	    {
1079 	      type = unsigned_short_accum_type_node;
1080 	      copylen -= 3;
1081 	     }
1082 	  else
1083 	    {
1084 	      type = unsigned_accum_type_node;
1085 	      copylen -= 2;
1086 	    }
1087 	}
1088       else /* Signed _Accum.  */
1089         {
1090 	  if ((flags & CPP_N_WIDTH) == CPP_N_LARGE)
1091 	    {
1092 	      type = long_long_accum_type_node;
1093 	      copylen -= 3;
1094 	    }
1095 	  else if ((flags & CPP_N_WIDTH) == CPP_N_MEDIUM)
1096 	    {
1097 	      type = long_accum_type_node;
1098 	      copylen -= 2;
1099 	    }
1100 	  else if ((flags & CPP_N_WIDTH) == CPP_N_SMALL)
1101 	    {
1102 	      type = short_accum_type_node;
1103 	      copylen -= 2;
1104 	    }
1105 	  else
1106 	    {
1107 	      type = accum_type_node;
1108 	      copylen --;
1109 	    }
1110 	}
1111     }
1112 
1113   copy = (char *) alloca (copylen + 1);
1114   memcpy (copy, token->val.str.text, copylen);
1115   copy[copylen] = '\0';
1116 
1117   fixed_from_string (&fixed, copy, SCALAR_TYPE_MODE (type));
1118 
1119   /* Create a node with determined type and value.  */
1120   value = build_fixed (type, fixed);
1121 
1122   return value;
1123 }
1124 
1125 /* Convert a series of STRING, WSTRING, STRING16, STRING32 and/or
1126    UTF8STRING tokens into a tree, performing string constant
1127    concatenation.  TOK is the first of these.  VALP is the location to
1128    write the string into.  OBJC_STRING indicates whether an '@' token
1129    preceded the incoming token (in that case, the strings can either
1130    be ObjC strings, preceded by a single '@', or normal strings, not
1131    preceded by '@'.  The result will be a CPP_OBJC_STRING).  Returns
1132    the CPP token type of the result (CPP_STRING, CPP_WSTRING,
1133    CPP_STRING32, CPP_STRING16, CPP_UTF8STRING, or CPP_OBJC_STRING).
1134 
1135    This is unfortunately more work than it should be.  If any of the
1136    strings in the series has an L prefix, the result is a wide string
1137    (6.4.5p4).  Whether or not the result is a wide string affects the
1138    meaning of octal and hexadecimal escapes (6.4.4.4p6,9).  But escape
1139    sequences do not continue across the boundary between two strings in
1140    a series (6.4.5p7), so we must not lose the boundaries.  Therefore
1141    cpp_interpret_string takes a vector of cpp_string structures, which
1142    we must arrange to provide.  */
1143 
1144 static enum cpp_ttype
1145 lex_string (const cpp_token *tok, tree *valp, bool objc_string, bool translate)
1146 {
1147   tree value;
1148   size_t concats = 0;
1149   struct obstack str_ob;
1150   struct obstack loc_ob;
1151   cpp_string istr;
1152   enum cpp_ttype type = tok->type;
1153 
1154   /* Try to avoid the overhead of creating and destroying an obstack
1155      for the common case of just one string.  */
1156   cpp_string str = tok->val.str;
1157   location_t init_loc = tok->src_loc;
1158   cpp_string *strs = &str;
1159   location_t *locs = NULL;
1160 
1161   /* objc_at_sign_was_seen is only used when doing Objective-C string
1162      concatenation.  It is 'true' if we have seen an '@' before the
1163      current string, and 'false' if not.  We must see exactly one or
1164      zero '@' before each string.  */
1165   bool objc_at_sign_was_seen = false;
1166 
1167  retry:
1168   tok = cpp_get_token (parse_in);
1169   switch (tok->type)
1170     {
1171     case CPP_PADDING:
1172       goto retry;
1173     case CPP_ATSIGN:
1174       if (objc_string)
1175 	{
1176 	  if (objc_at_sign_was_seen)
1177 	    error ("repeated %<@%> before Objective-C string");
1178 
1179 	  objc_at_sign_was_seen = true;
1180 	  goto retry;
1181 	}
1182       /* FALLTHROUGH */
1183 
1184     default:
1185       break;
1186 
1187     case CPP_WSTRING:
1188     case CPP_STRING16:
1189     case CPP_STRING32:
1190     case CPP_UTF8STRING:
1191       if (type != tok->type)
1192 	{
1193 	  if (type == CPP_STRING)
1194 	    type = tok->type;
1195 	  else
1196 	    error ("unsupported non-standard concatenation of string literals");
1197 	}
1198       /* FALLTHROUGH */
1199 
1200     case CPP_STRING:
1201       if (!concats)
1202 	{
1203 	  gcc_obstack_init (&str_ob);
1204 	  gcc_obstack_init (&loc_ob);
1205 	  obstack_grow (&str_ob, &str, sizeof (cpp_string));
1206 	  obstack_grow (&loc_ob, &init_loc, sizeof (location_t));
1207 	}
1208 
1209       concats++;
1210       obstack_grow (&str_ob, &tok->val.str, sizeof (cpp_string));
1211       obstack_grow (&loc_ob, &tok->src_loc, sizeof (location_t));
1212 
1213       if (objc_string)
1214 	objc_at_sign_was_seen = false;
1215       goto retry;
1216     }
1217 
1218   /* It is an error if we saw a '@' with no following string.  */
1219   if (objc_at_sign_was_seen)
1220     error ("stray %<@%> in program");
1221 
1222   /* We have read one more token than we want.  */
1223   _cpp_backup_tokens (parse_in, 1);
1224   if (concats)
1225     {
1226       strs = XOBFINISH (&str_ob, cpp_string *);
1227       locs = XOBFINISH (&loc_ob, location_t *);
1228     }
1229 
1230   if (concats && !objc_string && !in_system_header_at (input_location))
1231     warning (OPT_Wtraditional,
1232 	     "traditional C rejects string constant concatenation");
1233 
1234   if ((translate
1235        ? cpp_interpret_string : cpp_interpret_string_notranslate)
1236       (parse_in, strs, concats + 1, &istr, type))
1237     {
1238       value = build_string (istr.len, (const char *) istr.text);
1239       free (CONST_CAST (unsigned char *, istr.text));
1240       if (concats)
1241 	{
1242 	  gcc_assert (locs);
1243 	  gcc_assert (g_string_concat_db);
1244 	  g_string_concat_db->record_string_concatenation (concats + 1, locs);
1245 	}
1246     }
1247   else
1248     {
1249       /* Callers cannot generally handle error_mark_node in this context,
1250 	 so return the empty string instead.  cpp_interpret_string has
1251 	 issued an error.  */
1252       switch (type)
1253 	{
1254 	default:
1255 	case CPP_STRING:
1256 	case CPP_UTF8STRING:
1257 	  value = build_string (1, "");
1258 	  break;
1259 	case CPP_STRING16:
1260 	  value = build_string (TYPE_PRECISION (char16_type_node)
1261 				/ TYPE_PRECISION (char_type_node),
1262 				"\0");  /* char16_t is 16 bits */
1263 	  break;
1264 	case CPP_STRING32:
1265 	  value = build_string (TYPE_PRECISION (char32_type_node)
1266 				/ TYPE_PRECISION (char_type_node),
1267 				"\0\0\0");  /* char32_t is 32 bits */
1268 	  break;
1269 	case CPP_WSTRING:
1270 	  value = build_string (TYPE_PRECISION (wchar_type_node)
1271 				/ TYPE_PRECISION (char_type_node),
1272 				"\0\0\0");  /* widest supported wchar_t
1273 					       is 32 bits */
1274 	  break;
1275         }
1276     }
1277 
1278   switch (type)
1279     {
1280     default:
1281     case CPP_STRING:
1282     case CPP_UTF8STRING:
1283       TREE_TYPE (value) = char_array_type_node;
1284       break;
1285     case CPP_STRING16:
1286       TREE_TYPE (value) = char16_array_type_node;
1287       break;
1288     case CPP_STRING32:
1289       TREE_TYPE (value) = char32_array_type_node;
1290       break;
1291     case CPP_WSTRING:
1292       TREE_TYPE (value) = wchar_array_type_node;
1293     }
1294   *valp = fix_string_type (value);
1295 
1296   if (concats)
1297     {
1298       obstack_free (&str_ob, 0);
1299       obstack_free (&loc_ob, 0);
1300     }
1301 
1302   return objc_string ? CPP_OBJC_STRING : type;
1303 }
1304 
1305 /* Converts a (possibly wide) character constant token into a tree.  */
1306 static tree
1307 lex_charconst (const cpp_token *token)
1308 {
1309   cppchar_t result;
1310   tree type, value;
1311   unsigned int chars_seen;
1312   int unsignedp = 0;
1313 
1314   result = cpp_interpret_charconst (parse_in, token,
1315 				    &chars_seen, &unsignedp);
1316 
1317   if (token->type == CPP_WCHAR)
1318     type = wchar_type_node;
1319   else if (token->type == CPP_CHAR32)
1320     type = char32_type_node;
1321   else if (token->type == CPP_CHAR16)
1322     type = char16_type_node;
1323   else if (token->type == CPP_UTF8CHAR)
1324     type = char_type_node;
1325   /* In C, a character constant has type 'int'.
1326      In C++ 'char', but multi-char charconsts have type 'int'.  */
1327   else if (!c_dialect_cxx () || chars_seen > 1)
1328     type = integer_type_node;
1329   else
1330     type = char_type_node;
1331 
1332   /* Cast to cppchar_signed_t to get correct sign-extension of RESULT
1333      before possibly widening to HOST_WIDE_INT for build_int_cst.  */
1334   if (unsignedp || (cppchar_signed_t) result >= 0)
1335     value = build_int_cst (type, result);
1336   else
1337     value = build_int_cst (type, (cppchar_signed_t) result);
1338 
1339   return value;
1340 }
1341 
1342 /* Helper function for c_parser_peek_conflict_marker
1343    and cp_lexer_peek_conflict_marker.
1344    Given a possible conflict marker token of kind TOK1_KIND
1345    consisting of a pair of characters, get the token kind for the
1346    standalone final character.  */
1347 
1348 enum cpp_ttype
1349 conflict_marker_get_final_tok_kind (enum cpp_ttype tok1_kind)
1350 {
1351   switch (tok1_kind)
1352     {
1353     default: gcc_unreachable ();
1354     case CPP_LSHIFT:
1355       /* "<<" and '<' */
1356       return CPP_LESS;
1357 
1358     case CPP_EQ_EQ:
1359       /* "==" and '=' */
1360       return CPP_EQ;
1361 
1362     case CPP_RSHIFT:
1363       /* ">>" and '>' */
1364       return CPP_GREATER;
1365     }
1366 }
1367