[C++ PATCH] namespace using directives

https://gcc.gnu.org/ml/gcc-patches/2019-05/msg01245.html
	* cp-tree.h (struct lang_decl_ns): Remove usings field.
	(DECL_NAMESPACE_USING): Delete.
	* name-lookup.c (name_lookup::search_usings): Use namespace's
	binding scope.
	(name_lookup::queue_namespae): Likewise.
	(finish_namespace_using_directive, push_namespace): Likewise.
	(has_using_namespace_std_directive): Just search the entire
	binding stack.

From-SVN: r271416
This commit is contained in:
Nathan Sidwell 2019-05-20 12:46:54 +00:00 committed by Nathan Sidwell
parent ab904df5f9
commit 0841bc1563
3 changed files with 17 additions and 22 deletions

View file

@ -1,3 +1,14 @@
2019-05-20 Nathan Sidwell <nathan@acm.org>
* cp-tree.h (struct lang_decl_ns): Remove usings field.
(DECL_NAMESPACE_USING): Delete.
* name-lookup.c (name_lookup::search_usings): Use namespace's
binding scope.
(name_lookup::queue_namespae): Likewise.
(finish_namespace_using_directive, push_namespace): Likewise.
(has_using_namespace_std_directive): Just search the entire
binding stack.
2019-05-20 Jonathan Wakely <jwakely@redhat.com>
PR c++/90532 Ensure __is_constructible(T[]) is false

View file

@ -2668,9 +2668,7 @@ struct GTY(()) lang_decl_ns {
struct lang_decl_base base;
cp_binding_level *level;
/* using directives and inline children. These need to be va_gc,
because of PCH. */
vec<tree, va_gc> *usings;
/* Inline children. These need to be va_gc, because of PCH. */
vec<tree, va_gc> *inlinees;
/* Hash table of bound decls. It'd be nice to have this inline, but
@ -3259,10 +3257,6 @@ struct GTY(()) lang_decl {
#define DECL_NAMESPACE_INLINE_P(NODE) \
TREE_LANG_FLAG_0 (NAMESPACE_DECL_CHECK (NODE))
/* In a NAMESPACE_DECL, a vector of using directives. */
#define DECL_NAMESPACE_USING(NODE) \
(LANG_DECL_NS_CHECK (NODE)->usings)
/* In a NAMESPACE_DECL, a vector of inline namespaces. */
#define DECL_NAMESPACE_INLINEES(NODE) \
(LANG_DECL_NS_CHECK (NODE)->inlinees)

View file

@ -589,7 +589,7 @@ name_lookup::search_usings (tree scope)
return true;
bool found = false;
if (vec<tree, va_gc> *usings = DECL_NAMESPACE_USING (scope))
if (vec<tree, va_gc> *usings = NAMESPACE_LEVEL (scope)->using_directives)
for (unsigned ix = usings->length (); ix--;)
found |= search_qualified ((*usings)[ix], true);
@ -651,7 +651,7 @@ name_lookup::queue_namespace (using_queue *queue, int depth, tree scope)
queue = queue_namespace (queue, depth, (*inlinees)[ix]);
/* Queue its using targets. */
queue = queue_usings (queue, depth, DECL_NAMESPACE_USING (scope));
queue = queue_usings (queue, depth, NAMESPACE_LEVEL (scope)->using_directives);
return queue;
}
@ -5272,21 +5272,11 @@ has_using_namespace_std_directive_p ()
{
/* Look at local using-directives. */
for (cp_binding_level *level = current_binding_level;
level->kind != sk_namespace;
level;
level = level->level_chain)
if (using_directives_contain_std_p (level->using_directives))
return true;
/* Look at this namespace and its ancestors. */
for (tree scope = current_namespace; scope; scope = CP_DECL_CONTEXT (scope))
{
if (using_directives_contain_std_p (DECL_NAMESPACE_USING (scope)))
return true;
if (scope == global_namespace)
break;
}
return false;
}
@ -7253,7 +7243,7 @@ finish_namespace_using_directive (tree target, tree attribs)
if (target == error_mark_node)
return;
add_using_namespace (DECL_NAMESPACE_USING (current_namespace),
add_using_namespace (current_binding_level->using_directives,
ORIGINAL_NAMESPACE (target));
emit_debug_info_using_namespace (current_namespace,
ORIGINAL_NAMESPACE (target), false);
@ -7404,7 +7394,7 @@ push_namespace (tree name, bool make_inline)
SET_DECL_ASSEMBLER_NAME (ns, anon_identifier);
if (!make_inline)
add_using_namespace (DECL_NAMESPACE_USING (current_namespace),
add_using_namespace (current_binding_level->using_directives,
ns);
}
else if (TREE_PUBLIC (current_namespace))