]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cp/name-lookup.h
Update copyright years.
[thirdparty/gcc.git] / gcc / cp / name-lookup.h
CommitLineData
6db76e48 1/* Declarations for -*- C++ -*- name lookup routines.
a945c346 2 Copyright (C) 2003-2024 Free Software Foundation, Inc.
aed81407
GDR
3 Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
4
ed3cf953 5This file is part of GCC.
aed81407 6
ed3cf953 7GCC is free software; you can redistribute it and/or modify
aed81407 8it under the terms of the GNU General Public License as published by
e77f031d 9the Free Software Foundation; either version 3, or (at your option)
aed81407
GDR
10any later version.
11
ed3cf953 12GCC is distributed in the hope that it will be useful,
aed81407
GDR
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
e77f031d
NC
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
aed81407
GDR
20
21#ifndef GCC_CP_NAME_LOOKUP_H
22#define GCC_CP_NAME_LOOKUP_H
23
39dabefd 24#include "c-family/c-common.h"
aed81407 25
5e0c54e5 26\f
ed3cf953 27/* The datatype used to implement C++ scope. */
c80ee302 28struct cp_binding_level;
ed3cf953 29
aed81407
GDR
30/* Nonzero if this binding is for a local scope, as opposed to a class
31 or namespace scope. */
32#define LOCAL_BINDING_P(NODE) ((NODE)->is_local)
33
147135cc 34/* True if NODE->value is from a base class of the class which is
aed81407
GDR
35 currently being defined. */
36#define INHERITED_VALUE_BINDING_P(NODE) ((NODE)->value_is_inherited)
37
7cbfe089
NS
38/* The IMPLICIT_TYPEDEF is hidden from ordinary name lookup (it was
39 injected via a local class's friend decl). The typdef may be in the
40 VALUE or the TYPE slot. We do not get the situation where the
41 value and type slots are both filled and both hidden. */
42#define HIDDEN_TYPE_BINDING_P(NODE) ((NODE)->type_is_hidden)
43
c80ee302
NS
44/* Datatype that represents binding established by a declaration between
45 a name and a C++ entity. */
d1b38208 46struct GTY(()) cxx_binding {
aed81407
GDR
47 /* Link to chain together various bindings for this name. */
48 cxx_binding *previous;
49 /* The non-type entity this name is bound to. */
50 tree value;
51 /* The type entity this name is bound to. */
52 tree type;
ed3cf953 53 /* The scope at which this binding was made. */
2c140474 54 cp_binding_level *scope;
c80ee302
NS
55
56 bool value_is_inherited : 1;
57 bool is_local : 1;
7cbfe089 58 bool type_is_hidden : 1;
aed81407
GDR
59};
60
f44b0c8e 61/* Datatype used to temporarily save C++ bindings (for implicit
e53b6e56 62 instantiations purposes and like). Implemented in decl.cc. */
a79683d5 63struct GTY(()) cxx_saved_binding {
f44b0c8e
MM
64 /* The name of the current binding. */
65 tree identifier;
66 /* The binding we're saving. */
67 cxx_binding *binding;
f44b0c8e 68 tree real_type_value;
a79683d5 69};
f44b0c8e 70
05f7a2af
NS
71/* To support lazy module loading, we squirrel away a section number
72 (and a couple of flags) in the binding slot of unloaded bindings.
73 We rely on pointers being aligned and setting the bottom bit to
74 mark a lazy value. GTY doesn't like an array of union, so we have
75 a containing struct. */
76
77struct GTY(()) binding_slot {
78 union GTY((desc ("%1.is_lazy ()"))) binding_slot_lazy {
79 tree GTY((tag ("false"))) binding;
80 } u;
81
82 operator tree & ()
83 {
84 gcc_checking_assert (!is_lazy ());
85 return u.binding;
86 }
87 binding_slot &operator= (tree t)
88 {
89 u.binding = t;
90 return *this;
91 }
92 bool is_lazy () const
93 {
94 return bool (uintptr_t (u.binding) & 1);
95 }
96 void set_lazy (unsigned snum)
97 {
98 gcc_checking_assert (!u.binding);
99 u.binding = tree (uintptr_t ((snum << 1) | 1));
100 }
101 void or_lazy (unsigned snum)
102 {
103 gcc_checking_assert (is_lazy ());
104 u.binding = tree (uintptr_t (u.binding) | (snum << 1));
105 }
106 unsigned get_lazy () const
107 {
108 gcc_checking_assert (is_lazy ());
109 return unsigned (uintptr_t (u.binding) >> 1);
110 }
111};
112
113/* Bindings for modules are held in a sparse array. There is always a
114 current TU slot, others are allocated as needed. By construction
115 of the importing mechanism we only ever need to append to the
116 array. Rather than have straight index/slot tuples, we bunch them
117 up for greater packing.
118
119 The cluster representation packs well on a 64-bit system. */
120
121#define BINDING_VECTOR_SLOTS_PER_CLUSTER 2
122struct binding_index {
123 unsigned short base;
124 unsigned short span;
125};
126
127struct GTY(()) binding_cluster
128{
129 binding_index GTY((skip)) indices[BINDING_VECTOR_SLOTS_PER_CLUSTER];
130 binding_slot slots[BINDING_VECTOR_SLOTS_PER_CLUSTER];
131};
132
133/* These two fields overlay lang flags. So don't use those. */
134#define BINDING_VECTOR_ALLOC_CLUSTERS(NODE) \
135 (BINDING_VECTOR_CHECK (NODE)->base.u.dependence_info.clique)
136#define BINDING_VECTOR_NUM_CLUSTERS(NODE) \
137 (BINDING_VECTOR_CHECK (NODE)->base.u.dependence_info.base)
138#define BINDING_VECTOR_CLUSTER_BASE(NODE) \
139 (((tree_binding_vec *)BINDING_VECTOR_CHECK (NODE))->vec)
140#define BINDING_VECTOR_CLUSTER_LAST(NODE) \
141 (&BINDING_VECTOR_CLUSTER (NODE, BINDING_VECTOR_NUM_CLUSTERS (NODE) - 1))
142#define BINDING_VECTOR_CLUSTER(NODE,IX) \
143 (((tree_binding_vec *)BINDING_VECTOR_CHECK (NODE))->vec[IX])
144
145struct GTY(()) tree_binding_vec {
146 struct tree_base base;
147 tree name;
148 binding_cluster GTY((length ("%h.base.u.dependence_info.base"))) vec[1];
149};
150
151/* The name of a module vector. */
152#define BINDING_VECTOR_NAME(NODE) \
153 (((tree_binding_vec *)BINDING_VECTOR_CHECK (NODE))->name)
154
155/* tree_binding_vec does uses base.u.dependence_info.base field for
156 length. It does not have lang_flag etc available! */
157
158/* These two flags note if a module-vector contains deduplicated
159 bindings (i.e. multiple declarations in different imports). */
160/* This binding contains duplicate references to a global module
161 entity. */
162#define BINDING_VECTOR_GLOBAL_DUPS_P(NODE) \
163 (BINDING_VECTOR_CHECK (NODE)->base.static_flag)
164/* This binding contains duplicate references to a partioned module
165 entity. */
166#define BINDING_VECTOR_PARTITION_DUPS_P(NODE) \
167 (BINDING_VECTOR_CHECK (NODE)->base.volatile_flag)
168
169/* These two flags indicate the provenence of the bindings on this
170 particular vector slot. We can of course determine this from slot
171 number, but that's a relatively expensive lookup. This avoids
172 that when iterating. */
173/* This slot is part of the global module (a header unit). */
174#define MODULE_BINDING_GLOBAL_P(NODE) \
175 (OVERLOAD_CHECK (NODE)->base.static_flag)
176/* This slot is part of the current module (a partition or primary). */
177#define MODULE_BINDING_PARTITION_P(NODE) \
178 (OVERLOAD_CHECK (NODE)->base.volatile_flag)
179
00e8de68 180extern void set_identifier_type_value (tree, tree);
55fec44d 181extern void push_binding (tree, tree, cp_binding_level*);
9c82d7b6 182extern void pop_local_binding (tree, tree);
9485d254 183extern void pop_bindings_and_leave_scope (void);
5a167978
GDR
184extern tree constructor_name (tree);
185extern bool constructor_name_p (tree, tree);
aed81407 186\f
1ec57cf0 187/* The kinds of scopes we recognize. */
a79683d5 188enum scope_kind {
1ec57cf0
GDR
189 sk_block = 0, /* An ordinary block scope. This enumerator must
190 have the value zero because "cp_binding_level"
191 is initialized by using "memset" to set the
192 contents to zero, and the default scope kind
193 is "sk_block". */
0cbd7506 194 sk_cleanup, /* A scope for (pseudo-)scope for cleanup. It is
1799e5d5 195 pseudo in that it is transparent to name lookup
0cbd7506 196 activities. */
1ec57cf0 197 sk_try, /* A try-block. */
0cbd7506
MS
198 sk_catch, /* A catch-block. */
199 sk_for, /* The scope of the variable declared in a
17a9e380 200 init-statement. */
1eb2a14d
JJ
201 sk_cond, /* The scope of the variable declared in the condition
202 of an if or switch statement. */
c823366f 203 sk_stmt_expr, /* GNU statement expression block. */
1ec57cf0 204 sk_function_parms, /* The scope containing function parameters. */
0cbd7506 205 sk_class, /* The scope containing the members of a class. */
b4cf2e42 206 sk_scoped_enum, /* The scope containing the enumerators of a C++11
adf2edec 207 scoped enumeration. */
0cbd7506 208 sk_namespace, /* The scope containing the members of a
1ec57cf0
GDR
209 namespace, including the global scope. */
210 sk_template_parms, /* A scope for template parameters. */
1799e5d5 211 sk_template_spec, /* Like sk_template_parms, but for an explicit
1ec57cf0
GDR
212 specialization. Since, by definition, an
213 explicit specialization is introduced by
214 "template <>", this scope is always empty. */
b8fd7909 215 sk_transaction, /* A synchronized or atomic statement. */
3db45ab5 216 sk_omp /* An OpenMP structured block. */
a79683d5 217};
1ec57cf0 218
a79683d5 219struct GTY(()) cp_class_binding {
f256f612 220 cxx_binding *base;
89b578be
MM
221 /* The bound name. */
222 tree identifier;
a79683d5 223};
89b578be 224
1ec57cf0
GDR
225/* For each binding contour we allocate a binding_level structure
226 which records the names defined in that contour.
227 Contours include:
228 0) the global one
229 1) one for each function definition,
230 where internal declarations of the parameters appear.
231 2) one for each compound statement,
232 to record its declarations.
233
234 The current meaning of a name can be found by searching the levels
235 from the current one out to the global one.
236
237 Off to the side, may be the class_binding_level. This exists only
238 to catch class-local declarations. It is otherwise nonexistent.
239
240 Also there may be binding levels that catch cleanups that must be
241 run when exceptions occur. Thus, to see whether a name is bound in
242 the current scope, it is not enough to look in the
243 CURRENT_BINDING_LEVEL. You should use lookup_name_current_level
244 instead. */
245
d1b38208 246struct GTY(()) cp_binding_level {
2c140474
DN
247 /* A chain of _DECL nodes for all variables, constants, functions,
248 and typedef types. These are in the reverse of the order
249 supplied. There may be OVERLOADs on this list, too, but they
250 are wrapped in TREE_LISTs; the TREE_VALUE is the OVERLOAD. */
251 tree names;
252
3c9feefc
NS
253 /* Using directives. */
254 vec<tree, va_gc> *using_directives;
2c140474
DN
255
256 /* For the binding level corresponding to a class, the entities
257 declared in the class or its base classes. */
9771b263 258 vec<cp_class_binding, va_gc> *class_shadowed;
2c140474
DN
259
260 /* Similar to class_shadowed, but for IDENTIFIER_TYPE_VALUE, and
261 is used for all binding levels. The TREE_PURPOSE is the name of
262 the entity, the TREE_TYPE is the associated type. In addition
263 the TREE_VALUE is the IDENTIFIER_TYPE_VALUE before we entered
264 the class. */
265 tree type_shadowed;
266
2c140474
DN
267 /* For each level (except not the global one),
268 a chain of BLOCK nodes for all the levels
269 that were entered and exited one level down. */
270 tree blocks;
271
272 /* The entity (namespace, class, function) the scope of which this
273 binding contour corresponds to. Otherwise NULL. */
274 tree this_entity;
275
276 /* The binding level which this one is contained in (inherits from). */
277 cp_binding_level *level_chain;
278
2c140474
DN
279 /* STATEMENT_LIST for statements in this binding contour.
280 Only used at present for SK_CLEANUP temporary bindings. */
281 tree statement_list;
282
283 /* Binding depth at which this level began. */
284 int binding_depth;
285
286 /* The kind of scope that this object represents. However, a
287 SK_TEMPLATE_SPEC scope is represented with KIND set to
288 SK_TEMPLATE_PARMS and EXPLICIT_SPEC_P set to true. */
289 ENUM_BITFIELD (scope_kind) kind : 4;
290
291 /* True if this scope is an SK_TEMPLATE_SPEC scope. This field is
292 only valid if KIND == SK_TEMPLATE_PARMS. */
293 BOOL_BITFIELD explicit_spec_p : 1;
294
c2498268 295 /* True means make a BLOCK for this level regardless of all else. */
2c140474
DN
296 unsigned keep : 1;
297
298 /* Nonzero if this level can safely have additional
c2498268 299 cleanup-needing variables added to it. */
2c140474
DN
300 unsigned more_cleanups_ok : 1;
301 unsigned have_cleanups : 1;
302
5294e4c3
AB
303 /* Transient state set if this scope is of sk_class kind
304 and is in the process of defining 'this_entity'. Reset
305 on leaving the class definition to allow for the scope
306 to be subsequently re-used as a non-defining scope for
307 'this_entity'. */
308 unsigned defining_class_p : 1;
309
1de6612d 310 /* True for SK_FUNCTION_PARMS of a requires-expression. */
c2498268 311 unsigned requires_expression : 1;
1de6612d 312
c2498268
JJ
313 /* True for artificial blocks which should be ignored when finding
314 parent scope. */
315 unsigned artificial : 1;
316
317 /* 21 bits left to fill a 32-bit word. */
2c140474 318};
1ec57cf0
GDR
319
320/* The binding level currently in effect. */
321
322#define current_binding_level \
da7d88bf 323 (*(cfun && cp_function_chain && cp_function_chain->bindings \
1ec57cf0
GDR
324 ? &cp_function_chain->bindings \
325 : &scope_chain->bindings))
326
327/* The binding level of the current class, if any. */
328
329#define class_binding_level scope_chain->class_bindings
330
5f52c0e0
GDR
331/* True if SCOPE designates the global scope binding contour. */
332#define global_scope_p(SCOPE) \
333 ((SCOPE) == NAMESPACE_LEVEL (global_namespace))
aed81407 334
2c140474 335extern cp_binding_level *leave_scope (void);
00e8de68 336extern bool kept_level_p (void);
c99c0026 337extern bool global_bindings_p (void);
056a17ee 338extern bool toplevel_bindings_p (void);
00e8de68 339extern bool namespace_bindings_p (void);
fdf03377 340extern bool local_bindings_p (void);
00e8de68
GDR
341extern bool template_parm_scope_p (void);
342extern scope_kind innermost_scope_kind (void);
2c140474 343extern cp_binding_level *begin_scope (scope_kind, tree);
00e8de68 344extern void print_binding_stack (void);
00e8de68
GDR
345extern void pop_everything (void);
346extern void keep_next_level (bool);
056a17ee 347extern bool is_ancestor (tree ancestor, tree descendant);
322763f5
NS
348extern bool is_nested_namespace (tree parent, tree descendant,
349 bool inline_only = false);
4514aa8c 350extern tree push_scope (tree);
5a167978 351extern void pop_scope (tree);
87c465f5
KL
352extern tree push_inner_scope (tree);
353extern void pop_inner_scope (tree, tree);
2c140474 354extern void push_binding_level (cp_binding_level *);
00e8de68 355\f
65567efa 356extern bool handle_namespace_attrs (tree, tree);
00e8de68
GDR
357extern void pushlevel_class (void);
358extern void poplevel_class (void);
0c5f6bbf
NS
359
360/* What kind of scopes name lookup looks in. An enum class so we
361 don't accidentally mix integers. */
362enum class LOOK_where
363{
364 BLOCK = 1 << 0, /* Consider block scopes. */
365 CLASS = 1 << 1, /* Consider class scopes. */
366 NAMESPACE = 1 << 2, /* Consider namespace scopes. */
367
368 ALL = BLOCK | CLASS | NAMESPACE,
369 BLOCK_NAMESPACE = BLOCK | NAMESPACE,
370 CLASS_NAMESPACE = CLASS | NAMESPACE,
371};
372constexpr LOOK_where operator| (LOOK_where a, LOOK_where b)
373{
374 return LOOK_where (unsigned (a) | unsigned (b));
375}
4c58a32f 376constexpr LOOK_where operator& (LOOK_where a, LOOK_where b)
0c5f6bbf 377{
4c58a32f 378 return LOOK_where (unsigned (a) & unsigned (b));
0c5f6bbf
NS
379}
380
4c58a32f
NS
381enum class LOOK_want
382{
383 NORMAL = 0, /* Normal lookup -- non-types can hide implicit types. */
384 TYPE = 1 << 1, /* We only want TYPE_DECLS. */
385 NAMESPACE = 1 << 2, /* We only want NAMESPACE_DECLS. */
0c5f6bbf 386
db1c2a89
NS
387 HIDDEN_FRIEND = 1 << 3, /* See hidden friends. */
388 HIDDEN_LAMBDA = 1 << 4, /* See lambda-ignored entities. */
389
4c58a32f
NS
390 TYPE_NAMESPACE = TYPE | NAMESPACE, /* Either NAMESPACE or TYPE. */
391};
392constexpr LOOK_want operator| (LOOK_want a, LOOK_want b)
393{
394 return LOOK_want (unsigned (a) | unsigned (b));
395}
396constexpr LOOK_want operator& (LOOK_want a, LOOK_want b)
397{
398 return LOOK_want (unsigned (a) & unsigned (b));
399}
0c5f6bbf 400
f00008b4
NS
401extern tree lookup_name (tree, LOOK_where, LOOK_want = LOOK_want::NORMAL);
402/* Also declared in c-family/c-common.h. */
403extern tree lookup_name (tree name);
404inline tree lookup_name (tree name, LOOK_want want)
405{
406 return lookup_name (name, LOOK_where::ALL, want);
407}
408
00aaae03
NS
409enum class TAG_how
410{
411 CURRENT_ONLY = 0, // Look and insert only in current scope
412
413 GLOBAL = 1, // Unqualified lookup, innermost-non-class insertion
414
415 INNERMOST_NON_CLASS = 2, // Look and insert only into
416 // innermost-non-class
417
418 HIDDEN_FRIEND = 3, // As INNERMOST_NON_CLASS, but hide it
419};
420
421extern tree lookup_elaborated_type (tree, TAG_how);
06aa5490 422extern tree get_namespace_binding (tree ns, tree id);
87e3d7cf
NS
423extern void set_global_binding (tree decl);
424inline tree get_global_binding (tree id)
425{
426 return get_namespace_binding (NULL_TREE, id);
427}
4c58a32f
NS
428extern tree lookup_qualified_name (tree scope, tree name,
429 LOOK_want = LOOK_want::NORMAL,
db1c2a89 430 bool = true);
4c58a32f
NS
431extern tree lookup_qualified_name (tree scope, const char *name,
432 LOOK_want = LOOK_want::NORMAL,
db1c2a89 433 bool = true);
00e8de68 434extern bool pushdecl_class_level (tree);
c74e6f7c 435extern tree pushdecl_namespace_level (tree, bool hiding = false);
00e8de68 436extern bool push_class_level_binding (tree, tree);
9c82d7b6 437extern tree get_local_decls ();
67e18edb 438extern int function_parm_depth (void);
00e8de68 439extern tree cp_namespace_decls (tree);
5a167978 440extern void set_decl_namespace (tree, tree, bool);
5a167978
GDR
441extern void push_decl_namespace (tree);
442extern void pop_decl_namespace (void);
443extern void do_namespace_alias (tree, tree);
1d786913 444extern tree do_class_using_decl (tree, tree);
f35a733d 445extern tree lookup_arg_dependent (tree, tree, vec<tree, va_gc> *);
35129fd3 446extern tree search_anon_aggr (tree, tree, bool = false);
9a54a0d9
NS
447extern tree get_class_binding_direct (tree, tree, bool want_type = false);
448extern tree get_class_binding (tree, tree, bool want_type = false);
10b5c982
NS
449extern tree *find_member_slot (tree klass, tree name);
450extern tree *add_member_slot (tree klass, tree name);
783dc739 451extern void resort_type_member_vec (void *, void *,
fe920c2d 452 gt_pointer_operator, void *);
79c1b9fb 453extern vec<tree, va_gc> *set_class_bindings (tree, int extra = 0);
41970ff1 454extern void insert_late_enum_def_bindings (tree, tree);
90ea9897 455extern tree innermost_non_namespace_value (tree);
28db36e2 456extern bool decl_in_scope_p (tree);
90ea9897 457extern cxx_binding *outer_binding (tree, cxx_binding *, bool);
98ed9dae 458extern void cp_emit_debug_info_for_using (tree, tree);
c003e212 459
692af872
NS
460extern void finish_nonmember_using_decl (tree scope, tree name);
461extern void finish_using_directive (tree target, tree attribs);
1c7bec8b 462void push_local_extern_decl_alias (tree decl);
c74e6f7c 463extern tree pushdecl (tree, bool hiding = false);
5256a7f5 464extern tree pushdecl_outermost_localscope (tree);
c74e6f7c 465extern tree pushdecl_top_level (tree);
2e3757e7 466extern tree pushdecl_top_level_and_finish (tree, tree);
00aaae03 467extern tree pushtag (tree, tree, TAG_how = TAG_how::CURRENT_ONLY);
3a77e7cc 468extern int push_namespace (tree, bool make_inline = false);
056a17ee
NS
469extern void pop_namespace (void);
470extern void push_nested_namespace (tree);
471extern void pop_nested_namespace (tree);
472extern void push_to_top_level (void);
473extern void pop_from_top_level (void);
07c52d1e
JM
474extern bool maybe_push_to_top_level (tree);
475extern void maybe_pop_from_top_level (bool);
d89b00c0 476extern void push_using_decl_bindings (tree, tree);
641da50a 477
c0979d8f 478/* Lower level interface for modules. */
a92ed39c 479extern tree *mergeable_namespace_slots (tree ns, tree name, bool is_attached,
37b242a3 480 tree *mvec);
c0979d8f 481extern void add_mergeable_namespace_entity (tree *slot, tree decl);
37b242a3
NS
482extern tree lookup_class_binding (tree ctx, tree name);
483extern bool import_module_binding (tree ctx, tree name, unsigned mod,
484 unsigned snum);
485extern bool set_module_binding (tree ctx, tree name, unsigned mod,
486 int mod_glob_flag,
487 tree value, tree type, tree visible);
0c27fe96 488extern void add_module_namespace_decl (tree ns, tree decl);
37b242a3
NS
489
490enum WMB_Flags
491{
492 WMB_None = 0,
493 WMB_Dups = 1 << 0,
494 WMB_Export = 1 << 1,
495 WMB_Using = 1 << 2,
496 WMB_Hidden = 1 << 3,
497};
498
499extern unsigned walk_module_binding (tree binding, bitmap partitions,
500 bool (*)(tree decl, WMB_Flags, void *data),
501 void *data);
8c4f0c0c
NS
502extern tree add_imported_namespace (tree ctx, tree name, location_t,
503 unsigned module,
504 bool inline_p, bool visible_p);
37b242a3 505extern const char *get_cxx_dialect_name (enum cxx_dialect dialect);
c0979d8f 506
aed81407 507#endif /* GCC_CP_NAME_LOOKUP_H */