summaryrefslogtreecommitdiff
path: root/gcc/cp/decl2.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/cp/decl2.c')
-rw-r--r--gcc/cp/decl2.c32
1 files changed, 11 insertions, 21 deletions
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index 9570bc0393c..fb09e8cdb80 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -3877,9 +3877,14 @@ add_using_namespace (user, used, indirect)
/* Add user to the used's users list. */
DECL_NAMESPACE_USERS (used)
= perm_tree_cons (user, 0, DECL_NAMESPACE_USERS (used));
-
- for (iter = DECL_NAMESPACE_USERS (user); iter; iter = TREE_CHAIN (iter))
+
+ /* Recursively add all namespaces used. */
+ for (iter = DECL_NAMESPACE_USING (used); iter; iter = TREE_CHAIN (iter))
/* indirect usage */
+ add_using_namespace (user, TREE_PURPOSE (iter), 1);
+
+ /* Tell everyone using us about the new used namespaces. */
+ for (iter = DECL_NAMESPACE_USERS (user); iter; iter = TREE_CHAIN (iter))
add_using_namespace (TREE_PURPOSE (iter), used, 1);
}
@@ -4370,25 +4375,10 @@ do_namespace_alias (alias, namespace)
namespace = ORIGINAL_NAMESPACE (namespace);
- binding = binding_for_name (alias, current_namespace);
- old = BINDING_VALUE (binding);
- if (old)
- {
- if (TREE_CODE (old) == NAMESPACE_DECL
- && DECL_NAMESPACE_ALIAS (old) == namespace)
- /* Ok: redeclaration. */
- return;
- cp_error ("invalid namespace alias `%D'", alias);
- cp_error_at ("`%D' previously declared here", old);
- }
- else
- {
- /* Build the alias. */
- alias = build_lang_decl (NAMESPACE_DECL, alias, void_type_node);
- DECL_NAMESPACE_ALIAS (alias) = namespace;
- DECL_CONTEXT (alias) = FROB_CONTEXT (current_namespace);
- BINDING_VALUE (binding) = alias;
- }
+ /* Build the alias. */
+ alias = build_lang_decl (NAMESPACE_DECL, alias, void_type_node);
+ DECL_NAMESPACE_ALIAS (alias) = namespace;
+ pushdecl (alias);
}
/* Check a non-member using-declaration. Return the name and scope