* name-lookup.c (parse_using_directive): Deprecate strong using.
authorJason Merrill <jason@redhat.com>
Thu, 26 Jan 2017 15:32:22 +0000 (10:32 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 26 Jan 2017 15:32:22 +0000 (10:32 -0500)
From-SVN: r244936

14 files changed:
gcc/cp/ChangeLog
gcc/cp/name-lookup.c
gcc/doc/extend.texi
gcc/testsuite/g++.dg/cpp0x/inline-ns6.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp0x/inline-ns7.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp0x/inline-ns8.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp0x/inline-ns9.C [new file with mode: 0644]
gcc/testsuite/g++.dg/lookup/strong-using-1.C [deleted file]
gcc/testsuite/g++.dg/lookup/strong-using-2.C [deleted file]
gcc/testsuite/g++.dg/lookup/strong-using-3.C [deleted file]
gcc/testsuite/g++.dg/lookup/strong-using-4.C [deleted file]
gcc/testsuite/g++.dg/lookup/strong-using-5.C [deleted file]
libstdc++-v3/doc/html/manual/debug_mode_design.html
libstdc++-v3/doc/xml/manual/debug_mode.xml

index 90b1671e6f0d4467155ae36143cb5934fc2ec448..48d695254259fb40c8032f2061b31e0bb4e762cf 100644 (file)
@@ -1,5 +1,7 @@
 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
        * decl2.c (vague_linkage_p): Handle decloned 'tors.
        * tree.c (decl_linkage): Likewise.
index 4004640a60cbb3596f117d2edc2996848564d981..10fb540e1f1ab2ce2405898dedb97384566fdd22 100644 (file)
@@ -4125,6 +4125,8 @@ parse_using_directive (tree name_space, tree attribs)
       tree name = get_attribute_name (a);
       if (is_attribute_p ("strong", name))
        {
+         warning (OPT_Wdeprecated, "strong using is deprecated; use inline "
+                  "namespaces instead");
          if (!toplevel_bindings_p ())
            error ("strong using only meaningful at namespace scope");
          else if (name_space != error_mark_node)
index 5cb4748e0323620b563cf24a6e61ec577c733a08..20eba822d54542714c18b530f6c6abc5b9da53f8 100644 (file)
@@ -21802,7 +21802,6 @@ Predefined Macros,cpp,The GNU C Preprocessor}).
                         method denoted by a @samp{->*} or @samp{.*} expression.
 * C++ Attributes::      Variable, function, and type attributes for C++ only.
 * Function Multiversioning::   Declaring multiple function versions.
-* Namespace Association:: Strong using-directives for namespace association.
 * Type Traits::         Compiler support for type traits.
 * C++ Concepts::        Improved support for generic programming.
 * Deprecated Features:: Things will disappear from G++.
@@ -22368,8 +22367,6 @@ does not have constructors or destructors.
 
 @end table
 
-See also @ref{Namespace Association}.
-
 @node Function Multiversioning
 @section Function Multiversioning
 @cindex function versions
@@ -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
 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
 @section Type Traits
 
diff --git a/gcc/testsuite/g++.dg/cpp0x/inline-ns6.C b/gcc/testsuite/g++.dg/cpp0x/inline-ns6.C
new file mode 100644 (file)
index 0000000..aa0c5f9
--- /dev/null
@@ -0,0 +1,16 @@
+// PR c++/13594 (secondary)
+
+// { dg-options "" }
+// { dg-do compile }
+
+namespace fool {
+  inline namespace foo {
+    template <class T> void swap(T, T);
+  }
+  template <class T> void swap(T);
+}
+
+int main() {
+  // we used to fail to look up the associated namespace here
+  fool::swap(1, 1);
+}
diff --git a/gcc/testsuite/g++.dg/cpp0x/inline-ns7.C b/gcc/testsuite/g++.dg/cpp0x/inline-ns7.C
new file mode 100644 (file)
index 0000000..d9f99a8
--- /dev/null
@@ -0,0 +1,24 @@
+// PR c++/13594
+
+// { dg-options "" }
+// { dg-do compile }
+
+namespace foo {
+  inline namespace foo_impl {
+    class T; // { dg-message "T" "" }
+  }
+}
+namespace bar {
+  inline namespace bar_impl {
+    class T; // { dg-message "T" "" }
+  }
+  using namespace foo;
+}
+namespace baz {
+  using namespace foo;
+  using namespace bar;
+}
+
+foo::T *t1;
+bar::T *t2;
+baz::T *t3; // { dg-error "(ambiguous|does not name a type)" "" }
diff --git a/gcc/testsuite/g++.dg/cpp0x/inline-ns8.C b/gcc/testsuite/g++.dg/cpp0x/inline-ns8.C
new file mode 100644 (file)
index 0000000..7679c6f
--- /dev/null
@@ -0,0 +1,18 @@
+// PR c++/13659
+
+// { dg-options "" }
+// { dg-do compile }
+
+namespace bar {
+  inline namespace foo {
+    template <class T> void f(T, T);
+  }
+  template <class T> void f(T);
+}
+
+int main() {
+  // Make sure both declarations are brought in.
+  using bar::f;
+  f(1);
+  f(1, 1);
+}
diff --git a/gcc/testsuite/g++.dg/cpp0x/inline-ns9.C b/gcc/testsuite/g++.dg/cpp0x/inline-ns9.C
new file mode 100644 (file)
index 0000000..555adb0
--- /dev/null
@@ -0,0 +1,26 @@
+// PR c++/33486
+
+// { dg-options "" }
+
+namespace A
+{
+  inline namespace B
+  {
+    struct T
+    {
+      struct U { };
+      U f();
+    };
+  }
+
+  inline namespace C
+  {
+    void g (T::U);
+  }
+}
+
+int main()
+{
+  A::T t;
+  g(t.f());
+}
diff --git a/gcc/testsuite/g++.dg/lookup/strong-using-1.C b/gcc/testsuite/g++.dg/lookup/strong-using-1.C
deleted file mode 100644 (file)
index aa0c5f9..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-// PR c++/13594 (secondary)
-
-// { dg-options "" }
-// { dg-do compile }
-
-namespace fool {
-  inline namespace foo {
-    template <class T> void swap(T, T);
-  }
-  template <class T> void swap(T);
-}
-
-int main() {
-  // we used to fail to look up the associated namespace here
-  fool::swap(1, 1);
-}
diff --git a/gcc/testsuite/g++.dg/lookup/strong-using-2.C b/gcc/testsuite/g++.dg/lookup/strong-using-2.C
deleted file mode 100644 (file)
index d9f99a8..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-// PR c++/13594
-
-// { dg-options "" }
-// { dg-do compile }
-
-namespace foo {
-  inline namespace foo_impl {
-    class T; // { dg-message "T" "" }
-  }
-}
-namespace bar {
-  inline namespace bar_impl {
-    class T; // { dg-message "T" "" }
-  }
-  using namespace foo;
-}
-namespace baz {
-  using namespace foo;
-  using namespace bar;
-}
-
-foo::T *t1;
-bar::T *t2;
-baz::T *t3; // { dg-error "(ambiguous|does not name a type)" "" }
diff --git a/gcc/testsuite/g++.dg/lookup/strong-using-3.C b/gcc/testsuite/g++.dg/lookup/strong-using-3.C
deleted file mode 100644 (file)
index 7679c6f..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-// PR c++/13659
-
-// { dg-options "" }
-// { dg-do compile }
-
-namespace bar {
-  inline namespace foo {
-    template <class T> void f(T, T);
-  }
-  template <class T> void f(T);
-}
-
-int main() {
-  // Make sure both declarations are brought in.
-  using bar::f;
-  f(1);
-  f(1, 1);
-}
diff --git a/gcc/testsuite/g++.dg/lookup/strong-using-4.C b/gcc/testsuite/g++.dg/lookup/strong-using-4.C
deleted file mode 100644 (file)
index 5ea1784..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-// PR c++/16301
-
-// { dg-do compile }
-
-namespace NS2 
-{ 
-  using namespace NS1 __attribute__ ((strong));  // { dg-error "" }
-}
diff --git a/gcc/testsuite/g++.dg/lookup/strong-using-5.C b/gcc/testsuite/g++.dg/lookup/strong-using-5.C
deleted file mode 100644 (file)
index 555adb0..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-// PR c++/33486
-
-// { dg-options "" }
-
-namespace A
-{
-  inline namespace B
-  {
-    struct T
-    {
-      struct U { };
-      U f();
-    };
-  }
-
-  inline namespace C
-  {
-    void g (T::U);
-  }
-}
-
-int main()
-{
-  A::T t;
-  g(t.f());
-}
index 3373471d48e5fbfa554eeaa79ec55c8d23ea2dff..3fcdb2db8852dcc3ba984bdc6c93fd5828c0b228 100644 (file)
@@ -250,7 +250,6 @@ namespace std
       };
   } // namespace __cxx1998
 
-  // namespace __debug __attribute__ ((strong));
   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
index ff2f1cced8992a4998a2d750d53d87ecb0844538..9e97a1ddbe78fefaccd1a42af936e9d8837bb7fb 100644 (file)
@@ -656,7 +656,6 @@ namespace std
       };
   } // namespace __cxx1998
 
-  // namespace __debug __attribute__ ((strong));
   inline namespace __debug { }
 }
 </programlisting>