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