1/* CPP Library.
2 Copyright (C) 1986-2023 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 /* Keep builtins not used for -traditional-cpp at the end, and
439 update init_builtins() if any more are added. */
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;
450};
451
452#define B(n, t) { DSC(n), t }
453static const struct builtin_operator operator_array[] =
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)
466};
467#undef B
468
469/* Mark the C++ named operators in the hash table. */
470static void
471mark_named_operators (cpp_reader *pfile, int flags)
472{
473 const struct builtin_operator *b;
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);
480 hp->flags |= flags;
481 hp->is_directive = 0;
482 hp->directive_index = b->value;
483 }
484}
485
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
504void
505cpp_init_special_builtins (cpp_reader *pfile)
506{
507 const struct builtin_macro *b;
508 size_t n = ARRAY_SIZE (builtin_array);
509
510 if (CPP_OPTION (pfile, traditional))
511 n -= 2;
512 else if (! CPP_OPTION (pfile, stdc_0_in_system_headers)
513 || CPP_OPTION (pfile, std))
514 n--;
515
516 for (b = builtin_array; b < builtin_array + n; b++)
517 {
518 if ((b->value == BT_HAS_ATTRIBUTE
519 || b->value == BT_HAS_STD_ATTRIBUTE
520 || b->value == BT_HAS_BUILTIN)
521 && (CPP_OPTION (pfile, lang) == CLK_ASM
522 || pfile->cb.has_attribute == NULL))
523 continue;
524 cpp_hashnode *hp = cpp_lookup (pfile, b->name, b->len);
525 hp->type = NT_BUILTIN_MACRO;
526 if (b->always_warn_if_redefined)
527 hp->flags |= NODE_WARN;
528 hp->value.builtin = (enum cpp_builtin_type) b->value;
529 }
530}
531
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 (s: 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 (s1: c->name, s2: b->name, n: 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
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");
563
564 if (CPP_OPTION (pfile, cplusplus))
565 {
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
572 || CPP_OPTION (pfile, lang) == CLK_GNUCXX23)
573 _cpp_define_builtin (pfile, "__cplusplus 202302L");
574 else if (CPP_OPTION (pfile, lang) == CLK_CXX20
575 || CPP_OPTION (pfile, lang) == CLK_GNUCXX20)
576 _cpp_define_builtin (pfile, "__cplusplus 202002L");
577 else if (CPP_OPTION (pfile, lang) == CLK_CXX17
578 || CPP_OPTION (pfile, lang) == CLK_GNUCXX17)
579 _cpp_define_builtin (pfile, "__cplusplus 201703L");
580 else if (CPP_OPTION (pfile, lang) == CLK_CXX14
581 || CPP_OPTION (pfile, lang) == CLK_GNUCXX14)
582 _cpp_define_builtin (pfile, "__cplusplus 201402L");
583 else if (CPP_OPTION (pfile, lang) == CLK_CXX11
584 || CPP_OPTION (pfile, lang) == CLK_GNUCXX11)
585 _cpp_define_builtin (pfile, "__cplusplus 201103L");
586 else
587 _cpp_define_builtin (pfile, "__cplusplus 199711L");
588 }
589 else if (CPP_OPTION (pfile, lang) == CLK_ASM)
590 _cpp_define_builtin (pfile, "__ASSEMBLER__ 1");
591 else if (CPP_OPTION (pfile, lang) == CLK_STDC94)
592 _cpp_define_builtin (pfile, "__STDC_VERSION__ 199409L");
593 else if (CPP_OPTION (pfile, lang) == CLK_STDC23
594 || CPP_OPTION (pfile, lang) == CLK_GNUC23)
595 _cpp_define_builtin (pfile, "__STDC_VERSION__ 202000L");
596 else if (CPP_OPTION (pfile, lang) == CLK_STDC17
597 || CPP_OPTION (pfile, lang) == CLK_GNUC17)
598 _cpp_define_builtin (pfile, "__STDC_VERSION__ 201710L");
599 else if (CPP_OPTION (pfile, lang) == CLK_STDC11
600 || CPP_OPTION (pfile, lang) == CLK_GNUC11)
601 _cpp_define_builtin (pfile, "__STDC_VERSION__ 201112L");
602 else if (CPP_OPTION (pfile, c99))
603 _cpp_define_builtin (pfile, "__STDC_VERSION__ 199901L");
604
605 if (CPP_OPTION (pfile, uliterals)
606 && !(CPP_OPTION (pfile, cplusplus)
607 && (CPP_OPTION (pfile, lang) == CLK_GNUCXX
608 || CPP_OPTION (pfile, lang) == CLK_CXX98)))
609 {
610 _cpp_define_builtin (pfile, "__STDC_UTF_16__ 1");
611 _cpp_define_builtin (pfile, "__STDC_UTF_32__ 1");
612 }
613
614 if (hosted)
615 _cpp_define_builtin (pfile, "__STDC_HOSTED__ 1");
616 else
617 _cpp_define_builtin (pfile, "__STDC_HOSTED__ 0");
618
619 if (CPP_OPTION (pfile, objc))
620 _cpp_define_builtin (pfile, "__OBJC__ 1");
621}
622
623/* Sanity-checks are dependent on command-line options, so it is
624 called as a subroutine of cpp_read_main_file. */
625#if CHECKING_P
626static void sanity_checks (cpp_reader *);
627static void sanity_checks (cpp_reader *pfile)
628{
629 cppchar_t test = 0;
630 size_t max_precision = 2 * CHAR_BIT * sizeof (cpp_num_part);
631
632 /* Sanity checks for assumptions about CPP arithmetic and target
633 type precisions made by cpplib. */
634 test--;
635 if (test < 1)
636 cpp_error (pfile, CPP_DL_ICE, msgid: "cppchar_t must be an unsigned type");
637
638 if (CPP_OPTION (pfile, precision) > max_precision)
639 cpp_error (pfile, CPP_DL_ICE,
640 msgid: "preprocessor arithmetic has maximum precision of %lu bits;"
641 " target requires %lu bits",
642 (unsigned long) max_precision,
643 (unsigned long) CPP_OPTION (pfile, precision));
644
645 if (CPP_OPTION (pfile, precision) < CPP_OPTION (pfile, int_precision))
646 cpp_error (pfile, CPP_DL_ICE,
647 msgid: "CPP arithmetic must be at least as precise as a target int");
648
649 if (CPP_OPTION (pfile, char_precision) < 8)
650 cpp_error (pfile, CPP_DL_ICE, msgid: "target char is less than 8 bits wide");
651
652 if (CPP_OPTION (pfile, wchar_precision) < CPP_OPTION (pfile, char_precision))
653 cpp_error (pfile, CPP_DL_ICE,
654 msgid: "target wchar_t is narrower than target char");
655
656 if (CPP_OPTION (pfile, int_precision) < CPP_OPTION (pfile, char_precision))
657 cpp_error (pfile, CPP_DL_ICE,
658 msgid: "target int is narrower than target char");
659
660 /* This is assumed in eval_token() and could be fixed if necessary. */
661 if (sizeof (cppchar_t) > sizeof (cpp_num_part))
662 cpp_error (pfile, CPP_DL_ICE,
663 msgid: "CPP half-integer narrower than CPP character");
664
665 if (CPP_OPTION (pfile, wchar_precision) > BITS_PER_CPPCHAR_T)
666 cpp_error (pfile, CPP_DL_ICE,
667 msgid: "CPP on this host cannot handle wide character constants over"
668 " %lu bits, but the target requires %lu bits",
669 (unsigned long) BITS_PER_CPPCHAR_T,
670 (unsigned long) CPP_OPTION (pfile, wchar_precision));
671}
672#else
673# define sanity_checks(PFILE)
674#endif
675
676/* This is called after options have been parsed, and partially
677 processed. */
678void
679cpp_post_options (cpp_reader *pfile)
680{
681 int flags;
682
683 sanity_checks (pfile);
684
685 post_options (pfile);
686
687 /* Mark named operators before handling command line macros. */
688 flags = 0;
689 if (CPP_OPTION (pfile, cplusplus) && CPP_OPTION (pfile, operator_names))
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);
695}
696
697/* Setup for processing input from the file named FNAME, or stdin if
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. */
701const char *
702cpp_read_main_file (cpp_reader *pfile, const char *fname, bool injecting)
703{
704 if (mkdeps *deps = cpp_get_deps (pfile))
705 /* Set the default target (if there is none already). */
706 deps_add_default_target (deps, fname);
707
708 pfile->main_file
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
717 if (_cpp_find_failed (pfile->main_file))
718 return NULL;
719
720 _cpp_stack_file (pfile, pfile->main_file,
721 injecting || CPP_OPTION (pfile, preprocessed)
722 ? IT_PRE_MAIN : IT_MAIN, 0);
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))
727 if (!read_original_filename (pfile))
728 {
729 /* We're on line 1 after all. */
730 auto *last = linemap_check_ordinary
731 (map: LINEMAPS_LAST_MAP (set: pfile->line_table, map_kind: 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 (ord_map: last),
735 LINEMAP_LINE (ord_map: last), LINEMAP_SYSP (ord_map: last));
736 }
737
738 auto *map = LINEMAPS_LAST_ORDINARY_MAP (set: pfile->line_table);
739 pfile->main_loc = MAP_START_LOCATION (map);
740
741 return ORDINARY_MAP_FILE_NAME (ord_map: map);
742}
743
744location_t
745cpp_main_loc (const cpp_reader *pfile)
746{
747 return pfile->main_loc;
748}
749
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
761read_original_filename (cpp_reader *pfile)
762{
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] == ' ')
771 {
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))
775 {
776 read_original_directory (pfile);
777
778 auto *penult = &linemap_check_ordinary
779 (map: LINEMAPS_LAST_MAP (set: pfile->line_table, map_kind: 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--;
791 pfile->line_table->info_ordinary.m_cache = 0;
792 }
793
794 return true;
795 }
796 }
797
798 return false;
799}
800
801/* For preprocessed files, if the tokens following the first filename
802 line is of the form # <line> "/path/name//", handle the
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. */
807static void
808read_original_directory (cpp_reader *pfile)
809{
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] == ' ')
818 {
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;
826
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 }
843
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 }
852
853 /* We should be at EOL. */
854 }
855}
856
857/* This is called at the end of preprocessing. It pops the last
858 buffer and writes dependency output.
859
860 Maybe it should also reset state, such that you could call
861 cpp_start_read with a new filename to restart processing. */
862void
863cpp_finish (struct cpp_reader *pfile, FILE *deps_stream, FILE *fdeps_stream)
864{
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
869 /* lex.cc leaves the final buffer on the stack. This it so that
870 it returns an unending stream of CPP_EOFs to the client. If we
871 popped the buffer, we'd dereference a NULL buffer pointer and
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);
876
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 }
886
887 /* Report on headers that could use multiple include guards. */
888 if (CPP_OPTION (pfile, print_include_names))
889 _cpp_report_missing_guards (pfile);
890}
891
892static void
893post_options (cpp_reader *pfile)
894{
895 /* -Wtraditional is not useful in C++ mode. */
896 if (CPP_OPTION (pfile, cplusplus))
897 CPP_OPTION (pfile, cpp_warn_traditional) = 0;
898
899 /* Permanently disable macro expansion if we are rescanning
900 preprocessed text. Read preprocesed source in ISO mode. */
901 if (CPP_OPTION (pfile, preprocessed))
902 {
903 if (!CPP_OPTION (pfile, directives_only))
904 pfile->state.prevent_expansion = 1;
905 CPP_OPTION (pfile, traditional) = 0;
906 }
907
908 if (CPP_OPTION (pfile, warn_trigraphs) == 2)
909 CPP_OPTION (pfile, warn_trigraphs) = !CPP_OPTION (pfile, trigraphs);
910
911 if (CPP_OPTION (pfile, traditional))
912 {
913 CPP_OPTION (pfile, trigraphs) = 0;
914 CPP_OPTION (pfile, warn_trigraphs) = 0;
915 }
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 (s: 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 }
939}
940

source code of libcpp/init.cc