c++: ICE with VEC_INIT_EXPR and defarg [PR106925]
[official-gcc.git] / libcpp / init.cc
blobd3b4f00994b5877ef5c230e4a7cf7b2b3cd15936
1 /* CPP Library.
2 Copyright (C) 1986-2022 Free Software Foundation, Inc.
3 Contributed by Per Bothner, 1994-95.
4 Based on CCCP program by Paul Rubin, June 1986
5 Adapted to ANSI C, Richard Stallman, Jan 1987
7 This program is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 3, or (at your option) any
10 later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 #include "config.h"
22 #include "system.h"
23 #include "cpplib.h"
24 #include "internal.h"
25 #include "mkdeps.h"
26 #include "localedir.h"
27 #include "filenames.h"
29 #ifndef ENABLE_CANONICAL_SYSTEM_HEADERS
30 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
31 #define ENABLE_CANONICAL_SYSTEM_HEADERS 1
32 #else
33 #define ENABLE_CANONICAL_SYSTEM_HEADERS 0
34 #endif
35 #endif
37 static void init_library (void);
38 static void mark_named_operators (cpp_reader *, int);
39 static bool read_original_filename (cpp_reader *);
40 static void read_original_directory (cpp_reader *);
41 static void post_options (cpp_reader *);
43 /* If we have designated initializers (GCC >2.7) these tables can be
44 initialized, constant data. Otherwise, they have to be filled in at
45 runtime. */
46 #if HAVE_DESIGNATED_INITIALIZERS
48 #define init_trigraph_map() /* Nothing. */
49 #define TRIGRAPH_MAP \
50 __extension__ const uchar _cpp_trigraph_map[UCHAR_MAX + 1] = {
52 #define END };
53 #define s(p, v) [p] = v,
55 #else
57 #define TRIGRAPH_MAP uchar _cpp_trigraph_map[UCHAR_MAX + 1] = { 0 }; \
58 static void init_trigraph_map (void) { \
59 unsigned char *x = _cpp_trigraph_map;
61 #define END }
62 #define s(p, v) x[p] = v;
64 #endif
66 TRIGRAPH_MAP
67 s('=', '#') s(')', ']') s('!', '|')
68 s('(', '[') s('\'', '^') s('>', '}')
69 s('/', '\\') s('<', '{') s('-', '~')
70 END
72 #undef s
73 #undef END
74 #undef TRIGRAPH_MAP
76 /* A set of booleans indicating what CPP features each source language
77 requires. */
78 struct lang_flags
80 char c99;
81 char cplusplus;
82 char extended_numbers;
83 char extended_identifiers;
84 char c11_identifiers;
85 char std;
86 char digraphs;
87 char uliterals;
88 char rliterals;
89 char user_literals;
90 char binary_constants;
91 char digit_separators;
92 char trigraphs;
93 char utf8_char_literals;
94 char va_opt;
95 char scope;
96 char dfp_constants;
97 char size_t_literals;
98 char elifdef;
99 char warning_directive;
100 char delimited_escape_seqs;
101 char true_false;
104 static const struct lang_flags lang_defaults[] =
105 { /* c99 c++ xnum xid c11 std digr ulit rlit udlit bincst digsep trig u8chlit vaopt scope dfp szlit elifdef warndir delim trufal */
106 /* GNUC89 */ { 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
107 /* GNUC99 */ { 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
108 /* GNUC11 */ { 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
109 /* GNUC17 */ { 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
110 /* GNUC2X */ { 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1 },
111 /* STDC89 */ { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
112 /* STDC94 */ { 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
113 /* STDC99 */ { 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
114 /* STDC11 */ { 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
115 /* STDC17 */ { 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
116 /* STDC2X */ { 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1 },
117 /* GNUCXX */ { 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1 },
118 /* CXX98 */ { 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1 },
119 /* GNUCXX11 */ { 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1 },
120 /* CXX11 */ { 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1 },
121 /* GNUCXX14 */ { 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1 },
122 /* CXX14 */ { 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1 },
123 /* GNUCXX17 */ { 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1 },
124 /* CXX17 */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1 },
125 /* GNUCXX20 */ { 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1 },
126 /* CXX20 */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1 },
127 /* GNUCXX23 */ { 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1 },
128 /* CXX23 */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1 },
129 /* ASM */ { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
132 /* Sets internal flags correctly for a given language. */
133 void
134 cpp_set_lang (cpp_reader *pfile, enum c_lang lang)
136 const struct lang_flags *l = &lang_defaults[(int) lang];
138 CPP_OPTION (pfile, lang) = lang;
140 CPP_OPTION (pfile, c99) = l->c99;
141 CPP_OPTION (pfile, cplusplus) = l->cplusplus;
142 CPP_OPTION (pfile, extended_numbers) = l->extended_numbers;
143 CPP_OPTION (pfile, extended_identifiers) = l->extended_identifiers;
144 CPP_OPTION (pfile, c11_identifiers) = l->c11_identifiers;
145 CPP_OPTION (pfile, std) = l->std;
146 CPP_OPTION (pfile, digraphs) = l->digraphs;
147 CPP_OPTION (pfile, uliterals) = l->uliterals;
148 CPP_OPTION (pfile, rliterals) = l->rliterals;
149 CPP_OPTION (pfile, user_literals) = l->user_literals;
150 CPP_OPTION (pfile, binary_constants) = l->binary_constants;
151 CPP_OPTION (pfile, digit_separators) = l->digit_separators;
152 CPP_OPTION (pfile, trigraphs) = l->trigraphs;
153 CPP_OPTION (pfile, utf8_char_literals) = l->utf8_char_literals;
154 CPP_OPTION (pfile, va_opt) = l->va_opt;
155 CPP_OPTION (pfile, scope) = l->scope;
156 CPP_OPTION (pfile, dfp_constants) = l->dfp_constants;
157 CPP_OPTION (pfile, size_t_literals) = l->size_t_literals;
158 CPP_OPTION (pfile, elifdef) = l->elifdef;
159 CPP_OPTION (pfile, warning_directive) = l->warning_directive;
160 CPP_OPTION (pfile, delimited_escape_seqs) = l->delimited_escape_seqs;
161 CPP_OPTION (pfile, true_false) = l->true_false;
164 /* Initialize library global state. */
165 static void
166 init_library (void)
168 static int initialized = 0;
170 if (! initialized)
172 initialized = 1;
174 _cpp_init_lexer ();
176 /* Set up the trigraph map. This doesn't need to do anything if
177 we were compiled with a compiler that supports C99 designated
178 initializers. */
179 init_trigraph_map ();
181 #ifdef ENABLE_NLS
182 (void) bindtextdomain (PACKAGE, LOCALEDIR);
183 #endif
187 /* Initialize a cpp_reader structure. */
188 cpp_reader *
189 cpp_create_reader (enum c_lang lang, cpp_hash_table *table,
190 class line_maps *line_table)
192 cpp_reader *pfile;
194 /* Initialize this instance of the library if it hasn't been already. */
195 init_library ();
197 pfile = XCNEW (cpp_reader);
198 memset (&pfile->base_context, 0, sizeof (pfile->base_context));
200 cpp_set_lang (pfile, lang);
201 CPP_OPTION (pfile, warn_multichar) = 1;
202 CPP_OPTION (pfile, discard_comments) = 1;
203 CPP_OPTION (pfile, discard_comments_in_macro_exp) = 1;
204 CPP_OPTION (pfile, max_include_depth) = 200;
205 CPP_OPTION (pfile, operator_names) = 1;
206 CPP_OPTION (pfile, warn_trigraphs) = 2;
207 CPP_OPTION (pfile, warn_endif_labels) = 1;
208 CPP_OPTION (pfile, cpp_warn_c90_c99_compat) = -1;
209 CPP_OPTION (pfile, cpp_warn_c11_c2x_compat) = -1;
210 CPP_OPTION (pfile, cpp_warn_cxx11_compat) = 0;
211 CPP_OPTION (pfile, cpp_warn_cxx20_compat) = 0;
212 CPP_OPTION (pfile, cpp_warn_deprecated) = 1;
213 CPP_OPTION (pfile, cpp_warn_long_long) = 0;
214 CPP_OPTION (pfile, dollars_in_ident) = 1;
215 CPP_OPTION (pfile, warn_dollars) = 1;
216 CPP_OPTION (pfile, warn_variadic_macros) = 1;
217 CPP_OPTION (pfile, warn_builtin_macro_redefined) = 1;
218 CPP_OPTION (pfile, cpp_warn_implicit_fallthrough) = 0;
219 /* By default, track locations of tokens resulting from macro
220 expansion. The '2' means, track the locations with the highest
221 accuracy. Read the comments for struct
222 cpp_options::track_macro_expansion to learn about the other
223 values. */
224 CPP_OPTION (pfile, track_macro_expansion) = 2;
225 CPP_OPTION (pfile, warn_normalize) = normalized_C;
226 CPP_OPTION (pfile, warn_literal_suffix) = 1;
227 CPP_OPTION (pfile, canonical_system_headers)
228 = ENABLE_CANONICAL_SYSTEM_HEADERS;
229 CPP_OPTION (pfile, ext_numeric_literals) = 1;
230 CPP_OPTION (pfile, warn_date_time) = 0;
231 CPP_OPTION (pfile, cpp_warn_bidirectional) = bidirectional_unpaired;
232 CPP_OPTION (pfile, cpp_warn_invalid_utf8) = 0;
233 CPP_OPTION (pfile, cpp_warn_unicode) = 1;
234 CPP_OPTION (pfile, cpp_input_charset_explicit) = 0;
236 /* Default CPP arithmetic to something sensible for the host for the
237 benefit of dumb users like fix-header. */
238 CPP_OPTION (pfile, precision) = CHAR_BIT * sizeof (long);
239 CPP_OPTION (pfile, char_precision) = CHAR_BIT;
240 CPP_OPTION (pfile, wchar_precision) = CHAR_BIT * sizeof (int);
241 CPP_OPTION (pfile, int_precision) = CHAR_BIT * sizeof (int);
242 CPP_OPTION (pfile, unsigned_char) = 0;
243 CPP_OPTION (pfile, unsigned_wchar) = 1;
244 CPP_OPTION (pfile, unsigned_utf8char) = 1;
245 CPP_OPTION (pfile, bytes_big_endian) = 1; /* does not matter */
247 /* Default to no charset conversion. */
248 CPP_OPTION (pfile, narrow_charset) = _cpp_default_encoding ();
249 CPP_OPTION (pfile, wide_charset) = 0;
251 /* Default the input character set to UTF-8. */
252 CPP_OPTION (pfile, input_charset) = _cpp_default_encoding ();
254 /* A fake empty "directory" used as the starting point for files
255 looked up without a search path. Name cannot be '/' because we
256 don't want to prepend anything at all to filenames using it. All
257 other entries are correct zero-initialized. */
258 pfile->no_search_path.name = (char *) "";
260 /* Initialize the line map. */
261 pfile->line_table = line_table;
263 /* Initialize lexer state. */
264 pfile->state.save_comments = ! CPP_OPTION (pfile, discard_comments);
266 /* Set up static tokens. */
267 pfile->avoid_paste.type = CPP_PADDING;
268 pfile->avoid_paste.val.source = NULL;
269 pfile->avoid_paste.src_loc = 0;
270 pfile->endarg.type = CPP_EOF;
271 pfile->endarg.flags = 0;
272 pfile->endarg.src_loc = 0;
274 /* Create a token buffer for the lexer. */
275 _cpp_init_tokenrun (&pfile->base_run, 250);
276 pfile->cur_run = &pfile->base_run;
277 pfile->cur_token = pfile->base_run.base;
279 /* Initialize the base context. */
280 pfile->context = &pfile->base_context;
281 pfile->base_context.c.macro = 0;
282 pfile->base_context.prev = pfile->base_context.next = 0;
284 /* Aligned and unaligned storage. */
285 pfile->a_buff = _cpp_get_buff (pfile, 0);
286 pfile->u_buff = _cpp_get_buff (pfile, 0);
288 /* Initialize table for push_macro/pop_macro. */
289 pfile->pushed_macros = 0;
291 /* Do not force token locations by default. */
292 pfile->forced_token_location = 0;
294 /* Note the timestamp is unset. */
295 pfile->time_stamp = time_t (-1);
296 pfile->time_stamp_kind = 0;
298 /* The expression parser stack. */
299 _cpp_expand_op_stack (pfile);
301 /* Initialize the buffer obstack. */
302 obstack_specify_allocation (&pfile->buffer_ob, 0, 0, xmalloc, free);
304 _cpp_init_files (pfile);
306 _cpp_init_hashtable (pfile, table);
308 return pfile;
311 /* Set the line_table entry in PFILE. This is called after reading a
312 PCH file, as the old line_table will be incorrect. */
313 void
314 cpp_set_line_map (cpp_reader *pfile, class line_maps *line_table)
316 pfile->line_table = line_table;
319 /* Free resources used by PFILE. Accessing PFILE after this function
320 returns leads to undefined behavior. Returns the error count. */
321 void
322 cpp_destroy (cpp_reader *pfile)
324 cpp_context *context, *contextn;
325 struct def_pragma_macro *pmacro;
326 tokenrun *run, *runn;
327 int i;
329 free (pfile->op_stack);
331 while (CPP_BUFFER (pfile) != NULL)
332 _cpp_pop_buffer (pfile);
334 free (pfile->out.base);
336 if (pfile->macro_buffer)
338 free (pfile->macro_buffer);
339 pfile->macro_buffer = NULL;
340 pfile->macro_buffer_len = 0;
343 if (pfile->deps)
344 deps_free (pfile->deps);
345 obstack_free (&pfile->buffer_ob, 0);
347 _cpp_destroy_hashtable (pfile);
348 _cpp_cleanup_files (pfile);
349 _cpp_destroy_iconv (pfile);
351 _cpp_free_buff (pfile->a_buff);
352 _cpp_free_buff (pfile->u_buff);
353 _cpp_free_buff (pfile->free_buffs);
355 for (run = &pfile->base_run; run; run = runn)
357 runn = run->next;
358 free (run->base);
359 if (run != &pfile->base_run)
360 free (run);
363 for (context = pfile->base_context.next; context; context = contextn)
365 contextn = context->next;
366 free (context);
369 if (pfile->comments.entries)
371 for (i = 0; i < pfile->comments.count; i++)
372 free (pfile->comments.entries[i].comment);
374 free (pfile->comments.entries);
376 if (pfile->pushed_macros)
380 pmacro = pfile->pushed_macros;
381 pfile->pushed_macros = pmacro->next;
382 free (pmacro->name);
383 free (pmacro);
385 while (pfile->pushed_macros);
388 free (pfile);
391 /* This structure defines one built-in identifier. A node will be
392 entered in the hash table under the name NAME, with value VALUE.
394 There are two tables of these. builtin_array holds all the
395 "builtin" macros: these are handled by builtin_macro() in
396 macro.cc. Builtin is somewhat of a misnomer -- the property of
397 interest is that these macros require special code to compute their
398 expansions. The value is a "cpp_builtin_type" enumerator.
400 operator_array holds the C++ named operators. These are keywords
401 which act as aliases for punctuators. In C++, they cannot be
402 altered through #define, and #if recognizes them as operators. In
403 C, these are not entered into the hash table at all (but see
404 <iso646.h>). The value is a token-type enumerator. */
405 struct builtin_macro
407 const uchar *const name;
408 const unsigned short len;
409 const unsigned short value;
410 const bool always_warn_if_redefined;
413 #define B(n, t, f) { DSC(n), t, f }
414 static const struct builtin_macro builtin_array[] =
416 B("__TIMESTAMP__", BT_TIMESTAMP, false),
417 B("__TIME__", BT_TIME, false),
418 B("__DATE__", BT_DATE, false),
419 B("__FILE__", BT_FILE, false),
420 B("__FILE_NAME__", BT_FILE_NAME, false),
421 B("__BASE_FILE__", BT_BASE_FILE, false),
422 B("__LINE__", BT_SPECLINE, true),
423 B("__INCLUDE_LEVEL__", BT_INCLUDE_LEVEL, true),
424 B("__COUNTER__", BT_COUNTER, true),
425 /* Make sure to update the list of built-in
426 function-like macros in traditional.cc:
427 fun_like_macro() when adding more following */
428 B("__has_attribute", BT_HAS_ATTRIBUTE, true),
429 B("__has_c_attribute", BT_HAS_STD_ATTRIBUTE, true),
430 B("__has_cpp_attribute", BT_HAS_ATTRIBUTE, true),
431 B("__has_builtin", BT_HAS_BUILTIN, true),
432 B("__has_include", BT_HAS_INCLUDE, true),
433 B("__has_include_next",BT_HAS_INCLUDE_NEXT, true),
434 /* Keep builtins not used for -traditional-cpp at the end, and
435 update init_builtins() if any more are added. */
436 B("_Pragma", BT_PRAGMA, true),
437 B("__STDC__", BT_STDC, true),
439 #undef B
441 struct builtin_operator
443 const uchar *const name;
444 const unsigned short len;
445 const unsigned short value;
448 #define B(n, t) { DSC(n), t }
449 static const struct builtin_operator operator_array[] =
451 B("and", CPP_AND_AND),
452 B("and_eq", CPP_AND_EQ),
453 B("bitand", CPP_AND),
454 B("bitor", CPP_OR),
455 B("compl", CPP_COMPL),
456 B("not", CPP_NOT),
457 B("not_eq", CPP_NOT_EQ),
458 B("or", CPP_OR_OR),
459 B("or_eq", CPP_OR_EQ),
460 B("xor", CPP_XOR),
461 B("xor_eq", CPP_XOR_EQ)
463 #undef B
465 /* Mark the C++ named operators in the hash table. */
466 static void
467 mark_named_operators (cpp_reader *pfile, int flags)
469 const struct builtin_operator *b;
471 for (b = operator_array;
472 b < (operator_array + ARRAY_SIZE (operator_array));
473 b++)
475 cpp_hashnode *hp = cpp_lookup (pfile, b->name, b->len);
476 hp->flags |= flags;
477 hp->is_directive = 0;
478 hp->directive_index = b->value;
482 /* Helper function of cpp_type2name. Return the string associated with
483 named operator TYPE. */
484 const char *
485 cpp_named_operator2name (enum cpp_ttype type)
487 const struct builtin_operator *b;
489 for (b = operator_array;
490 b < (operator_array + ARRAY_SIZE (operator_array));
491 b++)
493 if (type == b->value)
494 return (const char *) b->name;
497 return NULL;
500 void
501 cpp_init_special_builtins (cpp_reader *pfile)
503 const struct builtin_macro *b;
504 size_t n = ARRAY_SIZE (builtin_array);
506 if (CPP_OPTION (pfile, traditional))
507 n -= 2;
508 else if (! CPP_OPTION (pfile, stdc_0_in_system_headers)
509 || CPP_OPTION (pfile, std))
510 n--;
512 for (b = builtin_array; b < builtin_array + n; b++)
514 if ((b->value == BT_HAS_ATTRIBUTE
515 || b->value == BT_HAS_STD_ATTRIBUTE
516 || b->value == BT_HAS_BUILTIN)
517 && (CPP_OPTION (pfile, lang) == CLK_ASM
518 || pfile->cb.has_attribute == NULL))
519 continue;
520 cpp_hashnode *hp = cpp_lookup (pfile, b->name, b->len);
521 hp->type = NT_BUILTIN_MACRO;
522 if (b->always_warn_if_redefined)
523 hp->flags |= NODE_WARN;
524 hp->value.builtin = (enum cpp_builtin_type) b->value;
528 /* Restore macro C to builtin macro definition. */
530 void
531 _cpp_restore_special_builtin (cpp_reader *pfile, struct def_pragma_macro *c)
533 size_t len = strlen (c->name);
535 for (const struct builtin_macro *b = builtin_array;
536 b < builtin_array + ARRAY_SIZE (builtin_array); b++)
537 if (b->len == len && memcmp (c->name, b->name, len + 1) == 0)
539 cpp_hashnode *hp = cpp_lookup (pfile, b->name, b->len);
540 hp->type = NT_BUILTIN_MACRO;
541 if (b->always_warn_if_redefined)
542 hp->flags |= NODE_WARN;
543 hp->value.builtin = (enum cpp_builtin_type) b->value;
547 /* Read the builtins table above and enter them, and language-specific
548 macros, into the hash table. HOSTED is true if this is a hosted
549 environment. */
550 void
551 cpp_init_builtins (cpp_reader *pfile, int hosted)
553 cpp_init_special_builtins (pfile);
555 if (!CPP_OPTION (pfile, traditional)
556 && (! CPP_OPTION (pfile, stdc_0_in_system_headers)
557 || CPP_OPTION (pfile, std)))
558 _cpp_define_builtin (pfile, "__STDC__ 1");
560 if (CPP_OPTION (pfile, cplusplus))
562 /* C++23 is not yet a standard. For now, use an invalid
563 * year/month, 202100L, which is larger than 202002L. */
564 if (CPP_OPTION (pfile, lang) == CLK_CXX23
565 || CPP_OPTION (pfile, lang) == CLK_GNUCXX23)
566 _cpp_define_builtin (pfile, "__cplusplus 202100L");
567 else if (CPP_OPTION (pfile, lang) == CLK_CXX20
568 || CPP_OPTION (pfile, lang) == CLK_GNUCXX20)
569 _cpp_define_builtin (pfile, "__cplusplus 202002L");
570 else if (CPP_OPTION (pfile, lang) == CLK_CXX17
571 || CPP_OPTION (pfile, lang) == CLK_GNUCXX17)
572 _cpp_define_builtin (pfile, "__cplusplus 201703L");
573 else if (CPP_OPTION (pfile, lang) == CLK_CXX14
574 || CPP_OPTION (pfile, lang) == CLK_GNUCXX14)
575 _cpp_define_builtin (pfile, "__cplusplus 201402L");
576 else if (CPP_OPTION (pfile, lang) == CLK_CXX11
577 || CPP_OPTION (pfile, lang) == CLK_GNUCXX11)
578 _cpp_define_builtin (pfile, "__cplusplus 201103L");
579 else
580 _cpp_define_builtin (pfile, "__cplusplus 199711L");
582 else if (CPP_OPTION (pfile, lang) == CLK_ASM)
583 _cpp_define_builtin (pfile, "__ASSEMBLER__ 1");
584 else if (CPP_OPTION (pfile, lang) == CLK_STDC94)
585 _cpp_define_builtin (pfile, "__STDC_VERSION__ 199409L");
586 else if (CPP_OPTION (pfile, lang) == CLK_STDC2X
587 || CPP_OPTION (pfile, lang) == CLK_GNUC2X)
588 _cpp_define_builtin (pfile, "__STDC_VERSION__ 202000L");
589 else if (CPP_OPTION (pfile, lang) == CLK_STDC17
590 || CPP_OPTION (pfile, lang) == CLK_GNUC17)
591 _cpp_define_builtin (pfile, "__STDC_VERSION__ 201710L");
592 else if (CPP_OPTION (pfile, lang) == CLK_STDC11
593 || CPP_OPTION (pfile, lang) == CLK_GNUC11)
594 _cpp_define_builtin (pfile, "__STDC_VERSION__ 201112L");
595 else if (CPP_OPTION (pfile, c99))
596 _cpp_define_builtin (pfile, "__STDC_VERSION__ 199901L");
598 if (CPP_OPTION (pfile, uliterals)
599 && !(CPP_OPTION (pfile, cplusplus)
600 && (CPP_OPTION (pfile, lang) == CLK_GNUCXX
601 || CPP_OPTION (pfile, lang) == CLK_CXX98)))
603 _cpp_define_builtin (pfile, "__STDC_UTF_16__ 1");
604 _cpp_define_builtin (pfile, "__STDC_UTF_32__ 1");
607 if (hosted)
608 _cpp_define_builtin (pfile, "__STDC_HOSTED__ 1");
609 else
610 _cpp_define_builtin (pfile, "__STDC_HOSTED__ 0");
612 if (CPP_OPTION (pfile, objc))
613 _cpp_define_builtin (pfile, "__OBJC__ 1");
616 /* Sanity-checks are dependent on command-line options, so it is
617 called as a subroutine of cpp_read_main_file. */
618 #if CHECKING_P
619 static void sanity_checks (cpp_reader *);
620 static void sanity_checks (cpp_reader *pfile)
622 cppchar_t test = 0;
623 size_t max_precision = 2 * CHAR_BIT * sizeof (cpp_num_part);
625 /* Sanity checks for assumptions about CPP arithmetic and target
626 type precisions made by cpplib. */
627 test--;
628 if (test < 1)
629 cpp_error (pfile, CPP_DL_ICE, "cppchar_t must be an unsigned type");
631 if (CPP_OPTION (pfile, precision) > max_precision)
632 cpp_error (pfile, CPP_DL_ICE,
633 "preprocessor arithmetic has maximum precision of %lu bits;"
634 " target requires %lu bits",
635 (unsigned long) max_precision,
636 (unsigned long) CPP_OPTION (pfile, precision));
638 if (CPP_OPTION (pfile, precision) < CPP_OPTION (pfile, int_precision))
639 cpp_error (pfile, CPP_DL_ICE,
640 "CPP arithmetic must be at least as precise as a target int");
642 if (CPP_OPTION (pfile, char_precision) < 8)
643 cpp_error (pfile, CPP_DL_ICE, "target char is less than 8 bits wide");
645 if (CPP_OPTION (pfile, wchar_precision) < CPP_OPTION (pfile, char_precision))
646 cpp_error (pfile, CPP_DL_ICE,
647 "target wchar_t is narrower than target char");
649 if (CPP_OPTION (pfile, int_precision) < CPP_OPTION (pfile, char_precision))
650 cpp_error (pfile, CPP_DL_ICE,
651 "target int is narrower than target char");
653 /* This is assumed in eval_token() and could be fixed if necessary. */
654 if (sizeof (cppchar_t) > sizeof (cpp_num_part))
655 cpp_error (pfile, CPP_DL_ICE,
656 "CPP half-integer narrower than CPP character");
658 if (CPP_OPTION (pfile, wchar_precision) > BITS_PER_CPPCHAR_T)
659 cpp_error (pfile, CPP_DL_ICE,
660 "CPP on this host cannot handle wide character constants over"
661 " %lu bits, but the target requires %lu bits",
662 (unsigned long) BITS_PER_CPPCHAR_T,
663 (unsigned long) CPP_OPTION (pfile, wchar_precision));
665 #else
666 # define sanity_checks(PFILE)
667 #endif
669 /* This is called after options have been parsed, and partially
670 processed. */
671 void
672 cpp_post_options (cpp_reader *pfile)
674 int flags;
676 sanity_checks (pfile);
678 post_options (pfile);
680 /* Mark named operators before handling command line macros. */
681 flags = 0;
682 if (CPP_OPTION (pfile, cplusplus) && CPP_OPTION (pfile, operator_names))
683 flags |= NODE_OPERATOR;
684 if (CPP_OPTION (pfile, warn_cxx_operator_names))
685 flags |= NODE_DIAGNOSTIC | NODE_WARN_OPERATOR;
686 if (flags != 0)
687 mark_named_operators (pfile, flags);
690 /* Setup for processing input from the file named FNAME, or stdin if
691 it is the empty string. Return the original filename on success
692 (e.g. foo.i->foo.c), or NULL on failure. INJECTING is true if
693 there may be injected headers before line 1 of the main file. */
694 const char *
695 cpp_read_main_file (cpp_reader *pfile, const char *fname, bool injecting)
697 if (mkdeps *deps = cpp_get_deps (pfile))
698 /* Set the default target (if there is none already). */
699 deps_add_default_target (deps, fname);
701 pfile->main_file
702 = _cpp_find_file (pfile, fname,
703 CPP_OPTION (pfile, preprocessed) ? &pfile->no_search_path
704 : CPP_OPTION (pfile, main_search) == CMS_user
705 ? pfile->quote_include
706 : CPP_OPTION (pfile, main_search) == CMS_system
707 ? pfile->bracket_include : &pfile->no_search_path,
708 /*angle=*/0, _cpp_FFK_NORMAL, 0);
710 if (_cpp_find_failed (pfile->main_file))
711 return NULL;
713 _cpp_stack_file (pfile, pfile->main_file,
714 injecting || CPP_OPTION (pfile, preprocessed)
715 ? IT_PRE_MAIN : IT_MAIN, 0);
717 /* For foo.i, read the original filename foo.c now, for the benefit
718 of the front ends. */
719 if (CPP_OPTION (pfile, preprocessed))
720 if (!read_original_filename (pfile))
722 /* We're on line 1 after all. */
723 auto *last = linemap_check_ordinary
724 (LINEMAPS_LAST_MAP (pfile->line_table, false));
725 last->to_line = 1;
726 /* Inform of as-if a file change. */
727 _cpp_do_file_change (pfile, LC_RENAME_VERBATIM, LINEMAP_FILE (last),
728 LINEMAP_LINE (last), LINEMAP_SYSP (last));
731 auto *map = LINEMAPS_LAST_ORDINARY_MAP (pfile->line_table);
732 pfile->main_loc = MAP_START_LOCATION (map);
734 return ORDINARY_MAP_FILE_NAME (map);
737 location_t
738 cpp_main_loc (const cpp_reader *pfile)
740 return pfile->main_loc;
743 /* For preprocessed files, if the very first characters are
744 '#<SPACE>[01]<SPACE>', then handle a line directive so we know the
745 original file name. This will generate file_change callbacks,
746 which the front ends must handle appropriately given their state of
747 initialization. We peek directly into the character buffer, so
748 that we're not confused by otherwise-skipped white space &
749 comments. We can be very picky, because this should have been
750 machine-generated text (by us, no less). This way we do not
751 interfere with the module directive state machine. */
753 static bool
754 read_original_filename (cpp_reader *pfile)
756 auto *buf = pfile->buffer->next_line;
758 if (pfile->buffer->rlimit - buf > 4
759 && buf[0] == '#'
760 && buf[1] == ' '
761 // Also permit '1', as that's what used to be here
762 && (buf[2] == '0' || buf[2] == '1')
763 && buf[3] == ' ')
765 const cpp_token *token = _cpp_lex_direct (pfile);
766 gcc_checking_assert (token->type == CPP_HASH);
767 if (_cpp_handle_directive (pfile, token->flags & PREV_WHITE))
769 read_original_directory (pfile);
771 auto *penult = &linemap_check_ordinary
772 (LINEMAPS_LAST_MAP (pfile->line_table, false))[-1];
773 if (penult[1].reason == LC_RENAME_VERBATIM)
775 /* Expunge any evidence of the original linemap. */
776 pfile->line_table->highest_location
777 = pfile->line_table->highest_line
778 = penult[0].start_location;
780 penult[1].start_location = penult[0].start_location;
781 penult[1].reason = penult[0].reason;
782 penult[0] = penult[1];
783 pfile->line_table->info_ordinary.used--;
784 pfile->line_table->info_ordinary.cache = 0;
787 return true;
791 return false;
794 /* For preprocessed files, if the tokens following the first filename
795 line is of the form # <line> "/path/name//", handle the
796 directive so we know the original current directory.
798 As with the first line peeking, we can do this without lexing by
799 being picky. */
800 static void
801 read_original_directory (cpp_reader *pfile)
803 auto *buf = pfile->buffer->next_line;
805 if (pfile->buffer->rlimit - buf > 4
806 && buf[0] == '#'
807 && buf[1] == ' '
808 // Also permit '1', as that's what used to be here
809 && (buf[2] == '0' || buf[2] == '1')
810 && buf[3] == ' ')
812 const cpp_token *hash = _cpp_lex_direct (pfile);
813 gcc_checking_assert (hash->type == CPP_HASH);
814 pfile->state.in_directive = 1;
815 const cpp_token *number = _cpp_lex_direct (pfile);
816 gcc_checking_assert (number->type == CPP_NUMBER);
817 const cpp_token *string = _cpp_lex_direct (pfile);
818 pfile->state.in_directive = 0;
820 const unsigned char *text = nullptr;
821 size_t len = 0;
822 if (string->type == CPP_STRING)
824 /* The string value includes the quotes. */
825 text = string->val.str.text;
826 len = string->val.str.len;
828 if (len < 5
829 || !IS_DIR_SEPARATOR (text[len - 2])
830 || !IS_DIR_SEPARATOR (text[len - 3]))
832 /* That didn't work out, back out. */
833 _cpp_backup_tokens (pfile, 3);
834 return;
837 if (pfile->cb.dir_change)
839 /* Smash the string directly, it's dead at this point */
840 char *smashy = (char *)text;
841 smashy[len - 3] = 0;
843 pfile->cb.dir_change (pfile, smashy + 1);
846 /* We should be at EOL. */
850 /* This is called at the end of preprocessing. It pops the last
851 buffer and writes dependency output.
853 Maybe it should also reset state, such that you could call
854 cpp_start_read with a new filename to restart processing. */
855 void
856 cpp_finish (cpp_reader *pfile, FILE *deps_stream)
858 /* Warn about unused macros before popping the final buffer. */
859 if (CPP_OPTION (pfile, warn_unused_macros))
860 cpp_forall_identifiers (pfile, _cpp_warn_if_unused_macro, NULL);
862 /* lex.cc leaves the final buffer on the stack. This it so that
863 it returns an unending stream of CPP_EOFs to the client. If we
864 popped the buffer, we'd dereference a NULL buffer pointer and
865 segfault. It's nice to allow the client to do worry-free excess
866 cpp_get_token calls. */
867 while (pfile->buffer)
868 _cpp_pop_buffer (pfile);
870 if (deps_stream)
871 deps_write (pfile, deps_stream, 72);
873 /* Report on headers that could use multiple include guards. */
874 if (CPP_OPTION (pfile, print_include_names))
875 _cpp_report_missing_guards (pfile);
878 static void
879 post_options (cpp_reader *pfile)
881 /* -Wtraditional is not useful in C++ mode. */
882 if (CPP_OPTION (pfile, cplusplus))
883 CPP_OPTION (pfile, cpp_warn_traditional) = 0;
885 /* Permanently disable macro expansion if we are rescanning
886 preprocessed text. Read preprocesed source in ISO mode. */
887 if (CPP_OPTION (pfile, preprocessed))
889 if (!CPP_OPTION (pfile, directives_only))
890 pfile->state.prevent_expansion = 1;
891 CPP_OPTION (pfile, traditional) = 0;
894 if (CPP_OPTION (pfile, warn_trigraphs) == 2)
895 CPP_OPTION (pfile, warn_trigraphs) = !CPP_OPTION (pfile, trigraphs);
897 if (CPP_OPTION (pfile, traditional))
899 CPP_OPTION (pfile, trigraphs) = 0;
900 CPP_OPTION (pfile, warn_trigraphs) = 0;
903 if (CPP_OPTION (pfile, module_directives))
905 /* These unspellable tokens have a leading space. */
906 const char *const inits[spec_nodes::M_HWM]
907 = {"export ", "module ", "import ", "__import"};
909 for (int ix = 0; ix != spec_nodes::M_HWM; ix++)
911 cpp_hashnode *node = cpp_lookup (pfile, UC (inits[ix]),
912 strlen (inits[ix]));
914 /* Token we pass to the compiler. */
915 pfile->spec_nodes.n_modules[ix][1] = node;
917 if (ix != spec_nodes::M__IMPORT)
918 /* Token we recognize when lexing, drop the trailing ' '. */
919 node = cpp_lookup (pfile, NODE_NAME (node), NODE_LEN (node) - 1);
921 node->flags |= NODE_MODULE;
922 pfile->spec_nodes.n_modules[ix][0] = node;