Commit 5668970a by Jason Merrill Committed by Jason Merrill

* name-lookup.c (parse_using_directive): Deprecate strong using.

From-SVN: r244936
parent effdaefe
2017-01-26 Jason Merrill <jason@redhat.com> 2017-01-26 Jason Merrill <jason@redhat.com>
* name-lookup.c (parse_using_directive): Deprecate strong using.
PR c++/79176 - lambda ICE with -flto -Os PR c++/79176 - lambda ICE with -flto -Os
* decl2.c (vague_linkage_p): Handle decloned 'tors. * decl2.c (vague_linkage_p): Handle decloned 'tors.
* tree.c (decl_linkage): Likewise. * tree.c (decl_linkage): Likewise.
......
...@@ -4125,6 +4125,8 @@ parse_using_directive (tree name_space, tree attribs) ...@@ -4125,6 +4125,8 @@ parse_using_directive (tree name_space, tree attribs)
tree name = get_attribute_name (a); tree name = get_attribute_name (a);
if (is_attribute_p ("strong", name)) if (is_attribute_p ("strong", name))
{ {
warning (OPT_Wdeprecated, "strong using is deprecated; use inline "
"namespaces instead");
if (!toplevel_bindings_p ()) if (!toplevel_bindings_p ())
error ("strong using only meaningful at namespace scope"); error ("strong using only meaningful at namespace scope");
else if (name_space != error_mark_node) else if (name_space != error_mark_node)
......
...@@ -21802,7 +21802,6 @@ Predefined Macros,cpp,The GNU C Preprocessor}). ...@@ -21802,7 +21802,6 @@ Predefined Macros,cpp,The GNU C Preprocessor}).
method denoted by a @samp{->*} or @samp{.*} expression. method denoted by a @samp{->*} or @samp{.*} expression.
* C++ Attributes:: Variable, function, and type attributes for C++ only. * C++ Attributes:: Variable, function, and type attributes for C++ only.
* Function Multiversioning:: Declaring multiple function versions. * Function Multiversioning:: Declaring multiple function versions.
* Namespace Association:: Strong using-directives for namespace association.
* Type Traits:: Compiler support for type traits. * Type Traits:: Compiler support for type traits.
* C++ Concepts:: Improved support for generic programming. * C++ Concepts:: Improved support for generic programming.
* Deprecated Features:: Things will disappear from G++. * Deprecated Features:: Things will disappear from G++.
...@@ -22368,8 +22367,6 @@ does not have constructors or destructors. ...@@ -22368,8 +22367,6 @@ does not have constructors or destructors.
@end table @end table
See also @ref{Namespace Association}.
@node Function Multiversioning @node Function Multiversioning
@section Function Multiversioning @section Function Multiversioning
@cindex function versions @cindex function versions
...@@ -22428,51 +22425,6 @@ dispatching to call the right version at runtime. Refer to the ...@@ -22428,51 +22425,6 @@ dispatching to call the right version at runtime. Refer to the
@uref{http://gcc.gnu.org/wiki/FunctionMultiVersioning, GCC wiki on @uref{http://gcc.gnu.org/wiki/FunctionMultiVersioning, GCC wiki on
Function Multiversioning} for more details. Function Multiversioning} for more details.
@node Namespace Association
@section Namespace Association
@strong{Caution:} The semantics of this extension are equivalent
to C++ 2011 inline namespaces. Users should use inline namespaces
instead as this 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 and explicitly
instantiated as though they were members of the using namespace.
@item
The using namespace is considered an associated namespace of all
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:
@smallexample
namespace std @{
namespace debug @{
template <class T> struct A @{ @};
@}
using namespace debug __attribute ((__strong__));
template <> struct A<int> @{ @}; // @r{OK to specialize}
template <class T> void f (A<T>);
@}
int main()
@{
f (std::A<float>()); // @r{lookup finds} std::f
f (std::A<int>());
@}
@end smallexample
@node Type Traits @node Type Traits
@section Type Traits @section Type Traits
......
// PR c++/16301
// { dg-do compile }
namespace NS2
{
using namespace NS1 __attribute__ ((strong)); // { dg-error "" }
}
...@@ -250,7 +250,6 @@ namespace std ...@@ -250,7 +250,6 @@ namespace std
}; };
} // namespace __cxx1998 } // namespace __cxx1998
// namespace __debug __attribute__ ((strong));
inline namespace __debug { } inline namespace __debug { }
} }
</pre></div><div class="section"><div class="titlepage"><div><div><h5 class="title"><a id="methods.coexistence.link"></a>Link- and run-time coexistence of release- and </pre></div><div class="section"><div class="titlepage"><div><div><h5 class="title"><a id="methods.coexistence.link"></a>Link- and run-time coexistence of release- and
......
...@@ -656,7 +656,6 @@ namespace std ...@@ -656,7 +656,6 @@ namespace std
}; };
} // namespace __cxx1998 } // namespace __cxx1998
// namespace __debug __attribute__ ((strong));
inline namespace __debug { } inline namespace __debug { }
} }
</programlisting> </programlisting>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment