]> git.ipfire.org Git - thirdparty/gcc.git/blame - libcpp/init.cc
i386: Fix ICE with -fsplit-stack -mcmodel=large [PR112686]
[thirdparty/gcc.git] / libcpp / init.cc
CommitLineData
5538ada6 1/* CPP Library.
83ffe9cd 2 Copyright (C) 1986-2023 Free Software Foundation, Inc.
5538ada6
ZW
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
6
7This program is free software; you can redistribute it and/or modify it
8under the terms of the GNU General Public License as published by the
748086b7 9Free Software Foundation; either version 3, or (at your option) any
5538ada6
ZW
10later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
748086b7
JJ
18along with this program; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
5538ada6 20
5538ada6
ZW
21#include "config.h"
22#include "system.h"
6de1e2a9 23#include "cpplib.h"
4f4e53dd 24#include "internal.h"
49e6c08e 25#include "mkdeps.h"
018a4785 26#include "localedir.h"
4489800d 27#include "filenames.h"
88ae23e7 28
5dc99c46 29#ifndef ENABLE_CANONICAL_SYSTEM_HEADERS
eac3e079
JY
30#ifdef HAVE_DOS_BASED_FILE_SYSTEM
31#define ENABLE_CANONICAL_SYSTEM_HEADERS 1
32#else
5dc99c46
SB
33#define ENABLE_CANONICAL_SYSTEM_HEADERS 0
34#endif
eac3e079 35#endif
5dc99c46 36
6cf87ca4 37static void init_library (void);
3d8b2a98 38static void mark_named_operators (cpp_reader *, int);
d1c566d7 39static bool read_original_filename (cpp_reader *);
b20d9f0c 40static void read_original_directory (cpp_reader *);
6cf87ca4 41static void post_options (cpp_reader *);
6de1e2a9 42
61d0346d
NB
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
12cf91fe 45 runtime. */
61d0346d 46#if HAVE_DESIGNATED_INITIALIZERS
a9ae4483 47
4a58aab6 48#define init_trigraph_map() /* Nothing. */
61d0346d 49#define TRIGRAPH_MAP \
562a5c27 50__extension__ const uchar _cpp_trigraph_map[UCHAR_MAX + 1] = {
61d0346d 51
a9ae4483 52#define END };
455d2586 53#define s(p, v) [p] = v,
61d0346d 54
a9ae4483 55#else
61d0346d 56
562a5c27 57#define TRIGRAPH_MAP uchar _cpp_trigraph_map[UCHAR_MAX + 1] = { 0 }; \
6cf87ca4 58 static void init_trigraph_map (void) { \
61d0346d
NB
59 unsigned char *x = _cpp_trigraph_map;
60
ae79697b 61#define END }
455d2586 62#define s(p, v) x[p] = v;
61d0346d 63
a9ae4483 64#endif
6de1e2a9 65
61d0346d
NB
66TRIGRAPH_MAP
67 s('=', '#') s(')', ']') s('!', '|')
68 s('(', '[') s('\'', '^') s('>', '}')
69 s('/', '\\') s('<', '{') s('-', '~')
70END
71
a9ae4483 72#undef s
455d2586 73#undef END
61d0346d 74#undef TRIGRAPH_MAP
6de1e2a9 75
5d8ebbd8
NB
76/* A set of booleans indicating what CPP features each source language
77 requires. */
a01eb545
ZW
78struct lang_flags
79{
80 char c99;
a01eb545
ZW
81 char cplusplus;
82 char extended_numbers;
af15a2fe 83 char extended_identifiers;
d3f4ff8b 84 char c11_identifiers;
36d20fa4 85 char xid_identifiers;
58551c23 86 char std;
a01eb545 87 char digraphs;
b6baa67d 88 char uliterals;
a48e3dd1 89 char rliterals;
3ce4f9e4 90 char user_literals;
01187df0 91 char binary_constants;
7057e645 92 char digit_separators;
e4276ba5 93 char trigraphs;
fe95b036 94 char utf8_char_literals;
fb771b9d 95 char va_opt;
93313b94 96 char scope;
175a85b2 97 char dfp_constants;
1f69e63c 98 char size_t_literals;
71d38ec8 99 char elifdef;
d7c30001 100 char warning_directive;
e9dd050e 101 char delimited_escape_seqs;
0a91bdaf 102 char true_false;
a01eb545
ZW
103};
104
a01eb545 105static const struct lang_flags lang_defaults[] =
36d20fa4
JM
106{ /* c99 c++ xnum xid c11 xidid std digr ulit rlit udlit bincst digsep trig u8chlit vaopt scope dfp szlit elifdef warndir delim trufal */
107 /* GNUC89 */ { 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
108 /* GNUC99 */ { 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
109 /* GNUC11 */ { 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
110 /* GNUC17 */ { 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
094a609c 111 /* GNUC23 */ { 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1 },
36d20fa4
JM
112 /* STDC89 */ { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
113 /* STDC94 */ { 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
114 /* STDC99 */ { 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
115 /* STDC11 */ { 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
116 /* STDC17 */ { 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
094a609c 117 /* STDC23 */ { 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1 },
36d20fa4
JM
118 /* GNUCXX */ { 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1 },
119 /* CXX98 */ { 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1 },
120 /* GNUCXX11 */ { 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1 },
121 /* CXX11 */ { 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1 },
122 /* GNUCXX14 */ { 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1 },
123 /* CXX14 */ { 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1 },
124 /* GNUCXX17 */ { 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1 },
125 /* CXX17 */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1 },
126 /* GNUCXX20 */ { 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1 },
127 /* CXX20 */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1 },
128 /* GNUCXX23 */ { 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1 },
129 /* CXX23 */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1 },
5388a43f
MP
130 /* GNUCXX26 */ { 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1 },
131 /* CXX26 */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1 },
36d20fa4 132 /* ASM */ { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
a01eb545
ZW
133};
134
5d8ebbd8 135/* Sets internal flags correctly for a given language. */
f749a36b 136void
6cf87ca4 137cpp_set_lang (cpp_reader *pfile, enum c_lang lang)
dd07b884 138{
a01eb545 139 const struct lang_flags *l = &lang_defaults[(int) lang];
df383483 140
bdb05a7b 141 CPP_OPTION (pfile, lang) = lang;
dd07b884 142
af15a2fe
JM
143 CPP_OPTION (pfile, c99) = l->c99;
144 CPP_OPTION (pfile, cplusplus) = l->cplusplus;
145 CPP_OPTION (pfile, extended_numbers) = l->extended_numbers;
146 CPP_OPTION (pfile, extended_identifiers) = l->extended_identifiers;
d3f4ff8b 147 CPP_OPTION (pfile, c11_identifiers) = l->c11_identifiers;
36d20fa4 148 CPP_OPTION (pfile, xid_identifiers) = l->xid_identifiers;
af15a2fe 149 CPP_OPTION (pfile, std) = l->std;
af15a2fe 150 CPP_OPTION (pfile, digraphs) = l->digraphs;
b6baa67d 151 CPP_OPTION (pfile, uliterals) = l->uliterals;
a48e3dd1 152 CPP_OPTION (pfile, rliterals) = l->rliterals;
3ce4f9e4 153 CPP_OPTION (pfile, user_literals) = l->user_literals;
01187df0 154 CPP_OPTION (pfile, binary_constants) = l->binary_constants;
7057e645 155 CPP_OPTION (pfile, digit_separators) = l->digit_separators;
e4276ba5 156 CPP_OPTION (pfile, trigraphs) = l->trigraphs;
fe95b036 157 CPP_OPTION (pfile, utf8_char_literals) = l->utf8_char_literals;
fb771b9d 158 CPP_OPTION (pfile, va_opt) = l->va_opt;
93313b94 159 CPP_OPTION (pfile, scope) = l->scope;
175a85b2 160 CPP_OPTION (pfile, dfp_constants) = l->dfp_constants;
1f69e63c 161 CPP_OPTION (pfile, size_t_literals) = l->size_t_literals;
71d38ec8 162 CPP_OPTION (pfile, elifdef) = l->elifdef;
d7c30001 163 CPP_OPTION (pfile, warning_directive) = l->warning_directive;
e9dd050e 164 CPP_OPTION (pfile, delimited_escape_seqs) = l->delimited_escape_seqs;
0a91bdaf 165 CPP_OPTION (pfile, true_false) = l->true_false;
dd07b884
NB
166}
167
c1bad961 168/* Initialize library global state. */
cf44ea52 169static void
6cf87ca4 170init_library (void)
cf44ea52 171{
7ca3d2b1
NB
172 static int initialized = 0;
173
174 if (! initialized)
175 {
176 initialized = 1;
177
b0c084b7
JJ
178 _cpp_init_lexer ();
179
7ca3d2b1
NB
180 /* Set up the trigraph map. This doesn't need to do anything if
181 we were compiled with a compiler that supports C99 designated
182 initializers. */
183 init_trigraph_map ();
4f4e53dd
PB
184
185#ifdef ENABLE_NLS
85eac2a0 186 (void) bindtextdomain (PACKAGE, LOCALEDIR);
4f4e53dd 187#endif
7ca3d2b1 188 }
cf44ea52
NB
189}
190
ec5c56db 191/* Initialize a cpp_reader structure. */
cf44ea52 192cpp_reader *
0823efed 193cpp_create_reader (enum c_lang lang, cpp_hash_table *table,
cb05acdc 194 class line_maps *line_table, cpp_hash_table *extra_table)
6de1e2a9 195{
7ca3d2b1 196 cpp_reader *pfile;
93c80368 197
4912a07c 198 /* Initialize this instance of the library if it hasn't been already. */
674c3b40 199 init_library ();
7ca3d2b1 200
c3f829c1 201 pfile = XCNEW (cpp_reader);
92582b75 202 memset (&pfile->base_context, 0, sizeof (pfile->base_context));
93c80368 203
f749a36b 204 cpp_set_lang (pfile, lang);
a5a49440 205 CPP_OPTION (pfile, warn_multichar) = 1;
ae79697b 206 CPP_OPTION (pfile, discard_comments) = 1;
477cdac7 207 CPP_OPTION (pfile, discard_comments_in_macro_exp) = 1;
1c6ffbab 208 CPP_OPTION (pfile, max_include_depth) = 200;
be768055 209 CPP_OPTION (pfile, operator_names) = 1;
a8eb6044 210 CPP_OPTION (pfile, warn_trigraphs) = 2;
909de5da 211 CPP_OPTION (pfile, warn_endif_labels) = 1;
2b71f4a4 212 CPP_OPTION (pfile, cpp_warn_c90_c99_compat) = -1;
094a609c 213 CPP_OPTION (pfile, cpp_warn_c11_c23_compat) = -1;
fe191308 214 CPP_OPTION (pfile, cpp_warn_cxx11_compat) = 0;
60468d6c 215 CPP_OPTION (pfile, cpp_warn_cxx20_compat) = 0;
e3339d0f
JM
216 CPP_OPTION (pfile, cpp_warn_deprecated) = 1;
217 CPP_OPTION (pfile, cpp_warn_long_long) = 0;
b1822ccc 218 CPP_OPTION (pfile, dollars_in_ident) = 1;
78b8811a 219 CPP_OPTION (pfile, warn_dollars) = 1;
e5b79219 220 CPP_OPTION (pfile, warn_variadic_macros) = 1;
c047ce93 221 CPP_OPTION (pfile, warn_builtin_macro_redefined) = 1;
70f6d5e1 222 CPP_OPTION (pfile, cpp_warn_implicit_fallthrough) = 0;
51fce2d3
DS
223 /* By default, track locations of tokens resulting from macro
224 expansion. The '2' means, track the locations with the highest
225 accuracy. Read the comments for struct
226 cpp_options::track_macro_expansion to learn about the other
227 values. */
228 CPP_OPTION (pfile, track_macro_expansion) = 2;
50668cf6 229 CPP_OPTION (pfile, warn_normalize) = normalized_C;
7f5f5f98 230 CPP_OPTION (pfile, warn_literal_suffix) = 1;
5dc99c46
SB
231 CPP_OPTION (pfile, canonical_system_headers)
232 = ENABLE_CANONICAL_SYSTEM_HEADERS;
a4a0016d 233 CPP_OPTION (pfile, ext_numeric_literals) = 1;
e8ff5196 234 CPP_OPTION (pfile, warn_date_time) = 0;
51c50026 235 CPP_OPTION (pfile, cpp_warn_bidirectional) = bidirectional_unpaired;
0b8c57ed 236 CPP_OPTION (pfile, cpp_warn_invalid_utf8) = 0;
572f5e1b 237 CPP_OPTION (pfile, cpp_warn_unicode) = 1;
0b8c57ed 238 CPP_OPTION (pfile, cpp_input_charset_explicit) = 0;
ae79697b 239
2443d4e1
NB
240 /* Default CPP arithmetic to something sensible for the host for the
241 benefit of dumb users like fix-header. */
c9220e3a 242 CPP_OPTION (pfile, precision) = CHAR_BIT * sizeof (long);
2443d4e1
NB
243 CPP_OPTION (pfile, char_precision) = CHAR_BIT;
244 CPP_OPTION (pfile, wchar_precision) = CHAR_BIT * sizeof (int);
245 CPP_OPTION (pfile, int_precision) = CHAR_BIT * sizeof (int);
2a1dc0d8 246 CPP_OPTION (pfile, unsigned_char) = 0;
44a147ad 247 CPP_OPTION (pfile, unsigned_wchar) = 1;
053876cd 248 CPP_OPTION (pfile, unsigned_utf8char) = 1;
e6cc3a24
ZW
249 CPP_OPTION (pfile, bytes_big_endian) = 1; /* does not matter */
250
251 /* Default to no charset conversion. */
16dd5cfe 252 CPP_OPTION (pfile, narrow_charset) = _cpp_default_encoding ();
e6cc3a24 253 CPP_OPTION (pfile, wide_charset) = 0;
4268e8bb 254
16dd5cfe
EC
255 /* Default the input character set to UTF-8. */
256 CPP_OPTION (pfile, input_charset) = _cpp_default_encoding ();
cf551fba 257
8f9b4009
NB
258 /* A fake empty "directory" used as the starting point for files
259 looked up without a search path. Name cannot be '/' because we
260 don't want to prepend anything at all to filenames using it. All
261 other entries are correct zero-initialized. */
262 pfile->no_search_path.name = (char *) "";
263
500bee0a 264 /* Initialize the line map. */
50f59cd7 265 pfile->line_table = line_table;
d82fc108 266
4a58aab6 267 /* Initialize lexer state. */
93c80368
NB
268 pfile->state.save_comments = ! CPP_OPTION (pfile, discard_comments);
269
4ed5bcfb 270 /* Set up static tokens. */
4ed5bcfb
NB
271 pfile->avoid_paste.type = CPP_PADDING;
272 pfile->avoid_paste.val.source = NULL;
5abe05b4
NS
273 pfile->avoid_paste.src_loc = 0;
274 pfile->endarg.type = CPP_EOF;
275 pfile->endarg.flags = 0;
276 pfile->endarg.src_loc = 0;
93c80368 277
5fddcffc
NB
278 /* Create a token buffer for the lexer. */
279 _cpp_init_tokenrun (&pfile->base_run, 250);
280 pfile->cur_run = &pfile->base_run;
281 pfile->cur_token = pfile->base_run.base;
5fddcffc 282
4912a07c 283 /* Initialize the base context. */
93c80368 284 pfile->context = &pfile->base_context;
92582b75 285 pfile->base_context.c.macro = 0;
93c80368
NB
286 pfile->base_context.prev = pfile->base_context.next = 0;
287
8c3b2693
NB
288 /* Aligned and unaligned storage. */
289 pfile->a_buff = _cpp_get_buff (pfile, 0);
ece54d54 290 pfile->u_buff = _cpp_get_buff (pfile, 0);
93c80368 291
17e7cb85
KT
292 /* Initialize table for push_macro/pop_macro. */
293 pfile->pushed_macros = 0;
294
e3dfef44 295 /* Do not force token locations by default. */
f3f6029d 296 pfile->forced_token_location = 0;
e3dfef44 297
4b5f564a
NS
298 /* Note the timestamp is unset. */
299 pfile->time_stamp = time_t (-1);
300 pfile->time_stamp_kind = 0;
15c98b2e 301
87ed109f
NB
302 /* The expression parser stack. */
303 _cpp_expand_op_stack (pfile);
304
4912a07c 305 /* Initialize the buffer obstack. */
19a9ba64 306 obstack_specify_allocation (&pfile->buffer_ob, 0, 0, xmalloc, free);
2a967f3d 307
8f9b4009 308 _cpp_init_files (pfile);
cf44ea52 309
cb05acdc 310 _cpp_init_hashtable (pfile, table, extra_table);
b4e46cea 311
cf44ea52 312 return pfile;
f2d5f0cc
ZW
313}
314
5ffeb913
TT
315/* Set the line_table entry in PFILE. This is called after reading a
316 PCH file, as the old line_table will be incorrect. */
317void
99b1c316 318cpp_set_line_map (cpp_reader *pfile, class line_maps *line_table)
5ffeb913
TT
319{
320 pfile->line_table = line_table;
321}
322
400023a3 323/* Free resources used by PFILE. Accessing PFILE after this function
8d9afc4e 324 returns leads to undefined behavior. Returns the error count. */
76c3e73e 325void
6cf87ca4 326cpp_destroy (cpp_reader *pfile)
6de1e2a9 327{
93c80368 328 cpp_context *context, *contextn;
17e7cb85 329 struct def_pragma_macro *pmacro;
50410426 330 tokenrun *run, *runn;
631d0d36 331 int i;
709e9e50 332
87ed109f 333 free (pfile->op_stack);
af0d16cd 334
38b24ee2 335 while (CPP_BUFFER (pfile) != NULL)
ef6e958a 336 _cpp_pop_buffer (pfile);
6de1e2a9 337
04695783 338 free (pfile->out.base);
004cb263 339
93c80368 340 if (pfile->macro_buffer)
4b49c365 341 {
fad205ff 342 free (pfile->macro_buffer);
4b49c365
AO
343 pfile->macro_buffer = NULL;
344 pfile->macro_buffer_len = 0;
345 }
93c80368 346
f4ff5a69
NB
347 if (pfile->deps)
348 deps_free (pfile->deps);
2a967f3d 349 obstack_free (&pfile->buffer_ob, 0);
49e6c08e 350
2a967f3d 351 _cpp_destroy_hashtable (pfile);
8f9b4009 352 _cpp_cleanup_files (pfile);
e6cc3a24 353 _cpp_destroy_iconv (pfile);
709e9e50 354
8c3b2693 355 _cpp_free_buff (pfile->a_buff);
ece54d54 356 _cpp_free_buff (pfile->u_buff);
b8af0ca5 357 _cpp_free_buff (pfile->free_buffs);
93c80368 358
50410426
NB
359 for (run = &pfile->base_run; run; run = runn)
360 {
361 runn = run->next;
362 free (run->base);
363 if (run != &pfile->base_run)
364 free (run);
365 }
366
93c80368
NB
367 for (context = pfile->base_context.next; context; context = contextn)
368 {
369 contextn = context->next;
370 free (context);
371 }
400023a3 372
631d0d36
MG
373 if (pfile->comments.entries)
374 {
375 for (i = 0; i < pfile->comments.count; i++)
376 free (pfile->comments.entries[i].comment);
377
378 free (pfile->comments.entries);
379 }
17e7cb85
KT
380 if (pfile->pushed_macros)
381 {
382 do
383 {
384 pmacro = pfile->pushed_macros;
385 pfile->pushed_macros = pmacro->next;
386 free (pmacro->name);
387 free (pmacro);
388 }
389 while (pfile->pushed_macros);
390 }
631d0d36 391
400023a3 392 free (pfile);
6de1e2a9
ZW
393}
394
93c80368 395/* This structure defines one built-in identifier. A node will be
f24a153a
ZW
396 entered in the hash table under the name NAME, with value VALUE.
397
398 There are two tables of these. builtin_array holds all the
399 "builtin" macros: these are handled by builtin_macro() in
e53b6e56 400 macro.cc. Builtin is somewhat of a misnomer -- the property of
f24a153a 401 interest is that these macros require special code to compute their
128465e6 402 expansions. The value is a "cpp_builtin_type" enumerator.
f24a153a
ZW
403
404 operator_array holds the C++ named operators. These are keywords
405 which act as aliases for punctuators. In C++, they cannot be
406 altered through #define, and #if recognizes them as operators. In
407 C, these are not entered into the hash table at all (but see
408 <iso646.h>). The value is a token-type enumerator. */
c047ce93 409struct builtin_macro
a9ae4483 410{
c047ce93
SB
411 const uchar *const name;
412 const unsigned short len;
413 const unsigned short value;
414 const bool always_warn_if_redefined;
a9ae4483 415};
93c80368 416
c047ce93
SB
417#define B(n, t, f) { DSC(n), t, f }
418static const struct builtin_macro builtin_array[] =
6de1e2a9 419{
c047ce93
SB
420 B("__TIMESTAMP__", BT_TIMESTAMP, false),
421 B("__TIME__", BT_TIME, false),
422 B("__DATE__", BT_DATE, false),
423 B("__FILE__", BT_FILE, false),
1a9b3f04 424 B("__FILE_NAME__", BT_FILE_NAME, false),
c047ce93 425 B("__BASE_FILE__", BT_BASE_FILE, false),
33b6b791 426 B("__LINE__", BT_SPECLINE, true),
c047ce93
SB
427 B("__INCLUDE_LEVEL__", BT_INCLUDE_LEVEL, true),
428 B("__COUNTER__", BT_COUNTER, true),
f6fe3bbf 429 /* Make sure to update the list of built-in
e53b6e56 430 function-like macros in traditional.cc:
f6fe3bbf 431 fun_like_macro() when adding more following */
1f8d3e84 432 B("__has_attribute", BT_HAS_ATTRIBUTE, true),
1d00f8c8 433 B("__has_c_attribute", BT_HAS_STD_ATTRIBUTE, true),
1f8d3e84 434 B("__has_cpp_attribute", BT_HAS_ATTRIBUTE, true),
ad1539d5 435 B("__has_builtin", BT_HAS_BUILTIN, true),
3d056cbf
NS
436 B("__has_include", BT_HAS_INCLUDE, true),
437 B("__has_include_next",BT_HAS_INCLUDE_NEXT, true),
278c4662
NB
438 /* Keep builtins not used for -traditional-cpp at the end, and
439 update init_builtins() if any more are added. */
c047ce93
SB
440 B("_Pragma", BT_PRAGMA, true),
441 B("__STDC__", BT_STDC, true),
442};
443#undef B
444
445struct builtin_operator
446{
447 const uchar *const name;
448 const unsigned short len;
449 const unsigned short value;
f24a153a 450};
92936ecf 451
c047ce93
SB
452#define B(n, t) { DSC(n), t }
453static const struct builtin_operator operator_array[] =
f24a153a
ZW
454{
455 B("and", CPP_AND_AND),
456 B("and_eq", CPP_AND_EQ),
457 B("bitand", CPP_AND),
458 B("bitor", CPP_OR),
459 B("compl", CPP_COMPL),
460 B("not", CPP_NOT),
461 B("not_eq", CPP_NOT_EQ),
462 B("or", CPP_OR_OR),
463 B("or_eq", CPP_OR_EQ),
464 B("xor", CPP_XOR),
465 B("xor_eq", CPP_XOR_EQ)
a9ae4483 466};
12cf91fe 467#undef B
a9ae4483 468
17645b15
NB
469/* Mark the C++ named operators in the hash table. */
470static void
3d8b2a98 471mark_named_operators (cpp_reader *pfile, int flags)
17645b15 472{
c047ce93 473 const struct builtin_operator *b;
17645b15
NB
474
475 for (b = operator_array;
476 b < (operator_array + ARRAY_SIZE (operator_array));
477 b++)
478 {
479 cpp_hashnode *hp = cpp_lookup (pfile, b->name, b->len);
3d8b2a98 480 hp->flags |= flags;
4977bab6
ZW
481 hp->is_directive = 0;
482 hp->directive_index = b->value;
17645b15
NB
483 }
484}
485
cfc93532
MLI
486/* Helper function of cpp_type2name. Return the string associated with
487 named operator TYPE. */
488const char *
489cpp_named_operator2name (enum cpp_ttype type)
490{
491 const struct builtin_operator *b;
492
493 for (b = operator_array;
494 b < (operator_array + ARRAY_SIZE (operator_array));
495 b++)
496 {
497 if (type == b->value)
498 return (const char *) b->name;
499 }
500
501 return NULL;
502}
503
c1bad961 504void
ccfc4c91 505cpp_init_special_builtins (cpp_reader *pfile)
a9ae4483 506{
c047ce93 507 const struct builtin_macro *b;
278c4662 508 size_t n = ARRAY_SIZE (builtin_array);
771c4df3 509
278c4662
NB
510 if (CPP_OPTION (pfile, traditional))
511 n -= 2;
83900997
JJ
512 else if (! CPP_OPTION (pfile, stdc_0_in_system_headers)
513 || CPP_OPTION (pfile, std))
ccfc4c91 514 n--;
278c4662 515
83900997 516 for (b = builtin_array; b < builtin_array + n; b++)
6de1e2a9 517 {
ad1539d5 518 if ((b->value == BT_HAS_ATTRIBUTE
1d00f8c8 519 || b->value == BT_HAS_STD_ATTRIBUTE
ad1539d5 520 || b->value == BT_HAS_BUILTIN)
1f8d3e84
JJ
521 && (CPP_OPTION (pfile, lang) == CLK_ASM
522 || pfile->cb.has_attribute == NULL))
523 continue;
f24a153a 524 cpp_hashnode *hp = cpp_lookup (pfile, b->name, b->len);
a570d97f 525 hp->type = NT_BUILTIN_MACRO;
b753b37b 526 if (b->always_warn_if_redefined)
c047ce93 527 hp->flags |= NODE_WARN;
7e5487a2 528 hp->value.builtin = (enum cpp_builtin_type) b->value;
6de1e2a9 529 }
ccfc4c91
OW
530}
531
aa23e73b
JJ
532/* Restore macro C to builtin macro definition. */
533
534void
535_cpp_restore_special_builtin (cpp_reader *pfile, struct def_pragma_macro *c)
536{
537 size_t len = strlen (c->name);
538
539 for (const struct builtin_macro *b = builtin_array;
540 b < builtin_array + ARRAY_SIZE (builtin_array); b++)
541 if (b->len == len && memcmp (c->name, b->name, len + 1) == 0)
542 {
543 cpp_hashnode *hp = cpp_lookup (pfile, b->name, b->len);
544 hp->type = NT_BUILTIN_MACRO;
545 if (b->always_warn_if_redefined)
546 hp->flags |= NODE_WARN;
547 hp->value.builtin = (enum cpp_builtin_type) b->value;
548 }
549}
550
ccfc4c91
OW
551/* Read the builtins table above and enter them, and language-specific
552 macros, into the hash table. HOSTED is true if this is a hosted
553 environment. */
554void
555cpp_init_builtins (cpp_reader *pfile, int hosted)
556{
557 cpp_init_special_builtins (pfile);
558
559 if (!CPP_OPTION (pfile, traditional)
560 && (! CPP_OPTION (pfile, stdc_0_in_system_headers)
561 || CPP_OPTION (pfile, std)))
562 _cpp_define_builtin (pfile, "__STDC__ 1");
c740cee2
NB
563
564 if (CPP_OPTION (pfile, cplusplus))
1fb80b0c 565 {
5388a43f
MP
566 /* C++26 is not yet a standard. For now, use an invalid
567 year/month, 202400L, which is larger than 202302L. */
568 if (CPP_OPTION (pfile, lang) == CLK_CXX26
569 || CPP_OPTION (pfile, lang) == CLK_GNUCXX26)
570 _cpp_define_builtin (pfile, "__cplusplus 202400L");
571 else if (CPP_OPTION (pfile, lang) == CLK_CXX23
78739c2d 572 || CPP_OPTION (pfile, lang) == CLK_GNUCXX23)
5388a43f 573 _cpp_define_builtin (pfile, "__cplusplus 202302L");
78739c2d 574 else if (CPP_OPTION (pfile, lang) == CLK_CXX20
b04445d4 575 || CPP_OPTION (pfile, lang) == CLK_GNUCXX20)
445430e1 576 _cpp_define_builtin (pfile, "__cplusplus 202002L");
026a79f7 577 else if (CPP_OPTION (pfile, lang) == CLK_CXX17
7b936140 578 || CPP_OPTION (pfile, lang) == CLK_GNUCXX17)
85e653c9 579 _cpp_define_builtin (pfile, "__cplusplus 201703L");
e4276ba5
ESR
580 else if (CPP_OPTION (pfile, lang) == CLK_CXX14
581 || CPP_OPTION (pfile, lang) == CLK_GNUCXX14)
582 _cpp_define_builtin (pfile, "__cplusplus 201402L");
61949153
PC
583 else if (CPP_OPTION (pfile, lang) == CLK_CXX11
584 || CPP_OPTION (pfile, lang) == CLK_GNUCXX11)
1fb80b0c
JM
585 _cpp_define_builtin (pfile, "__cplusplus 201103L");
586 else
587 _cpp_define_builtin (pfile, "__cplusplus 199711L");
588 }
2a1dc0d8
ZW
589 else if (CPP_OPTION (pfile, lang) == CLK_ASM)
590 _cpp_define_builtin (pfile, "__ASSEMBLER__ 1");
0f7866e7 591 else if (CPP_OPTION (pfile, lang) == CLK_STDC94)
c740cee2 592 _cpp_define_builtin (pfile, "__STDC_VERSION__ 199409L");
094a609c
JM
593 else if (CPP_OPTION (pfile, lang) == CLK_STDC23
594 || CPP_OPTION (pfile, lang) == CLK_GNUC23)
9f936c86 595 _cpp_define_builtin (pfile, "__STDC_VERSION__ 202000L");
c76dc9c3
JM
596 else if (CPP_OPTION (pfile, lang) == CLK_STDC17
597 || CPP_OPTION (pfile, lang) == CLK_GNUC17)
598 _cpp_define_builtin (pfile, "__STDC_VERSION__ 201710L");
48b0b196
JM
599 else if (CPP_OPTION (pfile, lang) == CLK_STDC11
600 || CPP_OPTION (pfile, lang) == CLK_GNUC11)
601 _cpp_define_builtin (pfile, "__STDC_VERSION__ 201112L");
c740cee2
NB
602 else if (CPP_OPTION (pfile, c99))
603 _cpp_define_builtin (pfile, "__STDC_VERSION__ 199901L");
604
a48e3dd1 605 if (CPP_OPTION (pfile, uliterals)
e4276ba5
ESR
606 && !(CPP_OPTION (pfile, cplusplus)
607 && (CPP_OPTION (pfile, lang) == CLK_GNUCXX
608 || CPP_OPTION (pfile, lang) == CLK_CXX98)))
a48e3dd1
JM
609 {
610 _cpp_define_builtin (pfile, "__STDC_UTF_16__ 1");
611 _cpp_define_builtin (pfile, "__STDC_UTF_32__ 1");
612 }
613
6e270179 614 if (hosted)
58b5b894 615 _cpp_define_builtin (pfile, "__STDC_HOSTED__ 1");
6e270179 616 else
58b5b894 617 _cpp_define_builtin (pfile, "__STDC_HOSTED__ 0");
6e270179 618
0f7866e7
ZL
619 if (CPP_OPTION (pfile, objc))
620 _cpp_define_builtin (pfile, "__OBJC__ 1");
4a58aab6
NB
621}
622
2443d4e1 623/* Sanity-checks are dependent on command-line options, so it is
174f6622 624 called as a subroutine of cpp_read_main_file. */
22d66382 625#if CHECKING_P
6cf87ca4
ZW
626static void sanity_checks (cpp_reader *);
627static void sanity_checks (cpp_reader *pfile)
2443d4e1
NB
628{
629 cppchar_t test = 0;
c9220e3a 630 size_t max_precision = 2 * CHAR_BIT * sizeof (cpp_num_part);
2443d4e1
NB
631
632 /* Sanity checks for assumptions about CPP arithmetic and target
633 type precisions made by cpplib. */
634 test--;
635 if (test < 1)
0527bc4e 636 cpp_error (pfile, CPP_DL_ICE, "cppchar_t must be an unsigned type");
2443d4e1 637
c9220e3a 638 if (CPP_OPTION (pfile, precision) > max_precision)
0527bc4e 639 cpp_error (pfile, CPP_DL_ICE,
6cf87ca4
ZW
640 "preprocessor arithmetic has maximum precision of %lu bits;"
641 " target requires %lu bits",
c9220e3a
NB
642 (unsigned long) max_precision,
643 (unsigned long) CPP_OPTION (pfile, precision));
2443d4e1
NB
644
645 if (CPP_OPTION (pfile, precision) < CPP_OPTION (pfile, int_precision))
0527bc4e 646 cpp_error (pfile, CPP_DL_ICE,
2443d4e1
NB
647 "CPP arithmetic must be at least as precise as a target int");
648
649 if (CPP_OPTION (pfile, char_precision) < 8)
0527bc4e 650 cpp_error (pfile, CPP_DL_ICE, "target char is less than 8 bits wide");
2443d4e1
NB
651
652 if (CPP_OPTION (pfile, wchar_precision) < CPP_OPTION (pfile, char_precision))
0527bc4e 653 cpp_error (pfile, CPP_DL_ICE,
2443d4e1
NB
654 "target wchar_t is narrower than target char");
655
656 if (CPP_OPTION (pfile, int_precision) < CPP_OPTION (pfile, char_precision))
0527bc4e 657 cpp_error (pfile, CPP_DL_ICE,
2443d4e1
NB
658 "target int is narrower than target char");
659
c9220e3a
NB
660 /* This is assumed in eval_token() and could be fixed if necessary. */
661 if (sizeof (cppchar_t) > sizeof (cpp_num_part))
0527bc4e
JDA
662 cpp_error (pfile, CPP_DL_ICE,
663 "CPP half-integer narrower than CPP character");
c9220e3a 664
2443d4e1 665 if (CPP_OPTION (pfile, wchar_precision) > BITS_PER_CPPCHAR_T)
0527bc4e 666 cpp_error (pfile, CPP_DL_ICE,
6cf87ca4
ZW
667 "CPP on this host cannot handle wide character constants over"
668 " %lu bits, but the target requires %lu bits",
c9220e3a
NB
669 (unsigned long) BITS_PER_CPPCHAR_T,
670 (unsigned long) CPP_OPTION (pfile, wchar_precision));
2443d4e1
NB
671}
672#else
673# define sanity_checks(PFILE)
674#endif
675
f5e99456 676/* This is called after options have been parsed, and partially
59e4e217 677 processed. */
4169c321
PB
678void
679cpp_post_options (cpp_reader *pfile)
6de1e2a9 680{
3d8b2a98
ILT
681 int flags;
682
2443d4e1
NB
683 sanity_checks (pfile);
684
f4ff5a69
NB
685 post_options (pfile);
686
c19b12cb 687 /* Mark named operators before handling command line macros. */
3d8b2a98 688 flags = 0;
c19b12cb 689 if (CPP_OPTION (pfile, cplusplus) && CPP_OPTION (pfile, operator_names))
3d8b2a98
ILT
690 flags |= NODE_OPERATOR;
691 if (CPP_OPTION (pfile, warn_cxx_operator_names))
692 flags |= NODE_DIAGNOSTIC | NODE_WARN_OPERATOR;
693 if (flags != 0)
694 mark_named_operators (pfile, flags);
4169c321 695}
c19b12cb 696
4dc299fb 697/* Setup for processing input from the file named FNAME, or stdin if
6bf2ff0d
NS
698 it is the empty string. Return the original filename on success
699 (e.g. foo.i->foo.c), or NULL on failure. INJECTING is true if
700 there may be injected headers before line 1 of the main file. */
8e9ea4d7 701const char *
6bf2ff0d 702cpp_read_main_file (cpp_reader *pfile, const char *fname, bool injecting)
4169c321 703{
918e8b10
NS
704 if (mkdeps *deps = cpp_get_deps (pfile))
705 /* Set the default target (if there is none already). */
d8909271 706 deps_add_default_target (deps, fname);
96302433 707
4dc299fb 708 pfile->main_file
9844497a
NS
709 = _cpp_find_file (pfile, fname,
710 CPP_OPTION (pfile, preprocessed) ? &pfile->no_search_path
711 : CPP_OPTION (pfile, main_search) == CMS_user
712 ? pfile->quote_include
713 : CPP_OPTION (pfile, main_search) == CMS_system
714 ? pfile->bracket_include : &pfile->no_search_path,
715 /*angle=*/0, _cpp_FFK_NORMAL, 0);
716
4dc299fb 717 if (_cpp_find_failed (pfile->main_file))
3092d0fc 718 return NULL;
f5e99456 719
6bf2ff0d 720 _cpp_stack_file (pfile, pfile->main_file,
d1c566d7
NS
721 injecting || CPP_OPTION (pfile, preprocessed)
722 ? IT_PRE_MAIN : IT_MAIN, 0);
4dc299fb
PB
723
724 /* For foo.i, read the original filename foo.c now, for the benefit
725 of the front ends. */
726 if (CPP_OPTION (pfile, preprocessed))
d1c566d7
NS
727 if (!read_original_filename (pfile))
728 {
729 /* We're on line 1 after all. */
730 auto *last = linemap_check_ordinary
731 (LINEMAPS_LAST_MAP (pfile->line_table, false));
732 last->to_line = 1;
733 /* Inform of as-if a file change. */
734 _cpp_do_file_change (pfile, LC_RENAME_VERBATIM, LINEMAP_FILE (last),
735 LINEMAP_LINE (last), LINEMAP_SYSP (last));
736 }
134051f1 737
9844497a
NS
738 auto *map = LINEMAPS_LAST_ORDINARY_MAP (pfile->line_table);
739 pfile->main_loc = MAP_START_LOCATION (map);
740
741 return ORDINARY_MAP_FILE_NAME (map);
742}
743
744location_t
745cpp_main_loc (const cpp_reader *pfile)
746{
747 return pfile->main_loc;
f5e99456
NB
748}
749
d1c566d7
NS
750/* For preprocessed files, if the very first characters are
751 '#<SPACE>[01]<SPACE>', then handle a line directive so we know the
752 original file name. This will generate file_change callbacks,
753 which the front ends must handle appropriately given their state of
754 initialization. We peek directly into the character buffer, so
755 that we're not confused by otherwise-skipped white space &
756 comments. We can be very picky, because this should have been
757 machine-generated text (by us, no less). This way we do not
758 interfere with the module directive state machine. */
759
760static bool
6cf87ca4 761read_original_filename (cpp_reader *pfile)
f5e99456 762{
d1c566d7
NS
763 auto *buf = pfile->buffer->next_line;
764
765 if (pfile->buffer->rlimit - buf > 4
766 && buf[0] == '#'
767 && buf[1] == ' '
768 // Also permit '1', as that's what used to be here
769 && (buf[2] == '0' || buf[2] == '1')
770 && buf[3] == ' ')
f5e99456 771 {
d1c566d7
NS
772 const cpp_token *token = _cpp_lex_direct (pfile);
773 gcc_checking_assert (token->type == CPP_HASH);
774 if (_cpp_handle_directive (pfile, token->flags & PREV_WHITE))
f5e99456 775 {
b20d9f0c 776 read_original_directory (pfile);
a13be187
NS
777
778 auto *penult = &linemap_check_ordinary
779 (LINEMAPS_LAST_MAP (pfile->line_table, false))[-1];
780 if (penult[1].reason == LC_RENAME_VERBATIM)
781 {
782 /* Expunge any evidence of the original linemap. */
783 pfile->line_table->highest_location
784 = pfile->line_table->highest_line
785 = penult[0].start_location;
786
787 penult[1].start_location = penult[0].start_location;
788 penult[1].reason = penult[0].reason;
789 penult[0] = penult[1];
790 pfile->line_table->info_ordinary.used--;
45bae180 791 pfile->line_table->info_ordinary.m_cache = 0;
a13be187
NS
792 }
793
d1c566d7 794 return true;
f5e99456
NB
795 }
796 }
797
d1c566d7 798 return false;
f5e99456
NB
799}
800
b20d9f0c
AO
801/* For preprocessed files, if the tokens following the first filename
802 line is of the form # <line> "/path/name//", handle the
d1c566d7
NS
803 directive so we know the original current directory.
804
805 As with the first line peeking, we can do this without lexing by
806 being picky. */
b20d9f0c
AO
807static void
808read_original_directory (cpp_reader *pfile)
809{
d1c566d7
NS
810 auto *buf = pfile->buffer->next_line;
811
812 if (pfile->buffer->rlimit - buf > 4
813 && buf[0] == '#'
814 && buf[1] == ' '
815 // Also permit '1', as that's what used to be here
816 && (buf[2] == '0' || buf[2] == '1')
817 && buf[3] == ' ')
b20d9f0c 818 {
d1c566d7
NS
819 const cpp_token *hash = _cpp_lex_direct (pfile);
820 gcc_checking_assert (hash->type == CPP_HASH);
821 pfile->state.in_directive = 1;
822 const cpp_token *number = _cpp_lex_direct (pfile);
823 gcc_checking_assert (number->type == CPP_NUMBER);
824 const cpp_token *string = _cpp_lex_direct (pfile);
825 pfile->state.in_directive = 0;
b20d9f0c 826
d1c566d7
NS
827 const unsigned char *text = nullptr;
828 size_t len = 0;
829 if (string->type == CPP_STRING)
830 {
831 /* The string value includes the quotes. */
832 text = string->val.str.text;
833 len = string->val.str.len;
834 }
835 if (len < 5
836 || !IS_DIR_SEPARATOR (text[len - 2])
837 || !IS_DIR_SEPARATOR (text[len - 3]))
838 {
839 /* That didn't work out, back out. */
840 _cpp_backup_tokens (pfile, 3);
841 return;
842 }
b20d9f0c 843
d1c566d7
NS
844 if (pfile->cb.dir_change)
845 {
846 /* Smash the string directly, it's dead at this point */
847 char *smashy = (char *)text;
848 smashy[len - 3] = 0;
849
850 pfile->cb.dir_change (pfile, smashy + 1);
851 }
b20d9f0c 852
d1c566d7 853 /* We should be at EOL. */
b20d9f0c 854 }
b20d9f0c
AO
855}
856
76c3e73e 857/* This is called at the end of preprocessing. It pops the last
148e4216 858 buffer and writes dependency output.
16dd5cfe 859
76c3e73e
NB
860 Maybe it should also reset state, such that you could call
861 cpp_start_read with a new filename to restart processing. */
148e4216 862void
024f135a 863cpp_finish (struct cpp_reader *pfile, FILE *deps_stream, FILE *fdeps_stream)
6de1e2a9 864{
a69cbaac
NB
865 /* Warn about unused macros before popping the final buffer. */
866 if (CPP_OPTION (pfile, warn_unused_macros))
867 cpp_forall_identifiers (pfile, _cpp_warn_if_unused_macro, NULL);
868
e53b6e56 869 /* lex.cc leaves the final buffer on the stack. This it so that
7364fdd8 870 it returns an unending stream of CPP_EOFs to the client. If we
a1f300c0 871 popped the buffer, we'd dereference a NULL buffer pointer and
7364fdd8
NB
872 segfault. It's nice to allow the client to do worry-free excess
873 cpp_get_token calls. */
874 while (pfile->buffer)
875 _cpp_pop_buffer (pfile);
c1212d2f 876
024f135a
BB
877 cpp_fdeps_format fdeps_format = CPP_OPTION (pfile, deps.fdeps_format);
878 if (fdeps_format == FDEPS_FMT_P1689R5 && fdeps_stream)
879 deps_write_p1689r5 (pfile->deps, fdeps_stream);
880
881 if (CPP_OPTION (pfile, deps.style) != DEPS_NONE
882 && deps_stream)
883 {
884 deps_write (pfile, deps_stream, 72);
885 }
3caee4a8 886
d4506961
ZW
887 /* Report on headers that could use multiple include guards. */
888 if (CPP_OPTION (pfile, print_include_names))
c71f835b 889 _cpp_report_missing_guards (pfile);
6de1e2a9
ZW
890}
891
f4ff5a69 892static void
6cf87ca4 893post_options (cpp_reader *pfile)
96302433
NB
894{
895 /* -Wtraditional is not useful in C++ mode. */
896 if (CPP_OPTION (pfile, cplusplus))
e3339d0f 897 CPP_OPTION (pfile, cpp_warn_traditional) = 0;
96302433 898
6d4587f7 899 /* Permanently disable macro expansion if we are rescanning
43612ffb 900 preprocessed text. Read preprocesed source in ISO mode. */
6d4587f7 901 if (CPP_OPTION (pfile, preprocessed))
43612ffb 902 {
ccfc4c91
OW
903 if (!CPP_OPTION (pfile, directives_only))
904 pfile->state.prevent_expansion = 1;
43612ffb
NB
905 CPP_OPTION (pfile, traditional) = 0;
906 }
907
a8eb6044
NB
908 if (CPP_OPTION (pfile, warn_trigraphs) == 2)
909 CPP_OPTION (pfile, warn_trigraphs) = !CPP_OPTION (pfile, trigraphs);
910
43612ffb 911 if (CPP_OPTION (pfile, traditional))
26aea073 912 {
26aea073
NB
913 CPP_OPTION (pfile, trigraphs) = 0;
914 CPP_OPTION (pfile, warn_trigraphs) = 0;
915 }
c9c3d5f2
NS
916
917 if (CPP_OPTION (pfile, module_directives))
918 {
919 /* These unspellable tokens have a leading space. */
920 const char *const inits[spec_nodes::M_HWM]
921 = {"export ", "module ", "import ", "__import"};
922
923 for (int ix = 0; ix != spec_nodes::M_HWM; ix++)
924 {
925 cpp_hashnode *node = cpp_lookup (pfile, UC (inits[ix]),
926 strlen (inits[ix]));
927
928 /* Token we pass to the compiler. */
929 pfile->spec_nodes.n_modules[ix][1] = node;
930
931 if (ix != spec_nodes::M__IMPORT)
932 /* Token we recognize when lexing, drop the trailing ' '. */
933 node = cpp_lookup (pfile, NODE_NAME (node), NODE_LEN (node) - 1);
934
935 node->flags |= NODE_MODULE;
936 pfile->spec_nodes.n_modules[ix][0] = node;
937 }
938 }
7ca3d2b1 939}