1/* CPP Library.
2 Copyright (C) 1986-2024 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
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
9Free Software Foundation; either version 3, or (at your option) any
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
18along with this program; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
20
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"
28
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
36
37static void init_library (void);
38static void mark_named_operators (cpp_reader *, int);
39static bool read_original_filename (cpp_reader *);
40static void read_original_directory (cpp_reader *);
41static void post_options (cpp_reader *);
42
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
47
48#define init_trigraph_map() /* Nothing. */
49#define TRIGRAPH_MAP \
50__extension__ const uchar _cpp_trigraph_map[UCHAR_MAX + 1] = {
51
52#define END };
53#define s(p, v) [p] = v,
54
55#else
56
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;
60
61#define END }
62#define s(p, v) x[p] = v;
63
64#endif
65
66TRIGRAPH_MAP
67 s('=', '#') s(')', ']') s('!', '|')
68 s('(', '[') s('\'', '^') s('>', '}')
69 s('/', '\\') s('<', '{') s('-', '~')
70END
71
72#undef s
73#undef END
74#undef TRIGRAPH_MAP
75
76/* A set of booleans indicating what CPP features each source language
77 requires. */
78struct lang_flags
79{
80 char c99;
81 char cplusplus;
82 char extended_numbers;
83 char extended_identifiers;
84 char c11_identifiers;
85 char xid_identifiers;
86 char std;
87 char digraphs;
88 char uliterals;
89 char rliterals;
90 char user_literals;
91 char binary_constants;
92 char digit_separators;
93 char trigraphs;
94 char utf8_char_literals;
95 char va_opt;
96 char scope;
97 char dfp_constants;
98 char size_t_literals;
99 char elifdef;
100 char warning_directive;
101 char delimited_escape_seqs;
102 char true_false;
103};
104
105static const struct lang_flags lang_defaults[] =
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 */ { .c99: 0, .cplusplus: 0, .extended_numbers: 1, .extended_identifiers: 0, .c11_identifiers: 0, .xid_identifiers: 0, .std: 0, .digraphs: 1, .uliterals: 0, .rliterals: 0, .user_literals: 0, .binary_constants: 0, .digit_separators: 0, .trigraphs: 0, .utf8_char_literals: 0, .va_opt: 1, .scope: 1, .dfp_constants: 0, .size_t_literals: 0, .elifdef: 0, .warning_directive: 0, .delimited_escape_seqs: 0, .true_false: 0 },
108 /* GNUC99 */ { .c99: 1, .cplusplus: 0, .extended_numbers: 1, .extended_identifiers: 1, .c11_identifiers: 0, .xid_identifiers: 0, .std: 0, .digraphs: 1, .uliterals: 1, .rliterals: 1, .user_literals: 0, .binary_constants: 0, .digit_separators: 0, .trigraphs: 0, .utf8_char_literals: 0, .va_opt: 1, .scope: 1, .dfp_constants: 0, .size_t_literals: 0, .elifdef: 0, .warning_directive: 0, .delimited_escape_seqs: 0, .true_false: 0 },
109 /* GNUC11 */ { .c99: 1, .cplusplus: 0, .extended_numbers: 1, .extended_identifiers: 1, .c11_identifiers: 1, .xid_identifiers: 0, .std: 0, .digraphs: 1, .uliterals: 1, .rliterals: 1, .user_literals: 0, .binary_constants: 0, .digit_separators: 0, .trigraphs: 0, .utf8_char_literals: 0, .va_opt: 1, .scope: 1, .dfp_constants: 0, .size_t_literals: 0, .elifdef: 0, .warning_directive: 0, .delimited_escape_seqs: 0, .true_false: 0 },
110 /* GNUC17 */ { .c99: 1, .cplusplus: 0, .extended_numbers: 1, .extended_identifiers: 1, .c11_identifiers: 1, .xid_identifiers: 0, .std: 0, .digraphs: 1, .uliterals: 1, .rliterals: 1, .user_literals: 0, .binary_constants: 0, .digit_separators: 0, .trigraphs: 0, .utf8_char_literals: 0, .va_opt: 1, .scope: 1, .dfp_constants: 0, .size_t_literals: 0, .elifdef: 0, .warning_directive: 0, .delimited_escape_seqs: 0, .true_false: 0 },
111 /* GNUC23 */ { .c99: 1, .cplusplus: 0, .extended_numbers: 1, .extended_identifiers: 1, .c11_identifiers: 1, .xid_identifiers: 1, .std: 0, .digraphs: 1, .uliterals: 1, .rliterals: 1, .user_literals: 0, .binary_constants: 1, .digit_separators: 1, .trigraphs: 0, .utf8_char_literals: 1, .va_opt: 1, .scope: 1, .dfp_constants: 1, .size_t_literals: 0, .elifdef: 1, .warning_directive: 1, .delimited_escape_seqs: 0, .true_false: 1 },
112 /* STDC89 */ { .c99: 0, .cplusplus: 0, .extended_numbers: 0, .extended_identifiers: 0, .c11_identifiers: 0, .xid_identifiers: 0, .std: 1, .digraphs: 0, .uliterals: 0, .rliterals: 0, .user_literals: 0, .binary_constants: 0, .digit_separators: 0, .trigraphs: 1, .utf8_char_literals: 0, .va_opt: 0, .scope: 0, .dfp_constants: 0, .size_t_literals: 0, .elifdef: 0, .warning_directive: 0, .delimited_escape_seqs: 0, .true_false: 0 },
113 /* STDC94 */ { .c99: 0, .cplusplus: 0, .extended_numbers: 0, .extended_identifiers: 0, .c11_identifiers: 0, .xid_identifiers: 0, .std: 1, .digraphs: 1, .uliterals: 0, .rliterals: 0, .user_literals: 0, .binary_constants: 0, .digit_separators: 0, .trigraphs: 1, .utf8_char_literals: 0, .va_opt: 0, .scope: 0, .dfp_constants: 0, .size_t_literals: 0, .elifdef: 0, .warning_directive: 0, .delimited_escape_seqs: 0, .true_false: 0 },
114 /* STDC99 */ { .c99: 1, .cplusplus: 0, .extended_numbers: 1, .extended_identifiers: 1, .c11_identifiers: 0, .xid_identifiers: 0, .std: 1, .digraphs: 1, .uliterals: 0, .rliterals: 0, .user_literals: 0, .binary_constants: 0, .digit_separators: 0, .trigraphs: 1, .utf8_char_literals: 0, .va_opt: 0, .scope: 0, .dfp_constants: 0, .size_t_literals: 0, .elifdef: 0, .warning_directive: 0, .delimited_escape_seqs: 0, .true_false: 0 },
115 /* STDC11 */ { .c99: 1, .cplusplus: 0, .extended_numbers: 1, .extended_identifiers: 1, .c11_identifiers: 1, .xid_identifiers: 0, .std: 1, .digraphs: 1, .uliterals: 1, .rliterals: 0, .user_literals: 0, .binary_constants: 0, .digit_separators: 0, .trigraphs: 1, .utf8_char_literals: 0, .va_opt: 0, .scope: 0, .dfp_constants: 0, .size_t_literals: 0, .elifdef: 0, .warning_directive: 0, .delimited_escape_seqs: 0, .true_false: 0 },
116 /* STDC17 */ { .c99: 1, .cplusplus: 0, .extended_numbers: 1, .extended_identifiers: 1, .c11_identifiers: 1, .xid_identifiers: 0, .std: 1, .digraphs: 1, .uliterals: 1, .rliterals: 0, .user_literals: 0, .binary_constants: 0, .digit_separators: 0, .trigraphs: 1, .utf8_char_literals: 0, .va_opt: 0, .scope: 0, .dfp_constants: 0, .size_t_literals: 0, .elifdef: 0, .warning_directive: 0, .delimited_escape_seqs: 0, .true_false: 0 },
117 /* STDC23 */ { .c99: 1, .cplusplus: 0, .extended_numbers: 1, .extended_identifiers: 1, .c11_identifiers: 1, .xid_identifiers: 1, .std: 1, .digraphs: 1, .uliterals: 1, .rliterals: 0, .user_literals: 0, .binary_constants: 1, .digit_separators: 1, .trigraphs: 0, .utf8_char_literals: 1, .va_opt: 1, .scope: 1, .dfp_constants: 1, .size_t_literals: 0, .elifdef: 1, .warning_directive: 1, .delimited_escape_seqs: 0, .true_false: 1 },
118 /* GNUCXX */ { .c99: 0, .cplusplus: 1, .extended_numbers: 1, .extended_identifiers: 1, .c11_identifiers: 0, .xid_identifiers: 1, .std: 0, .digraphs: 1, .uliterals: 0, .rliterals: 0, .user_literals: 0, .binary_constants: 0, .digit_separators: 0, .trigraphs: 0, .utf8_char_literals: 0, .va_opt: 1, .scope: 1, .dfp_constants: 0, .size_t_literals: 0, .elifdef: 0, .warning_directive: 0, .delimited_escape_seqs: 0, .true_false: 1 },
119 /* CXX98 */ { .c99: 0, .cplusplus: 1, .extended_numbers: 0, .extended_identifiers: 1, .c11_identifiers: 0, .xid_identifiers: 1, .std: 1, .digraphs: 1, .uliterals: 0, .rliterals: 0, .user_literals: 0, .binary_constants: 0, .digit_separators: 0, .trigraphs: 1, .utf8_char_literals: 0, .va_opt: 0, .scope: 1, .dfp_constants: 0, .size_t_literals: 0, .elifdef: 0, .warning_directive: 0, .delimited_escape_seqs: 0, .true_false: 1 },
120 /* GNUCXX11 */ { .c99: 1, .cplusplus: 1, .extended_numbers: 1, .extended_identifiers: 1, .c11_identifiers: 1, .xid_identifiers: 1, .std: 0, .digraphs: 1, .uliterals: 1, .rliterals: 1, .user_literals: 1, .binary_constants: 0, .digit_separators: 0, .trigraphs: 0, .utf8_char_literals: 0, .va_opt: 1, .scope: 1, .dfp_constants: 0, .size_t_literals: 0, .elifdef: 0, .warning_directive: 0, .delimited_escape_seqs: 0, .true_false: 1 },
121 /* CXX11 */ { .c99: 1, .cplusplus: 1, .extended_numbers: 0, .extended_identifiers: 1, .c11_identifiers: 1, .xid_identifiers: 1, .std: 1, .digraphs: 1, .uliterals: 1, .rliterals: 1, .user_literals: 1, .binary_constants: 0, .digit_separators: 0, .trigraphs: 1, .utf8_char_literals: 0, .va_opt: 0, .scope: 1, .dfp_constants: 0, .size_t_literals: 0, .elifdef: 0, .warning_directive: 0, .delimited_escape_seqs: 0, .true_false: 1 },
122 /* GNUCXX14 */ { .c99: 1, .cplusplus: 1, .extended_numbers: 1, .extended_identifiers: 1, .c11_identifiers: 1, .xid_identifiers: 1, .std: 0, .digraphs: 1, .uliterals: 1, .rliterals: 1, .user_literals: 1, .binary_constants: 1, .digit_separators: 1, .trigraphs: 0, .utf8_char_literals: 0, .va_opt: 1, .scope: 1, .dfp_constants: 0, .size_t_literals: 0, .elifdef: 0, .warning_directive: 0, .delimited_escape_seqs: 0, .true_false: 1 },
123 /* CXX14 */ { .c99: 1, .cplusplus: 1, .extended_numbers: 0, .extended_identifiers: 1, .c11_identifiers: 1, .xid_identifiers: 1, .std: 1, .digraphs: 1, .uliterals: 1, .rliterals: 1, .user_literals: 1, .binary_constants: 1, .digit_separators: 1, .trigraphs: 1, .utf8_char_literals: 0, .va_opt: 0, .scope: 1, .dfp_constants: 0, .size_t_literals: 0, .elifdef: 0, .warning_directive: 0, .delimited_escape_seqs: 0, .true_false: 1 },
124 /* GNUCXX17 */ { .c99: 1, .cplusplus: 1, .extended_numbers: 1, .extended_identifiers: 1, .c11_identifiers: 1, .xid_identifiers: 1, .std: 0, .digraphs: 1, .uliterals: 1, .rliterals: 1, .user_literals: 1, .binary_constants: 1, .digit_separators: 1, .trigraphs: 0, .utf8_char_literals: 1, .va_opt: 1, .scope: 1, .dfp_constants: 0, .size_t_literals: 0, .elifdef: 0, .warning_directive: 0, .delimited_escape_seqs: 0, .true_false: 1 },
125 /* CXX17 */ { .c99: 1, .cplusplus: 1, .extended_numbers: 1, .extended_identifiers: 1, .c11_identifiers: 1, .xid_identifiers: 1, .std: 1, .digraphs: 1, .uliterals: 1, .rliterals: 1, .user_literals: 1, .binary_constants: 1, .digit_separators: 1, .trigraphs: 0, .utf8_char_literals: 1, .va_opt: 0, .scope: 1, .dfp_constants: 0, .size_t_literals: 0, .elifdef: 0, .warning_directive: 0, .delimited_escape_seqs: 0, .true_false: 1 },
126 /* GNUCXX20 */ { .c99: 1, .cplusplus: 1, .extended_numbers: 1, .extended_identifiers: 1, .c11_identifiers: 1, .xid_identifiers: 1, .std: 0, .digraphs: 1, .uliterals: 1, .rliterals: 1, .user_literals: 1, .binary_constants: 1, .digit_separators: 1, .trigraphs: 0, .utf8_char_literals: 1, .va_opt: 1, .scope: 1, .dfp_constants: 0, .size_t_literals: 0, .elifdef: 0, .warning_directive: 0, .delimited_escape_seqs: 0, .true_false: 1 },
127 /* CXX20 */ { .c99: 1, .cplusplus: 1, .extended_numbers: 1, .extended_identifiers: 1, .c11_identifiers: 1, .xid_identifiers: 1, .std: 1, .digraphs: 1, .uliterals: 1, .rliterals: 1, .user_literals: 1, .binary_constants: 1, .digit_separators: 1, .trigraphs: 0, .utf8_char_literals: 1, .va_opt: 1, .scope: 1, .dfp_constants: 0, .size_t_literals: 0, .elifdef: 0, .warning_directive: 0, .delimited_escape_seqs: 0, .true_false: 1 },
128 /* GNUCXX23 */ { .c99: 1, .cplusplus: 1, .extended_numbers: 1, .extended_identifiers: 1, .c11_identifiers: 1, .xid_identifiers: 1, .std: 0, .digraphs: 1, .uliterals: 1, .rliterals: 1, .user_literals: 1, .binary_constants: 1, .digit_separators: 1, .trigraphs: 0, .utf8_char_literals: 1, .va_opt: 1, .scope: 1, .dfp_constants: 0, .size_t_literals: 1, .elifdef: 1, .warning_directive: 1, .delimited_escape_seqs: 1, .true_false: 1 },
129 /* CXX23 */ { .c99: 1, .cplusplus: 1, .extended_numbers: 1, .extended_identifiers: 1, .c11_identifiers: 1, .xid_identifiers: 1, .std: 1, .digraphs: 1, .uliterals: 1, .rliterals: 1, .user_literals: 1, .binary_constants: 1, .digit_separators: 1, .trigraphs: 0, .utf8_char_literals: 1, .va_opt: 1, .scope: 1, .dfp_constants: 0, .size_t_literals: 1, .elifdef: 1, .warning_directive: 1, .delimited_escape_seqs: 1, .true_false: 1 },
130 /* GNUCXX26 */ { .c99: 1, .cplusplus: 1, .extended_numbers: 1, .extended_identifiers: 1, .c11_identifiers: 1, .xid_identifiers: 1, .std: 0, .digraphs: 1, .uliterals: 1, .rliterals: 1, .user_literals: 1, .binary_constants: 1, .digit_separators: 1, .trigraphs: 0, .utf8_char_literals: 1, .va_opt: 1, .scope: 1, .dfp_constants: 0, .size_t_literals: 1, .elifdef: 1, .warning_directive: 1, .delimited_escape_seqs: 1, .true_false: 1 },
131 /* CXX26 */ { .c99: 1, .cplusplus: 1, .extended_numbers: 1, .extended_identifiers: 1, .c11_identifiers: 1, .xid_identifiers: 1, .std: 1, .digraphs: 1, .uliterals: 1, .rliterals: 1, .user_literals: 1, .binary_constants: 1, .digit_separators: 1, .trigraphs: 0, .utf8_char_literals: 1, .va_opt: 1, .scope: 1, .dfp_constants: 0, .size_t_literals: 1, .elifdef: 1, .warning_directive: 1, .delimited_escape_seqs: 1, .true_false: 1 },
132 /* ASM */ { .c99: 0, .cplusplus: 0, .extended_numbers: 1, .extended_identifiers: 0, .c11_identifiers: 0, .xid_identifiers: 0, .std: 0, .digraphs: 0, .uliterals: 0, .rliterals: 0, .user_literals: 0, .binary_constants: 0, .digit_separators: 0, .trigraphs: 0, .utf8_char_literals: 0, .va_opt: 0, .scope: 0, .dfp_constants: 0, .size_t_literals: 0, .elifdef: 0, .warning_directive: 0, .delimited_escape_seqs: 0, .true_false: 0 }
133};
134
135/* Sets internal flags correctly for a given language. */
136void
137cpp_set_lang (cpp_reader *pfile, enum c_lang lang)
138{
139 const struct lang_flags *l = &lang_defaults[(int) lang];
140
141 CPP_OPTION (pfile, lang) = lang;
142
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;
147 CPP_OPTION (pfile, c11_identifiers) = l->c11_identifiers;
148 CPP_OPTION (pfile, xid_identifiers) = l->xid_identifiers;
149 CPP_OPTION (pfile, std) = l->std;
150 CPP_OPTION (pfile, digraphs) = l->digraphs;
151 CPP_OPTION (pfile, uliterals) = l->uliterals;
152 CPP_OPTION (pfile, rliterals) = l->rliterals;
153 CPP_OPTION (pfile, user_literals) = l->user_literals;
154 CPP_OPTION (pfile, binary_constants) = l->binary_constants;
155 CPP_OPTION (pfile, digit_separators) = l->digit_separators;
156 CPP_OPTION (pfile, trigraphs) = l->trigraphs;
157 CPP_OPTION (pfile, utf8_char_literals) = l->utf8_char_literals;
158 CPP_OPTION (pfile, va_opt) = l->va_opt;
159 CPP_OPTION (pfile, scope) = l->scope;
160 CPP_OPTION (pfile, dfp_constants) = l->dfp_constants;
161 CPP_OPTION (pfile, size_t_literals) = l->size_t_literals;
162 CPP_OPTION (pfile, elifdef) = l->elifdef;
163 CPP_OPTION (pfile, warning_directive) = l->warning_directive;
164 CPP_OPTION (pfile, delimited_escape_seqs) = l->delimited_escape_seqs;
165 CPP_OPTION (pfile, true_false) = l->true_false;
166}
167
168/* Initialize library global state. */
169static void
170init_library (void)
171{
172 static int initialized = 0;
173
174 if (! initialized)
175 {
176 initialized = 1;
177
178 _cpp_init_lexer ();
179
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 ();
184
185#ifdef ENABLE_NLS
186 (void) bindtextdomain (PACKAGE, LOCALEDIR);
187#endif
188 }
189}
190
191/* Initialize a cpp_reader structure. */
192cpp_reader *
193cpp_create_reader (enum c_lang lang, cpp_hash_table *table,
194 class line_maps *line_table, cpp_hash_table *extra_table)
195{
196 cpp_reader *pfile;
197
198 /* Initialize this instance of the library if it hasn't been already. */
199 init_library ();
200
201 pfile = XCNEW (cpp_reader);
202 memset (s: &pfile->base_context, c: 0, n: sizeof (pfile->base_context));
203
204 cpp_set_lang (pfile, lang);
205 CPP_OPTION (pfile, warn_multichar) = 1;
206 CPP_OPTION (pfile, discard_comments) = 1;
207 CPP_OPTION (pfile, discard_comments_in_macro_exp) = 1;
208 CPP_OPTION (pfile, max_include_depth) = 200;
209 CPP_OPTION (pfile, operator_names) = 1;
210 CPP_OPTION (pfile, warn_trigraphs) = 2;
211 CPP_OPTION (pfile, warn_endif_labels) = 1;
212 CPP_OPTION (pfile, cpp_warn_c90_c99_compat) = -1;
213 CPP_OPTION (pfile, cpp_warn_c11_c23_compat) = -1;
214 CPP_OPTION (pfile, cpp_warn_cxx11_compat) = 0;
215 CPP_OPTION (pfile, cpp_warn_cxx20_compat) = 0;
216 CPP_OPTION (pfile, cpp_warn_deprecated) = 1;
217 CPP_OPTION (pfile, cpp_warn_long_long) = 0;
218 CPP_OPTION (pfile, dollars_in_ident) = 1;
219 CPP_OPTION (pfile, warn_dollars) = 1;
220 CPP_OPTION (pfile, warn_variadic_macros) = 1;
221 CPP_OPTION (pfile, warn_builtin_macro_redefined) = 1;
222 CPP_OPTION (pfile, cpp_warn_implicit_fallthrough) = 0;
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;
229 CPP_OPTION (pfile, warn_normalize) = normalized_C;
230 CPP_OPTION (pfile, warn_literal_suffix) = 1;
231 CPP_OPTION (pfile, canonical_system_headers)
232 = ENABLE_CANONICAL_SYSTEM_HEADERS;
233 CPP_OPTION (pfile, ext_numeric_literals) = 1;
234 CPP_OPTION (pfile, warn_date_time) = 0;
235 CPP_OPTION (pfile, cpp_warn_bidirectional) = bidirectional_unpaired;
236 CPP_OPTION (pfile, cpp_warn_invalid_utf8) = 0;
237 CPP_OPTION (pfile, cpp_warn_unicode) = 1;
238 CPP_OPTION (pfile, cpp_input_charset_explicit) = 0;
239
240 /* Default CPP arithmetic to something sensible for the host for the
241 benefit of dumb users like fix-header. */
242 CPP_OPTION (pfile, precision) = CHAR_BIT * sizeof (long);
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);
246 CPP_OPTION (pfile, unsigned_char) = 0;
247 CPP_OPTION (pfile, unsigned_wchar) = 1;
248 CPP_OPTION (pfile, unsigned_utf8char) = 1;
249 CPP_OPTION (pfile, bytes_big_endian) = 1; /* does not matter */
250
251 /* Default to no charset conversion. */
252 CPP_OPTION (pfile, narrow_charset) = _cpp_default_encoding ();
253 CPP_OPTION (pfile, wide_charset) = 0;
254
255 /* Default the input character set to UTF-8. */
256 CPP_OPTION (pfile, input_charset) = _cpp_default_encoding ();
257
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
264 /* Initialize the line map. */
265 pfile->line_table = line_table;
266
267 /* Initialize lexer state. */
268 pfile->state.save_comments = ! CPP_OPTION (pfile, discard_comments);
269
270 /* Set up static tokens. */
271 pfile->avoid_paste.type = CPP_PADDING;
272 pfile->avoid_paste.val.source = NULL;
273 pfile->avoid_paste.src_loc = 0;
274 pfile->endarg.type = CPP_EOF;
275 pfile->endarg.flags = 0;
276 pfile->endarg.src_loc = 0;
277
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;
282
283 /* Initialize the base context. */
284 pfile->context = &pfile->base_context;
285 pfile->base_context.c.macro = 0;
286 pfile->base_context.prev = pfile->base_context.next = 0;
287
288 /* Aligned and unaligned storage. */
289 pfile->a_buff = _cpp_get_buff (pfile, 0);
290 pfile->u_buff = _cpp_get_buff (pfile, 0);
291
292 /* Initialize table for push_macro/pop_macro. */
293 pfile->pushed_macros = 0;
294
295 /* Do not force token locations by default. */
296 pfile->forced_token_location = 0;
297
298 /* Note the timestamp is unset. */
299 pfile->time_stamp = time_t (-1);
300 pfile->time_stamp_kind = 0;
301
302 /* The expression parser stack. */
303 _cpp_expand_op_stack (pfile);
304
305 /* Initialize the buffer obstack. */
306 obstack_specify_allocation (&pfile->buffer_ob, 0, 0, xmalloc, free);
307
308 _cpp_init_files (pfile);
309
310 _cpp_init_hashtable (pfile, table, extra_table);
311
312 return pfile;
313}
314
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
318cpp_set_line_map (cpp_reader *pfile, class line_maps *line_table)
319{
320 pfile->line_table = line_table;
321}
322
323/* Free resources used by PFILE. Accessing PFILE after this function
324 returns leads to undefined behavior. Returns the error count. */
325void
326cpp_destroy (cpp_reader *pfile)
327{
328 cpp_context *context, *contextn;
329 struct def_pragma_macro *pmacro;
330 tokenrun *run, *runn;
331 int i;
332
333 free (ptr: pfile->op_stack);
334
335 while (CPP_BUFFER (pfile) != NULL)
336 _cpp_pop_buffer (pfile);
337
338 free (ptr: pfile->out.base);
339
340 if (pfile->macro_buffer)
341 {
342 free (ptr: pfile->macro_buffer);
343 pfile->macro_buffer = NULL;
344 pfile->macro_buffer_len = 0;
345 }
346
347 if (pfile->deps)
348 deps_free (pfile->deps);
349 obstack_free (&pfile->buffer_ob, 0);
350
351 _cpp_destroy_hashtable (pfile);
352 _cpp_cleanup_files (pfile);
353 _cpp_destroy_iconv (pfile);
354
355 _cpp_free_buff (pfile->a_buff);
356 _cpp_free_buff (pfile->u_buff);
357 _cpp_free_buff (pfile->free_buffs);
358
359 for (run = &pfile->base_run; run; run = runn)
360 {
361 runn = run->next;
362 free (ptr: run->base);
363 if (run != &pfile->base_run)
364 free (ptr: run);
365 }
366
367 for (context = pfile->base_context.next; context; context = contextn)
368 {
369 contextn = context->next;
370 free (ptr: context);
371 }
372
373 if (pfile->comments.entries)
374 {
375 for (i = 0; i < pfile->comments.count; i++)
376 free (ptr: pfile->comments.entries[i].comment);
377
378 free (ptr: pfile->comments.entries);
379 }
380 if (pfile->pushed_macros)
381 {
382 do
383 {
384 pmacro = pfile->pushed_macros;
385 pfile->pushed_macros = pmacro->next;
386 free (ptr: pmacro->name);
387 free (ptr: pmacro);
388 }
389 while (pfile->pushed_macros);
390 }
391
392 free (ptr: pfile);
393}
394
395/* This structure defines one built-in identifier. A node will be
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
400 macro.cc. Builtin is somewhat of a misnomer -- the property of
401 interest is that these macros require special code to compute their
402 expansions. The value is a "cpp_builtin_type" enumerator.
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. */
409struct builtin_macro
410{
411 const uchar *const name;
412 const unsigned short len;
413 const unsigned short value;
414 const bool always_warn_if_redefined;
415};
416
417#define B(n, t, f) { DSC(n), t, f }
418static const struct builtin_macro builtin_array[] =
419{
420 B("__TIMESTAMP__", BT_TIMESTAMP, false),
421 B("__TIME__", BT_TIME, false),
422 B("__DATE__", BT_DATE, false),
423 B("__FILE__", BT_FILE, false),
424 B("__FILE_NAME__", BT_FILE_NAME, false),
425 B("__BASE_FILE__", BT_BASE_FILE, false),
426 B("__LINE__", BT_SPECLINE, true),
427 B("__INCLUDE_LEVEL__", BT_INCLUDE_LEVEL, true),
428 B("__COUNTER__", BT_COUNTER, true),
429 /* Make sure to update the list of built-in
430 function-like macros in traditional.cc:
431 fun_like_macro() when adding more following */
432 B("__has_attribute", BT_HAS_ATTRIBUTE, true),
433 B("__has_c_attribute", BT_HAS_STD_ATTRIBUTE, true),
434 B("__has_cpp_attribute", BT_HAS_ATTRIBUTE, true),
435 B("__has_builtin", BT_HAS_BUILTIN, true),
436 B("__has_include", BT_HAS_INCLUDE, true),
437 B("__has_include_next",BT_HAS_INCLUDE_NEXT, true),
438 B("__has_feature", BT_HAS_FEATURE, true),
439 B("__has_extension", BT_HAS_EXTENSION, true),
440 /* Keep builtins not used for -traditional-cpp at the end, and
441 update init_builtins() if any more are added. */
442 B("_Pragma", BT_PRAGMA, true),
443 B("__STDC__", BT_STDC, true),
444};
445#undef B
446
447struct builtin_operator
448{
449 const uchar *const name;
450 const unsigned short len;
451 const unsigned short value;
452};
453
454#define B(n, t) { DSC(n), t }
455static const struct builtin_operator operator_array[] =
456{
457 B("and", CPP_AND_AND),
458 B("and_eq", CPP_AND_EQ),
459 B("bitand", CPP_AND),
460 B("bitor", CPP_OR),
461 B("compl", CPP_COMPL),
462 B("not", CPP_NOT),
463 B("not_eq", CPP_NOT_EQ),
464 B("or", CPP_OR_OR),
465 B("or_eq", CPP_OR_EQ),
466 B("xor", CPP_XOR),
467 B("xor_eq", CPP_XOR_EQ)
468};
469#undef B
470
471/* Mark the C++ named operators in the hash table. */
472static void
473mark_named_operators (cpp_reader *pfile, int flags)
474{
475 const struct builtin_operator *b;
476
477 for (b = operator_array;
478 b < (operator_array + ARRAY_SIZE (operator_array));
479 b++)
480 {
481 cpp_hashnode *hp = cpp_lookup (pfile, b->name, b->len);
482 hp->flags |= flags;
483 hp->is_directive = 0;
484 hp->directive_index = b->value;
485 }
486}
487
488/* Helper function of cpp_type2name. Return the string associated with
489 named operator TYPE. */
490const char *
491cpp_named_operator2name (enum cpp_ttype type)
492{
493 const struct builtin_operator *b;
494
495 for (b = operator_array;
496 b < (operator_array + ARRAY_SIZE (operator_array));
497 b++)
498 {
499 if (type == b->value)
500 return (const char *) b->name;
501 }
502
503 return NULL;
504}
505
506void
507cpp_init_special_builtins (cpp_reader *pfile)
508{
509 const struct builtin_macro *b;
510 size_t n = ARRAY_SIZE (builtin_array);
511
512 if (CPP_OPTION (pfile, traditional))
513 n -= 2;
514 else if (! CPP_OPTION (pfile, stdc_0_in_system_headers)
515 || CPP_OPTION (pfile, std))
516 n--;
517
518 for (b = builtin_array; b < builtin_array + n; b++)
519 {
520 if ((b->value == BT_HAS_ATTRIBUTE
521 || b->value == BT_HAS_STD_ATTRIBUTE
522 || b->value == BT_HAS_BUILTIN)
523 && (CPP_OPTION (pfile, lang) == CLK_ASM
524 || pfile->cb.has_attribute == NULL))
525 continue;
526 cpp_hashnode *hp = cpp_lookup (pfile, b->name, b->len);
527 hp->type = NT_BUILTIN_MACRO;
528 if (b->always_warn_if_redefined)
529 hp->flags |= NODE_WARN;
530 hp->value.builtin = (enum cpp_builtin_type) b->value;
531 }
532}
533
534/* Restore macro C to builtin macro definition. */
535
536void
537_cpp_restore_special_builtin (cpp_reader *pfile, struct def_pragma_macro *c)
538{
539 size_t len = strlen (s: c->name);
540
541 for (const struct builtin_macro *b = builtin_array;
542 b < builtin_array + ARRAY_SIZE (builtin_array); b++)
543 if (b->len == len && memcmp (s1: c->name, s2: b->name, n: len + 1) == 0)
544 {
545 cpp_hashnode *hp = cpp_lookup (pfile, b->name, b->len);
546 hp->type = NT_BUILTIN_MACRO;
547 if (b->always_warn_if_redefined)
548 hp->flags |= NODE_WARN;
549 hp->value.builtin = (enum cpp_builtin_type) b->value;
550 }
551}
552
553/* Read the builtins table above and enter them, and language-specific
554 macros, into the hash table. HOSTED is true if this is a hosted
555 environment. */
556void
557cpp_init_builtins (cpp_reader *pfile, int hosted)
558{
559 cpp_init_special_builtins (pfile);
560
561 if (!CPP_OPTION (pfile, traditional)
562 && (! CPP_OPTION (pfile, stdc_0_in_system_headers)
563 || CPP_OPTION (pfile, std)))
564 _cpp_define_builtin (pfile, "__STDC__ 1");
565
566 if (CPP_OPTION (pfile, cplusplus))
567 {
568 /* C++26 is not yet a standard. For now, use an invalid
569 year/month, 202400L, which is larger than 202302L. */
570 if (CPP_OPTION (pfile, lang) == CLK_CXX26
571 || CPP_OPTION (pfile, lang) == CLK_GNUCXX26)
572 _cpp_define_builtin (pfile, "__cplusplus 202400L");
573 else if (CPP_OPTION (pfile, lang) == CLK_CXX23
574 || CPP_OPTION (pfile, lang) == CLK_GNUCXX23)
575 _cpp_define_builtin (pfile, "__cplusplus 202302L");
576 else if (CPP_OPTION (pfile, lang) == CLK_CXX20
577 || CPP_OPTION (pfile, lang) == CLK_GNUCXX20)
578 _cpp_define_builtin (pfile, "__cplusplus 202002L");
579 else if (CPP_OPTION (pfile, lang) == CLK_CXX17
580 || CPP_OPTION (pfile, lang) == CLK_GNUCXX17)
581 _cpp_define_builtin (pfile, "__cplusplus 201703L");
582 else if (CPP_OPTION (pfile, lang) == CLK_CXX14
583 || CPP_OPTION (pfile, lang) == CLK_GNUCXX14)
584 _cpp_define_builtin (pfile, "__cplusplus 201402L");
585 else if (CPP_OPTION (pfile, lang) == CLK_CXX11
586 || CPP_OPTION (pfile, lang) == CLK_GNUCXX11)
587 _cpp_define_builtin (pfile, "__cplusplus 201103L");
588 else
589 _cpp_define_builtin (pfile, "__cplusplus 199711L");
590 }
591 else if (CPP_OPTION (pfile, lang) == CLK_ASM)
592 _cpp_define_builtin (pfile, "__ASSEMBLER__ 1");
593 else if (CPP_OPTION (pfile, lang) == CLK_STDC94)
594 _cpp_define_builtin (pfile, "__STDC_VERSION__ 199409L");
595 else if (CPP_OPTION (pfile, lang) == CLK_STDC23
596 || CPP_OPTION (pfile, lang) == CLK_GNUC23)
597 _cpp_define_builtin (pfile, "__STDC_VERSION__ 202000L");
598 else if (CPP_OPTION (pfile, lang) == CLK_STDC17
599 || CPP_OPTION (pfile, lang) == CLK_GNUC17)
600 _cpp_define_builtin (pfile, "__STDC_VERSION__ 201710L");
601 else if (CPP_OPTION (pfile, lang) == CLK_STDC11
602 || CPP_OPTION (pfile, lang) == CLK_GNUC11)
603 _cpp_define_builtin (pfile, "__STDC_VERSION__ 201112L");
604 else if (CPP_OPTION (pfile, c99))
605 _cpp_define_builtin (pfile, "__STDC_VERSION__ 199901L");
606
607 if (CPP_OPTION (pfile, uliterals)
608 && !(CPP_OPTION (pfile, cplusplus)
609 && (CPP_OPTION (pfile, lang) == CLK_GNUCXX
610 || CPP_OPTION (pfile, lang) == CLK_CXX98)))
611 {
612 _cpp_define_builtin (pfile, "__STDC_UTF_16__ 1");
613 _cpp_define_builtin (pfile, "__STDC_UTF_32__ 1");
614 }
615
616 if (hosted)
617 _cpp_define_builtin (pfile, "__STDC_HOSTED__ 1");
618 else
619 _cpp_define_builtin (pfile, "__STDC_HOSTED__ 0");
620
621 if (CPP_OPTION (pfile, objc))
622 _cpp_define_builtin (pfile, "__OBJC__ 1");
623}
624
625/* Sanity-checks are dependent on command-line options, so it is
626 called as a subroutine of cpp_read_main_file. */
627#if CHECKING_P
628static void sanity_checks (cpp_reader *);
629static void sanity_checks (cpp_reader *pfile)
630{
631 cppchar_t test = 0;
632 size_t max_precision = 2 * CHAR_BIT * sizeof (cpp_num_part);
633
634 /* Sanity checks for assumptions about CPP arithmetic and target
635 type precisions made by cpplib. */
636 test--;
637 if (test < 1)
638 cpp_error (pfile, CPP_DL_ICE, msgid: "cppchar_t must be an unsigned type");
639
640 if (CPP_OPTION (pfile, precision) > max_precision)
641 cpp_error (pfile, CPP_DL_ICE,
642 msgid: "preprocessor arithmetic has maximum precision of %lu bits;"
643 " target requires %lu bits",
644 (unsigned long) max_precision,
645 (unsigned long) CPP_OPTION (pfile, precision));
646
647 if (CPP_OPTION (pfile, precision) < CPP_OPTION (pfile, int_precision))
648 cpp_error (pfile, CPP_DL_ICE,
649 msgid: "CPP arithmetic must be at least as precise as a target int");
650
651 if (CPP_OPTION (pfile, char_precision) < 8)
652 cpp_error (pfile, CPP_DL_ICE, msgid: "target char is less than 8 bits wide");
653
654 if (CPP_OPTION (pfile, wchar_precision) < CPP_OPTION (pfile, char_precision))
655 cpp_error (pfile, CPP_DL_ICE,
656 msgid: "target wchar_t is narrower than target char");
657
658 if (CPP_OPTION (pfile, int_precision) < CPP_OPTION (pfile, char_precision))
659 cpp_error (pfile, CPP_DL_ICE,
660 msgid: "target int is narrower than target char");
661
662 /* This is assumed in eval_token() and could be fixed if necessary. */
663 if (sizeof (cppchar_t) > sizeof (cpp_num_part))
664 cpp_error (pfile, CPP_DL_ICE,
665 msgid: "CPP half-integer narrower than CPP character");
666
667 if (CPP_OPTION (pfile, wchar_precision) > BITS_PER_CPPCHAR_T)
668 cpp_error (pfile, CPP_DL_ICE,
669 msgid: "CPP on this host cannot handle wide character constants over"
670 " %lu bits, but the target requires %lu bits",
671 (unsigned long) BITS_PER_CPPCHAR_T,
672 (unsigned long) CPP_OPTION (pfile, wchar_precision));
673}
674#else
675# define sanity_checks(PFILE)
676#endif
677
678/* This is called after options have been parsed, and partially
679 processed. */
680void
681cpp_post_options (cpp_reader *pfile)
682{
683 int flags;
684
685 sanity_checks (pfile);
686
687 post_options (pfile);
688
689 /* Mark named operators before handling command line macros. */
690 flags = 0;
691 if (CPP_OPTION (pfile, cplusplus) && CPP_OPTION (pfile, operator_names))
692 flags |= NODE_OPERATOR;
693 if (CPP_OPTION (pfile, warn_cxx_operator_names))
694 flags |= NODE_DIAGNOSTIC | NODE_WARN_OPERATOR;
695 if (flags != 0)
696 mark_named_operators (pfile, flags);
697}
698
699/* Setup for processing input from the file named FNAME, or stdin if
700 it is the empty string. Return the original filename on success
701 (e.g. foo.i->foo.c), or NULL on failure. INJECTING is true if
702 there may be injected headers before line 1 of the main file. */
703const char *
704cpp_read_main_file (cpp_reader *pfile, const char *fname, bool injecting)
705{
706 if (mkdeps *deps = cpp_get_deps (pfile))
707 /* Set the default target (if there is none already). */
708 deps_add_default_target (deps, fname);
709
710 pfile->main_file
711 = _cpp_find_file (pfile, fname,
712 CPP_OPTION (pfile, preprocessed) ? &pfile->no_search_path
713 : CPP_OPTION (pfile, main_search) == CMS_user
714 ? pfile->quote_include
715 : CPP_OPTION (pfile, main_search) == CMS_system
716 ? pfile->bracket_include : &pfile->no_search_path,
717 /*angle=*/0, _cpp_FFK_NORMAL, 0);
718
719 if (_cpp_find_failed (pfile->main_file))
720 return NULL;
721
722 _cpp_stack_file (pfile, pfile->main_file,
723 injecting || CPP_OPTION (pfile, preprocessed)
724 ? IT_PRE_MAIN : IT_MAIN, 0);
725
726 /* For foo.i, read the original filename foo.c now, for the benefit
727 of the front ends. */
728 if (CPP_OPTION (pfile, preprocessed))
729 if (!read_original_filename (pfile))
730 {
731 /* We're on line 1 after all. */
732 auto *last = linemap_check_ordinary
733 (map: LINEMAPS_LAST_MAP (set: pfile->line_table, map_kind: false));
734 last->to_line = 1;
735 /* Inform of as-if a file change. */
736 _cpp_do_file_change (pfile, LC_RENAME_VERBATIM, LINEMAP_FILE (ord_map: last),
737 LINEMAP_LINE (ord_map: last), LINEMAP_SYSP (ord_map: last));
738 }
739
740 auto *map = LINEMAPS_LAST_ORDINARY_MAP (set: pfile->line_table);
741 pfile->main_loc = MAP_START_LOCATION (map);
742
743 return ORDINARY_MAP_FILE_NAME (ord_map: map);
744}
745
746location_t
747cpp_main_loc (const cpp_reader *pfile)
748{
749 return pfile->main_loc;
750}
751
752/* For preprocessed files, if the very first characters are
753 '#<SPACE>[01]<SPACE>', then handle a line directive so we know the
754 original file name. This will generate file_change callbacks,
755 which the front ends must handle appropriately given their state of
756 initialization. We peek directly into the character buffer, so
757 that we're not confused by otherwise-skipped white space &
758 comments. We can be very picky, because this should have been
759 machine-generated text (by us, no less). This way we do not
760 interfere with the module directive state machine. */
761
762static bool
763read_original_filename (cpp_reader *pfile)
764{
765 auto *buf = pfile->buffer->next_line;
766
767 if (pfile->buffer->rlimit - buf > 4
768 && buf[0] == '#'
769 && buf[1] == ' '
770 // Also permit '1', as that's what used to be here
771 && (buf[2] == '0' || buf[2] == '1')
772 && buf[3] == ' ')
773 {
774 const cpp_token *token = _cpp_lex_direct (pfile);
775 gcc_checking_assert (token->type == CPP_HASH);
776 if (_cpp_handle_directive (pfile, token->flags & PREV_WHITE))
777 {
778 read_original_directory (pfile);
779
780 auto *penult = &linemap_check_ordinary
781 (map: LINEMAPS_LAST_MAP (set: pfile->line_table, map_kind: false))[-1];
782 if (penult[1].reason == LC_RENAME_VERBATIM)
783 {
784 /* Expunge any evidence of the original linemap. */
785 pfile->line_table->highest_location
786 = pfile->line_table->highest_line
787 = penult[0].start_location;
788
789 penult[1].start_location = penult[0].start_location;
790 penult[1].reason = penult[0].reason;
791 penult[0] = penult[1];
792 pfile->line_table->info_ordinary.used--;
793 pfile->line_table->info_ordinary.m_cache = 0;
794 }
795
796 return true;
797 }
798 }
799
800 return false;
801}
802
803/* For preprocessed files, if the tokens following the first filename
804 line is of the form # <line> "/path/name//", handle the
805 directive so we know the original current directory.
806
807 As with the first line peeking, we can do this without lexing by
808 being picky. */
809static void
810read_original_directory (cpp_reader *pfile)
811{
812 auto *buf = pfile->buffer->next_line;
813
814 if (pfile->buffer->rlimit - buf > 4
815 && buf[0] == '#'
816 && buf[1] == ' '
817 // Also permit '1', as that's what used to be here
818 && (buf[2] == '0' || buf[2] == '1')
819 && buf[3] == ' ')
820 {
821 const cpp_token *hash = _cpp_lex_direct (pfile);
822 gcc_checking_assert (hash->type == CPP_HASH);
823 pfile->state.in_directive = 1;
824 const cpp_token *number = _cpp_lex_direct (pfile);
825 gcc_checking_assert (number->type == CPP_NUMBER);
826 const cpp_token *string = _cpp_lex_direct (pfile);
827 pfile->state.in_directive = 0;
828
829 const unsigned char *text = nullptr;
830 size_t len = 0;
831 if (string->type == CPP_STRING)
832 {
833 /* The string value includes the quotes. */
834 text = string->val.str.text;
835 len = string->val.str.len;
836 }
837 if (len < 5
838 || !IS_DIR_SEPARATOR (text[len - 2])
839 || !IS_DIR_SEPARATOR (text[len - 3]))
840 {
841 /* That didn't work out, back out. */
842 _cpp_backup_tokens (pfile, 3);
843 return;
844 }
845
846 if (pfile->cb.dir_change)
847 {
848 /* Smash the string directly, it's dead at this point */
849 char *smashy = (char *)text;
850 smashy[len - 3] = 0;
851
852 pfile->cb.dir_change (pfile, smashy + 1);
853 }
854
855 /* We should be at EOL. */
856 }
857}
858
859/* This is called at the end of preprocessing. It pops the last
860 buffer and writes dependency output.
861
862 Maybe it should also reset state, such that you could call
863 cpp_start_read with a new filename to restart processing. */
864void
865cpp_finish (struct cpp_reader *pfile, FILE *deps_stream, FILE *fdeps_stream)
866{
867 /* Warn about unused macros before popping the final buffer. */
868 if (CPP_OPTION (pfile, warn_unused_macros))
869 cpp_forall_identifiers (pfile, _cpp_warn_if_unused_macro, NULL);
870
871 /* lex.cc leaves the final buffer on the stack. This it so that
872 it returns an unending stream of CPP_EOFs to the client. If we
873 popped the buffer, we'd dereference a NULL buffer pointer and
874 segfault. It's nice to allow the client to do worry-free excess
875 cpp_get_token calls. */
876 while (pfile->buffer)
877 _cpp_pop_buffer (pfile);
878
879 cpp_fdeps_format fdeps_format = CPP_OPTION (pfile, deps.fdeps_format);
880 if (fdeps_format == FDEPS_FMT_P1689R5 && fdeps_stream)
881 deps_write_p1689r5 (pfile->deps, fdeps_stream);
882
883 if (CPP_OPTION (pfile, deps.style) != DEPS_NONE
884 && deps_stream)
885 {
886 deps_write (pfile, deps_stream, 72);
887 }
888
889 /* Report on headers that could use multiple include guards. */
890 if (CPP_OPTION (pfile, print_include_names))
891 _cpp_report_missing_guards (pfile);
892}
893
894static void
895post_options (cpp_reader *pfile)
896{
897 /* -Wtraditional is not useful in C++ mode. */
898 if (CPP_OPTION (pfile, cplusplus))
899 CPP_OPTION (pfile, cpp_warn_traditional) = 0;
900
901 /* Permanently disable macro expansion if we are rescanning
902 preprocessed text. Read preprocesed source in ISO mode. */
903 if (CPP_OPTION (pfile, preprocessed))
904 {
905 if (!CPP_OPTION (pfile, directives_only))
906 pfile->state.prevent_expansion = 1;
907 CPP_OPTION (pfile, traditional) = 0;
908 }
909
910 if (CPP_OPTION (pfile, warn_trigraphs) == 2)
911 CPP_OPTION (pfile, warn_trigraphs) = !CPP_OPTION (pfile, trigraphs);
912
913 if (CPP_OPTION (pfile, traditional))
914 {
915 CPP_OPTION (pfile, trigraphs) = 0;
916 CPP_OPTION (pfile, warn_trigraphs) = 0;
917 }
918
919 if (CPP_OPTION (pfile, module_directives))
920 {
921 /* These unspellable tokens have a leading space. */
922 const char *const inits[spec_nodes::M_HWM]
923 = {"export ", "module ", "import ", "__import"};
924
925 for (int ix = 0; ix != spec_nodes::M_HWM; ix++)
926 {
927 cpp_hashnode *node = cpp_lookup (pfile, UC (inits[ix]),
928 strlen (s: inits[ix]));
929
930 /* Token we pass to the compiler. */
931 pfile->spec_nodes.n_modules[ix][1] = node;
932
933 if (ix != spec_nodes::M__IMPORT)
934 /* Token we recognize when lexing, drop the trailing ' '. */
935 node = cpp_lookup (pfile, NODE_NAME (node), NODE_LEN (node) - 1);
936
937 node->flags |= NODE_MODULE;
938 pfile->spec_nodes.n_modules[ix][0] = node;
939 }
940 }
941}
942

source code of libcpp/init.cc