[C++ PATCH] namespace using directives
authorNathan Sidwell <nathan@acm.org>
Mon, 20 May 2019 12:46:54 +0000 (12:46 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Mon, 20 May 2019 12:46:54 +0000 (12:46 +0000)
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

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/name-lookup.c

index c8eb936aec378ea97026ae69f630b63bf6e1a5fa..b9d128434e325031102eb40923181fc069e6dc92 100644 (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
index 2b19bc116e6cd3fbc68fcadec2ca5660c5278b60..0e45ac6081b0978a9e835580eeee440eafb9a007 100644 (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)
index d8d71be98ec2f7776c9d9530759664a10a29e9d5..58f3265352d297f492036cccee5289fb79ae46ff 100644 (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))