LCOV - code coverage report
Current view: top level - gcc/cp - name-lookup.h (source / functions) Hit Total Coverage
Test: gcc.info Lines: 18 19 94.7 %
Date: 2023-07-19 08:18:47 Functions: 3 3 100.0 %

          Line data    Source code
       1             : /* Declarations for -*- C++ -*- name lookup routines.
       2             :    Copyright (C) 2003-2023 Free Software Foundation, Inc.
       3             :    Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
       4             : 
       5             : This file is part of GCC.
       6             : 
       7             : GCC is free software; you can redistribute it and/or modify
       8             : it under the terms of the GNU General Public License as published by
       9             : the Free Software Foundation; either version 3, or (at your option)
      10             : any later version.
      11             : 
      12             : GCC is distributed in the hope that it will be useful,
      13             : but WITHOUT ANY WARRANTY; without even the implied warranty of
      14             : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      15             : GNU General Public License for more details.
      16             : 
      17             : You should have received a copy of the GNU General Public License
      18             : along with GCC; see the file COPYING3.  If not see
      19             : <http://www.gnu.org/licenses/>.  */
      20             : 
      21             : #ifndef GCC_CP_NAME_LOOKUP_H
      22             : #define GCC_CP_NAME_LOOKUP_H
      23             : 
      24             : #include "c-family/c-common.h"
      25             : 
      26             : 
      27             : /* The datatype used to implement C++ scope.  */
      28             : struct cp_binding_level;
      29             : 
      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             : 
      34             : /* True if NODE->value is from a base class of the class which is
      35             :    currently being defined.  */
      36             : #define INHERITED_VALUE_BINDING_P(NODE) ((NODE)->value_is_inherited)
      37             : 
      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             : 
      44             : /* Datatype that represents binding established by a declaration between
      45             :    a name and a C++ entity.  */
      46             : struct GTY(()) cxx_binding {
      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;
      53             :   /* The scope at which this binding was made.  */
      54             :   cp_binding_level *scope;
      55             : 
      56             :   bool value_is_inherited : 1;
      57             :   bool is_local : 1;
      58             :   bool type_is_hidden : 1;
      59             : };
      60             : 
      61             : /* Datatype used to temporarily save C++ bindings (for implicit
      62             :    instantiations purposes and like).  Implemented in decl.cc.  */
      63             : struct GTY(()) cxx_saved_binding {
      64             :   /* The name of the current binding.  */
      65             :   tree identifier;
      66             :   /* The binding we're saving.  */
      67             :   cxx_binding *binding;
      68             :   tree real_type_value;
      69             : };
      70             : 
      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             : 
      77             : struct GTY(()) binding_slot {
      78             :   union GTY((desc ("%1.is_lazy ()"))) binding_slot_lazy {
      79             :     tree GTY((tag ("false"))) binding;
      80             :   } u;
      81             : 
      82     2172414 :   operator tree & ()
      83             :   {
      84           0 :     gcc_checking_assert (!is_lazy ());
      85     2172414 :     return u.binding;
      86             :   }
      87     2428525 :   binding_slot &operator= (tree t)
      88             :   {
      89     2428525 :     u.binding = t;
      90     2428525 :     return *this;
      91             :   }
      92     7076076 :   bool is_lazy () const
      93             :   {
      94     7059186 :     return bool (uintptr_t (u.binding) & 1);
      95             :   }
      96     1667003 :   void set_lazy (unsigned snum)
      97             :   {
      98     1667003 :     gcc_checking_assert (!u.binding);
      99     1667003 :     u.binding = tree (uintptr_t ((snum << 1) | 1));
     100     1667003 :   }
     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       16890 :   unsigned get_lazy () const
     107             :   {
     108       16890 :     gcc_checking_assert (is_lazy ());
     109       16890 :     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
     122             : struct binding_index {
     123             :   unsigned short base;
     124             :   unsigned short span;
     125             : };
     126             : 
     127             : struct 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             : 
     145             : struct 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             : 
     180             : extern void set_identifier_type_value (tree, tree);
     181             : extern void push_binding (tree, tree, cp_binding_level*);
     182             : extern void pop_local_binding (tree, tree);
     183             : extern void pop_bindings_and_leave_scope (void);
     184             : extern tree constructor_name (tree);
     185             : extern bool constructor_name_p (tree, tree);
     186             : 
     187             : /* The kinds of scopes we recognize.  */
     188             : enum scope_kind {
     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".  */
     194             :   sk_cleanup,        /* A scope for (pseudo-)scope for cleanup.  It is
     195             :                         pseudo in that it is transparent to name lookup
     196             :                         activities.  */
     197             :   sk_try,            /* A try-block.  */
     198             :   sk_catch,          /* A catch-block.  */
     199             :   sk_for,            /* The scope of the variable declared in a
     200             :                         init-statement.  */
     201             :   sk_cond,           /* The scope of the variable declared in the condition
     202             :                         of an if or switch statement.  */
     203             :   sk_stmt_expr,      /* GNU statement expression block.  */
     204             :   sk_function_parms, /* The scope containing function parameters.  */
     205             :   sk_class,          /* The scope containing the members of a class.  */
     206             :   sk_scoped_enum,    /* The scope containing the enumerators of a C++11
     207             :                         scoped enumeration.  */
     208             :   sk_namespace,      /* The scope containing the members of a
     209             :                         namespace, including the global scope.  */
     210             :   sk_template_parms, /* A scope for template parameters.  */
     211             :   sk_template_spec,  /* Like sk_template_parms, but for an explicit
     212             :                         specialization.  Since, by definition, an
     213             :                         explicit specialization is introduced by
     214             :                         "template <>", this scope is always empty.  */
     215             :   sk_transaction,    /* A synchronized or atomic statement.  */
     216             :   sk_omp             /* An OpenMP structured block.  */
     217             : };
     218             : 
     219             : struct GTY(()) cp_class_binding {
     220             :   cxx_binding *base;
     221             :   /* The bound name.  */
     222             :   tree identifier;
     223             : };
     224             : 
     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             : 
     246             : struct GTY(()) cp_binding_level {
     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             : 
     253             :   /* Using directives.  */
     254             :   vec<tree, va_gc> *using_directives;
     255             : 
     256             :   /* For the binding level corresponding to a class, the entities
     257             :       declared in the class or its base classes.  */
     258             :   vec<cp_class_binding, va_gc> *class_shadowed;
     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             : 
     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             : 
     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             : 
     295             :   /* true means make a BLOCK for this level regardless of all else.  */
     296             :   unsigned keep : 1;
     297             : 
     298             :   /* Nonzero if this level can safely have additional
     299             :       cleanup-needing variables added to it.  */
     300             :   unsigned more_cleanups_ok : 1;
     301             :   unsigned have_cleanups : 1;
     302             : 
     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             : 
     310             :   /* True for SK_FUNCTION_PARMS of a requires-expression.  */
     311             :   unsigned requires_expression: 1;
     312             : 
     313             :   /* 22 bits left to fill a 32-bit word.  */
     314             : };
     315             : 
     316             : /* The binding level currently in effect.  */
     317             : 
     318             : #define current_binding_level                   \
     319             :   (*(cfun && cp_function_chain && cp_function_chain->bindings \
     320             :    ? &cp_function_chain->bindings                \
     321             :    : &scope_chain->bindings))
     322             : 
     323             : /* The binding level of the current class, if any.  */
     324             : 
     325             : #define class_binding_level scope_chain->class_bindings
     326             : 
     327             : /* True if SCOPE designates the global scope binding contour.  */
     328             : #define global_scope_p(SCOPE) \
     329             :   ((SCOPE) == NAMESPACE_LEVEL (global_namespace))
     330             : 
     331             : extern cp_binding_level *leave_scope (void);
     332             : extern bool kept_level_p (void);
     333             : extern bool global_bindings_p (void);
     334             : extern bool toplevel_bindings_p (void);
     335             : extern bool namespace_bindings_p (void);
     336             : extern bool local_bindings_p (void);
     337             : extern bool template_parm_scope_p (void);
     338             : extern scope_kind innermost_scope_kind (void);
     339             : extern cp_binding_level *begin_scope (scope_kind, tree);
     340             : extern void print_binding_stack (void);
     341             : extern void pop_everything (void);
     342             : extern void keep_next_level (bool);
     343             : extern bool is_ancestor (tree ancestor, tree descendant);
     344             : extern bool is_nested_namespace (tree parent, tree descendant,
     345             :                                  bool inline_only = false);
     346             : extern tree push_scope (tree);
     347             : extern void pop_scope (tree);
     348             : extern tree push_inner_scope (tree);
     349             : extern void pop_inner_scope (tree, tree);
     350             : extern void push_binding_level (cp_binding_level *);
     351             : 
     352             : extern bool handle_namespace_attrs (tree, tree);
     353             : extern void pushlevel_class (void);
     354             : extern void poplevel_class (void);
     355             : 
     356             : /* What kind of scopes name lookup looks in.  An enum class so we
     357             :    don't accidentally mix integers.  */
     358             : enum class LOOK_where
     359             : {
     360             :   BLOCK = 1 << 0,  /* Consider block scopes.  */ 
     361             :   CLASS = 1 << 1,  /* Consider class scopes.  */ 
     362             :   NAMESPACE = 1 << 2,  /* Consider namespace scopes.  */ 
     363             : 
     364             :   ALL = BLOCK | CLASS | NAMESPACE,
     365             :   BLOCK_NAMESPACE = BLOCK | NAMESPACE,
     366             :   CLASS_NAMESPACE = CLASS | NAMESPACE,
     367             : };
     368             : constexpr LOOK_where operator| (LOOK_where a, LOOK_where b)
     369             : {
     370             :   return LOOK_where (unsigned (a) | unsigned (b));
     371             : }
     372             : constexpr LOOK_where operator& (LOOK_where a, LOOK_where b)
     373             : {
     374             :   return LOOK_where (unsigned (a) & unsigned (b));
     375             : }
     376             : 
     377             : enum class LOOK_want
     378             : {
     379             :   NORMAL = 0,  /* Normal lookup -- non-types can hide implicit types.  */
     380             :   TYPE = 1 << 1,  /* We only want TYPE_DECLS.  */
     381             :   NAMESPACE = 1 << 2,  /* We only want NAMESPACE_DECLS.  */
     382             : 
     383             :   HIDDEN_FRIEND = 1 << 3, /* See hidden friends.  */
     384             :   HIDDEN_LAMBDA = 1 << 4,  /* See lambda-ignored entities.  */
     385             : 
     386             :   TYPE_NAMESPACE = TYPE | NAMESPACE,  /* Either NAMESPACE or TYPE.  */
     387             : };
     388             : constexpr LOOK_want operator| (LOOK_want a, LOOK_want b)
     389             : {
     390             :   return LOOK_want (unsigned (a) | unsigned (b));
     391             : }
     392             : constexpr LOOK_want operator& (LOOK_want a, LOOK_want b)
     393             : {
     394             :   return LOOK_want (unsigned (a) & unsigned (b));
     395             : }
     396             : 
     397             : extern tree lookup_name (tree, LOOK_where, LOOK_want = LOOK_want::NORMAL);
     398             : /* Also declared in c-family/c-common.h.  */
     399             : extern tree lookup_name (tree name);
     400  2450667230 : inline tree lookup_name (tree name, LOOK_want want)
     401             : {
     402  2450667230 :   return lookup_name (name, LOOK_where::ALL, want);
     403             : }
     404             : 
     405             : enum class TAG_how
     406             : {
     407             :   CURRENT_ONLY = 0, // Look and insert only in current scope
     408             : 
     409             :   GLOBAL = 1, // Unqualified lookup, innermost-non-class insertion
     410             : 
     411             :   INNERMOST_NON_CLASS = 2, // Look and insert only into
     412             :                            // innermost-non-class
     413             : 
     414             :   HIDDEN_FRIEND = 3, // As INNERMOST_NON_CLASS, but hide it
     415             : };
     416             : 
     417             : extern tree lookup_elaborated_type (tree, TAG_how);
     418             : extern tree get_namespace_binding (tree ns, tree id);
     419             : extern void set_global_binding (tree decl);
     420     3961445 : inline tree get_global_binding (tree id)
     421             : {
     422     3955415 :   return get_namespace_binding (NULL_TREE, id);
     423             : }
     424             : extern tree lookup_qualified_name (tree scope, tree name,
     425             :                                    LOOK_want = LOOK_want::NORMAL,
     426             :                                    bool = true);
     427             : extern tree lookup_qualified_name (tree scope, const char *name,
     428             :                                    LOOK_want = LOOK_want::NORMAL,
     429             :                                    bool = true);
     430             : extern bool pushdecl_class_level (tree);
     431             : extern tree pushdecl_namespace_level (tree, bool hiding = false);
     432             : extern bool push_class_level_binding (tree, tree);
     433             : extern tree get_local_decls ();
     434             : extern int function_parm_depth (void);
     435             : extern tree cp_namespace_decls (tree);
     436             : extern void set_decl_namespace (tree, tree, bool);
     437             : extern void push_decl_namespace (tree);
     438             : extern void pop_decl_namespace (void);
     439             : extern void do_namespace_alias (tree, tree);
     440             : extern tree do_class_using_decl (tree, tree);
     441             : extern tree lookup_arg_dependent (tree, tree, vec<tree, va_gc> *);
     442             : extern tree search_anon_aggr (tree, tree, bool = false);
     443             : extern tree get_class_binding_direct (tree, tree, bool want_type = false);
     444             : extern tree get_class_binding (tree, tree, bool want_type = false);
     445             : extern tree *find_member_slot (tree klass, tree name);
     446             : extern tree *add_member_slot (tree klass, tree name);
     447             : extern void resort_type_member_vec (void *, void *,
     448             :                                     gt_pointer_operator, void *);
     449             : extern vec<tree, va_gc> *set_class_bindings (tree, int extra = 0);
     450             : extern void insert_late_enum_def_bindings (tree, tree);
     451             : extern tree innermost_non_namespace_value (tree);
     452             : extern bool decl_in_scope_p (tree);
     453             : extern cxx_binding *outer_binding (tree, cxx_binding *, bool);
     454             : extern void cp_emit_debug_info_for_using (tree, tree);
     455             : 
     456             : extern void finish_nonmember_using_decl (tree scope, tree name);
     457             : extern void finish_using_directive (tree target, tree attribs);
     458             : void push_local_extern_decl_alias (tree decl);
     459             : extern tree pushdecl (tree, bool hiding = false);
     460             : extern tree pushdecl_outermost_localscope (tree);
     461             : extern tree pushdecl_top_level (tree);
     462             : extern tree pushdecl_top_level_and_finish (tree, tree);
     463             : extern tree pushtag (tree, tree, TAG_how = TAG_how::CURRENT_ONLY);
     464             : extern int push_namespace (tree, bool make_inline = false);
     465             : extern void pop_namespace (void);
     466             : extern void push_nested_namespace (tree);
     467             : extern void pop_nested_namespace (tree);
     468             : extern void push_to_top_level (void);
     469             : extern void pop_from_top_level (void);
     470             : extern bool maybe_push_to_top_level (tree);
     471             : extern void maybe_pop_from_top_level (bool);
     472             : extern void push_using_decl_bindings (tree, tree);
     473             : 
     474             : /* Lower level interface for modules. */
     475             : extern tree *mergeable_namespace_slots (tree ns, tree name, bool is_attached,
     476             :                                         tree *mvec);
     477             : extern void add_mergeable_namespace_entity (tree *slot, tree decl);
     478             : extern tree lookup_class_binding (tree ctx, tree name);
     479             : extern bool import_module_binding (tree ctx, tree name, unsigned mod,
     480             :                                    unsigned snum);
     481             : extern bool set_module_binding (tree ctx, tree name, unsigned mod,
     482             :                                 int mod_glob_flag,
     483             :                                 tree value, tree type, tree visible);
     484             : extern void add_module_namespace_decl (tree ns, tree decl);
     485             : 
     486             : enum WMB_Flags
     487             : {
     488             :   WMB_None = 0,
     489             :   WMB_Dups = 1 << 0,
     490             :   WMB_Export = 1 << 1,
     491             :   WMB_Using = 1 << 2,
     492             :   WMB_Hidden = 1 << 3,
     493             : };
     494             : 
     495             : extern unsigned walk_module_binding (tree binding, bitmap partitions,
     496             :                                      bool (*)(tree decl, WMB_Flags, void *data),
     497             :                                      void *data);
     498             : extern tree add_imported_namespace (tree ctx, tree name, location_t,
     499             :                                     unsigned module,
     500             :                                     bool inline_p, bool visible_p);
     501             : extern const char *get_cxx_dialect_name (enum cxx_dialect dialect);
     502             : 
     503             : #endif /* GCC_CP_NAME_LOOKUP_H */

Generated by: LCOV version 1.16