aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2006-01-12 15:10:47 -0500
committerJason Merrill <jason@gcc.gnu.org>2006-01-12 15:10:47 -0500
commit664a90c055c8f86cccd5556f48c74e94a6b7cc05 (patch)
tree57f736eaf87402c6f247f68dfae3575e795014ea
parentedf8dc34ff317170ae61310ef64155723f775fbc (diff)
downloadgcc-664a90c055c8f86cccd5556f48c74e94a6b7cc05.zip
gcc-664a90c055c8f86cccd5556f48c74e94a6b7cc05.tar.gz
gcc-664a90c055c8f86cccd5556f48c74e94a6b7cc05.tar.bz2
re PR libstdc++/24660 (versioning weak symbols in libstdc++)
PR libstdc++/24660 * pt.c (check_explicit_specialization): Handle namespace association. * name-lookup.c (set_decl_namespace): Likewise. From-SVN: r109647
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/name-lookup.c13
-rw-r--r--gcc/cp/pt.c9
-rw-r--r--gcc/doc/extend.texi16
4 files changed, 33 insertions, 12 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 62bb3aa..458c3c7 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2006-01-12 Jason Merrill <jason@redhat.com>
+
+ PR libstdc++/24660
+ * pt.c (check_explicit_specialization): Handle namespace
+ association.
+ * name-lookup.c (set_decl_namespace): Likewise.
+
2006-01-12 Nathan Sidwell <nathan@codesourcery.com>
PR c++/24824
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index ec662e6..96ce4a7 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -2844,7 +2844,7 @@ set_namespace_binding (tree name, tree scope, tree val)
void
set_decl_namespace (tree decl, tree scope, bool friendp)
{
- tree old;
+ tree old, fn;
/* Get rid of namespace aliases. */
scope = ORIGINAL_NAMESPACE (scope);
@@ -2865,13 +2865,10 @@ set_decl_namespace (tree decl, tree scope, bool friendp)
}
/* See whether this has been declared in the namespace. */
- old = namespace_binding (DECL_NAME (decl), scope);
+ old = lookup_qualified_name (scope, DECL_NAME (decl), false, true);
if (!old)
/* No old declaration at all. */
goto complain;
- /* A template can be explicitly specialized in any namespace. */
- if (processing_explicit_instantiation)
- return;
if (!is_overloaded_fn (decl))
/* Don't compare non-function decls with decls_match here, since
it can't check for the correct constness at this
@@ -2880,6 +2877,12 @@ set_decl_namespace (tree decl, tree scope, bool friendp)
/* Since decl is a function, old should contain a function decl. */
if (!is_overloaded_fn (old))
goto complain;
+ fn = OVL_CURRENT (old);
+ if (!is_associated_namespace (scope, DECL_CONTEXT (fn)))
+ goto complain;
+ /* A template can be explicitly specialized in any namespace. */
+ if (processing_explicit_instantiation)
+ return;
if (processing_template_decl || processing_specialization)
/* We have not yet called push_template_decl to turn a
FUNCTION_DECL into a TEMPLATE_DECL, so the declarations won't
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 5b025ce..3afe45d 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -1901,12 +1901,19 @@ check_explicit_specialization (tree declarator,
/* Find the namespace binding, using the declaration
context. */
- fns = namespace_binding (dname, CP_DECL_CONTEXT (decl));
+ fns = lookup_qualified_name (current_namespace, dname,
+ false, true);
if (!fns || !is_overloaded_fn (fns))
{
error ("%qD is not a template function", dname);
fns = error_mark_node;
}
+ else
+ {
+ tree fn = OVL_CURRENT (fns);
+ if (!is_associated_namespace (current_namespace, DECL_CONTEXT (fn)))
+ error ("%qD is not declared in %qD", decl, current_namespace);
+ }
}
declarator = lookup_template_function (fns, NULL_TREE);
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
index 0d54654..0c2f39c 100644
--- a/gcc/doc/extend.texi
+++ b/gcc/doc/extend.texi
@@ -9864,7 +9864,7 @@ Predefined Macros,cpp,The GNU C Preprocessor}).
* Bound member functions:: You can extract a function pointer to the
method denoted by a @samp{->*} or @samp{.*} expression.
* C++ Attributes:: Variable, function, and type attributes for C++ only.
-* Strong Using:: Strong using-directives for namespace composition.
+* Namespace Association:: Strong using-directives for namespace association.
* Java Exceptions:: Tweaking exception handling to work with Java.
* Deprecated Features:: Things will disappear from g++.
* Backwards Compatibility:: Compatibilities with earlier definitions of C++.
@@ -10402,22 +10402,23 @@ interface table mechanism, instead of regular virtual table dispatch.
@end table
-See also @xref{Strong Using}.
+See also @xref{Namespace Association}.
-@node Strong Using
-@section Strong Using
+@node Namespace Association
+@section Namespace Association
@strong{Caution:} The semantics of this extension are not fully
defined. Users should refrain from using this extension as its
semantics may change subtly over time. It is possible that this
-extension wil be removed in future versions of G++.
+extension will be removed in future versions of G++.
A using-directive with @code{__attribute ((strong))} is stronger
than a normal using-directive in two ways:
@itemize @bullet
@item
-Templates from the used namespace can be specialized as though they were members of the using namespace.
+Templates from the used namespace can be specialized and explicitly
+instantiated as though they were members of the using namespace.
@item
The using namespace is considered an associated namespace of all
@@ -10425,6 +10426,9 @@ templates in the used namespace for purposes of argument-dependent
name lookup.
@end itemize
+The used namespace must be nested within the using namespace so that
+normal unqualified lookup works properly.
+
This is useful for composing a namespace transparently from
implementation namespaces. For example: