00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef GCC_CP_NAME_LOOKUP_H
00023 #define GCC_CP_NAME_LOOKUP_H
00024
00025 #include "c-common.h"
00026
00027
00028
00029 typedef struct binding_table_s *binding_table;
00030 typedef struct binding_entry_s *binding_entry;
00031
00032
00033 typedef void (*bt_foreach_proc) (binding_entry, void *);
00034
00035 struct binding_entry_s GTY(())
00036 {
00037 binding_entry chain;
00038 tree name;
00039 tree type;
00040 };
00041
00042
00043 #define SCOPE_DEFAULT_HT_SIZE (1 << 3)
00044 #define CLASS_SCOPE_HT_SIZE (1 << 3)
00045 #define NAMESPACE_ORDINARY_HT_SIZE (1 << 5)
00046 #define NAMESPACE_STD_HT_SIZE (1 << 8)
00047 #define GLOBAL_SCOPE_HT_SIZE (1 << 8)
00048
00049 extern void binding_table_foreach (binding_table, bt_foreach_proc, void *);
00050 extern binding_entry binding_table_find (binding_table, tree);
00051
00052
00053
00054 typedef struct cxx_binding cxx_binding;
00055
00056
00057 typedef struct cp_binding_level cxx_scope;
00058
00059
00060
00061 #define LOCAL_BINDING_P(NODE) ((NODE)->is_local)
00062
00063
00064
00065 #define INHERITED_VALUE_BINDING_P(NODE) ((NODE)->value_is_inherited)
00066
00067 struct cxx_binding GTY(())
00068 {
00069
00070 cxx_binding *previous;
00071
00072 tree value;
00073
00074 tree type;
00075
00076 cxx_scope *scope;
00077 unsigned value_is_inherited : 1;
00078 unsigned is_local : 1;
00079 };
00080
00081
00082
00083 typedef struct cxx_saved_binding GTY(())
00084 {
00085
00086 tree identifier;
00087
00088 cxx_binding *binding;
00089 tree real_type_value;
00090 } cxx_saved_binding;
00091
00092 DEF_VEC_GC_O(cxx_saved_binding);
00093
00094 extern tree identifier_type_value (tree);
00095 extern void set_identifier_type_value (tree, tree);
00096 extern void pop_binding (tree, tree);
00097 extern tree constructor_name (tree);
00098 extern bool constructor_name_p (tree, tree);
00099
00100
00101 typedef enum scope_kind {
00102 sk_block = 0,
00103
00104
00105
00106
00107 sk_cleanup,
00108
00109
00110 sk_try,
00111 sk_catch,
00112 sk_for,
00113
00114 sk_function_parms,
00115 sk_class,
00116 sk_namespace,
00117
00118 sk_template_parms,
00119 sk_template_spec
00120
00121
00122
00123 } scope_kind;
00124
00125
00126 typedef enum tag_scope {
00127 ts_current = 0,
00128
00129
00130
00131
00132 ts_global = 1,
00133
00134
00135 ts_within_enclosing_non_class = 2
00136
00137
00138
00139 } tag_scope;
00140
00141 typedef struct cp_class_binding GTY(())
00142 {
00143 cxx_binding base;
00144
00145 tree identifier;
00146 } cp_class_binding;
00147
00148 DEF_VEC_GC_O(cp_class_binding);
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174 struct cp_binding_level GTY(())
00175 {
00176
00177
00178
00179
00180 tree names;
00181
00182
00183 size_t names_size;
00184
00185
00186 tree namespaces;
00187
00188
00189 varray_type static_decls;
00190
00191
00192 tree vtables;
00193
00194
00195 tree usings;
00196
00197
00198
00199 tree using_directives;
00200
00201
00202
00203 VEC(cp_class_binding) *class_shadowed;
00204
00205
00206
00207
00208
00209
00210 tree type_shadowed;
00211
00212
00213
00214
00215 tree shadowed_labels;
00216
00217
00218
00219
00220 tree blocks;
00221
00222
00223
00224 tree this_entity;
00225
00226
00227 struct cp_binding_level *level_chain;
00228
00229
00230
00231
00232
00233 tree dead_vars_from_for;
00234
00235
00236
00237 tree statement_list;
00238
00239
00240 int binding_depth;
00241
00242
00243
00244
00245 ENUM_BITFIELD (scope_kind) kind : 4;
00246
00247
00248
00249 BOOL_BITFIELD explicit_spec_p : 1;
00250
00251
00252 unsigned keep : 1;
00253
00254
00255
00256 unsigned more_cleanups_ok : 1;
00257 unsigned have_cleanups : 1;
00258
00259
00260 };
00261
00262
00263
00264 #define current_binding_level \
00265 (*(cfun && cp_function_chain->bindings \
00266 ? &cp_function_chain->bindings \
00267 : &scope_chain->bindings))
00268
00269
00270
00271 #define class_binding_level scope_chain->class_bindings
00272
00273
00274 extern GTY(()) tree global_namespace;
00275 extern GTY(()) tree global_scope_name;
00276
00277
00278
00279
00280 extern GTY(()) tree global_type_node;
00281
00282
00283 #define global_scope_p(SCOPE) \
00284 ((SCOPE) == NAMESPACE_LEVEL (global_namespace))
00285
00286 extern cxx_scope *leave_scope (void);
00287 extern bool kept_level_p (void);
00288 extern int global_bindings_p (void);
00289 extern bool toplevel_bindings_p (void);
00290 extern bool namespace_bindings_p (void);
00291 extern bool template_parm_scope_p (void);
00292 extern scope_kind innermost_scope_kind (void);
00293 extern cxx_scope *begin_scope (scope_kind, tree);
00294 extern void print_binding_stack (void);
00295 extern void push_to_top_level (void);
00296 extern void pop_from_top_level (void);
00297 extern void pop_everything (void);
00298 extern void keep_next_level (bool);
00299 extern bool is_ancestor (tree, tree);
00300 extern tree push_scope (tree);
00301 extern void pop_scope (tree);
00302 extern tree push_inner_scope (tree);
00303 extern void pop_inner_scope (tree, tree);
00304 extern void push_binding_level (struct cp_binding_level *);
00305
00306 extern void push_namespace (tree);
00307 extern void pop_namespace (void);
00308 extern void push_nested_namespace (tree);
00309 extern void pop_nested_namespace (tree);
00310 extern void pushlevel_class (void);
00311 extern void poplevel_class (void);
00312 extern tree pushdecl_with_scope (tree, cxx_scope *);
00313 extern tree lookup_name (tree, int);
00314 extern tree lookup_name_real (tree, int, int, bool, int, int);
00315 extern tree lookup_type_scope (tree, tag_scope);
00316 extern tree namespace_binding (tree, tree);
00317 extern void set_namespace_binding (tree, tree, tree);
00318 extern bool hidden_name_p (tree);
00319 extern tree lookup_namespace_name (tree, tree);
00320 extern tree lookup_qualified_name (tree, tree, bool, bool);
00321 extern tree lookup_name_nonclass (tree);
00322 extern tree lookup_function_nonclass (tree, tree, bool);
00323 extern void push_local_binding (tree, tree, int);
00324 extern bool pushdecl_class_level (tree);
00325 extern tree pushdecl_namespace_level (tree);
00326 extern bool push_class_level_binding (tree, tree);
00327 extern tree getdecls (void);
00328 extern tree cp_namespace_decls (tree);
00329 extern void set_decl_namespace (tree, tree, bool);
00330 extern void push_decl_namespace (tree);
00331 extern void pop_decl_namespace (void);
00332 extern void do_namespace_alias (tree, tree);
00333 extern void do_toplevel_using_decl (tree, tree, tree);
00334 extern void do_local_using_decl (tree, tree, tree);
00335 extern tree do_class_using_decl (tree, tree);
00336 extern void do_using_directive (tree);
00337 extern tree lookup_arg_dependent (tree, tree, tree);
00338 extern bool is_associated_namespace (tree, tree);
00339 extern void parse_using_directive (tree, tree);
00340 extern tree innermost_non_namespace_value (tree);
00341 extern cxx_binding *outer_binding (tree, cxx_binding *, bool);
00342
00343
00344
00345
00346 static inline bool
00347 get_global_value_if_present (tree id, tree *decl)
00348 {
00349 tree global_value = namespace_binding (id, global_namespace);
00350 if (global_value)
00351 *decl = global_value;
00352 return global_value != NULL;
00353 }
00354
00355
00356
00357 static inline bool
00358 is_typename_at_global_scope (tree id)
00359 {
00360 tree global_value = namespace_binding (id, global_namespace);
00361
00362 return global_value && TREE_CODE (global_value) == TYPE_DECL;
00363 }
00364
00365 #endif