On Mon, May 29, 2017 at 11:11:12AM -0400, Nathan Sidwell wrote: > Currently bindings have two slots, a 'value' slot for the regular binding, > and a 'type' slot for the struct name binding, which is only used when the > value slot is holding something else. for instance: > > struct foo {...} foo; > > The value slot will be a VAR_DECL, and the type slot an artificial > TYPE_DECL. > > The type slot is very rarely non-null, because such code use is terribly > confusing. But as the name suggests, it's needed because of the C library's > definition: > > struct stat {...}; > int stat (const char *, struct stat *); > > This patch changes the representation for namespace bindings, so we only use > one slot, and if the stat hack is needed, it contains an OVERLOAD that is > marked with LOOKUP_P (such overloads cannot otherwise appear in a binding). > In that case the TYPE holds the TYPE_DECL and the FUNCTION holds the value > binding. > > This patch doesn't change the use of cxx_binding, so the underlying accessor > find_namespace_slot simply returns the address of the value field. (The > next patch will remove cxx_binding for namespaces.) > > nathan > > -- > Nathan Sidwell
> 2017-05-29 Nathan Sidwell <nat...@acm.org> > > Stat hack representation > * name-lookup.c (STAT_HACK_P, STAT_TYPE, STAT_DECL, > MAYBE_STAT_DECL, MAYBE_STAT_TYPE): New. > (stat_hack): New. > (find_namespace_binding): Replace with ... > (find_namespace_slot): ... this. > (find_namespace_value): New. > (name_lookup::search_namespace_only, > name_lookup::adl_namespace_only): Adjust. > (update_binding): Add SLOT parameter, adjust. > (check_local_shadow): Use find_namespace_value. > (set_local_extern_decl_linkage): Likewise. > (do_pushdecl): Adjust for namespace slot. > (push_local_binding): Assert not a namespace binding. > (check_for_out_of_scope_variable): Use find_namespace_value. > (set_identifier_type_value_with_scope): Likewise. > (get_namespace_binding): Likewise. > (set_namespace_binding): Delete. > (set_global_binding): Directly update the binding. > (finish_namespace_using_decl): Likewise. > (lookup_type_scope_1): Use find_namespace_slot and update. > (do_push_nested_namespace): Use find_namespace_value. > > Index: name-lookup.c > =================================================================== > --- name-lookup.c (revision 248573) > +++ name-lookup.c (working copy) > @@ -38,6 +38,27 @@ static cp_binding_level *innermost_noncl > static void set_identifier_type_value_with_scope (tree id, tree decl, > cp_binding_level *b); > > +/* Create an overload suitable for recording an artificial TYPE_DECL > + and another decl. We use this machanism to implement the struct > + stat hack within a namespace. It'd be nice to use it everywhere. */ > + > +#define STAT_HACK_P(N) ((N) && TREE_CODE (N) == OVERLOAD && OVL_LOOKUP_P (N)) > +#define STAT_TYPE(N) TREE_TYPE (N) > +#define STAT_DECL(N) OVL_FUNCTION (N) > +#define MAYBE_STAT_DECL(N) (STAT_HACK_P (N) ? STAT_DECL (N) : N) > +#define MAYBE_STAT_TYPE(N) (STAT_HACK_P (N) ? STAT_TYPE (N) : NULL_TREE) > + > +static tree stat_hack (tree decl = NULL_TREE, tree type = NULL_TREE) Should be static tree stat_hack (tree decl = NULL_TREE, tree type = NULL_TREE) to make it easier to grep for the function with ^stat_hack. (Didn't check the rest of the patch.) Marek