Fix namespace versioning and remove __detail::__identity helpers
authorJonathan Wakely <jwakely@redhat.com>
Thu, 26 Jan 2017 18:32:55 +0000 (18:32 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Thu, 26 Jan 2017 18:32:55 +0000 (18:32 +0000)
PR libstdc++/79243
* include/bits/c++config (literals::string_view_literals::__7): Add.
Only declare versioned namespaces for the relevant C++ dialects.
* include/experimental/bits/erase_if.h (fundamentals_v2::__detail):
Add versioning macros.
* include/experimental/bits/lfts_config.h:
(fundamentals_v1::__detail::__7, fundamentals_v2::__detail::__7): Add.
* include/experimental/string_view (fundamentals_v2::__detail):
Add versioning macros.
(fundamentals_v2::__detail::__identity): Remove.
(fundamentals_v2::__detail::__idt): Use common_type instead of
__detail::__identity.
* include/std/string_view (__detail::__identity, __detail::__idt):
Likewise.
(literals::string_view_literals): Fix nesting of versioning macros.

From-SVN: r244945

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/c++config
libstdc++-v3/include/experimental/bits/erase_if.h
libstdc++-v3/include/experimental/bits/lfts_config.h
libstdc++-v3/include/experimental/string_view
libstdc++-v3/include/std/string_view

index 2fc38c97a639a38e87f00813a149d57d737645ef..1428ffe95c21ad8ee468b82d46fc2a2dbb755532 100644 (file)
@@ -1,5 +1,21 @@
 2017-01-26  Jonathan Wakely  <jwakely@redhat.com>
 
+       PR libstdc++/79243
+       * include/bits/c++config (literals::string_view_literals::__7): Add.
+       Only declare versioned namespaces for the relevant C++ dialects.
+       * include/experimental/bits/erase_if.h (fundamentals_v2::__detail):
+       Add versioning macros.
+       * include/experimental/bits/lfts_config.h:
+       (fundamentals_v1::__detail::__7, fundamentals_v2::__detail::__7): Add.
+       * include/experimental/string_view (fundamentals_v2::__detail):
+       Add versioning macros.
+       (fundamentals_v2::__detail::__identity): Remove.
+       (fundamentals_v2::__detail::__idt): Use common_type instead of
+       __detail::__identity.
+       * include/std/string_view (__detail::__identity, __detail::__idt):
+       Likewise.
+       (literals::string_view_literals): Fix nesting of versioning macros.
+
        PR libstdc++/79190
        * libsupc++/del_opa.cc (operator delete(void*, std::align_val_t))
        [!_GLIBCXX_HAVE_ALIGNED_ALLOC && !_GLIBCXX_HAVE_POSIX_MEMALIGN
index bc1ab5fc17e1e7eb17a4771c6c68eabdaebec1f4..3b694e07c51131b40bd471fe9aedd260a5d8746e 100644 (file)
     namespace __profile { }
     namespace __cxx1998 { }
 
-    namespace __detail { }
+    namespace __detail {
+      namespace __variant { }                          // C++17
+    }
 
     namespace rel_ops { }
 
     
     namespace decimal { }
 
-    namespace chrono { }
-    namespace placeholders { }
-    namespace regex_constants { }
-    namespace this_thread { }
-    inline namespace literals {
-      inline namespace chrono_literals { }
-      inline namespace complex_literals { }
-      inline namespace string_literals { }
+    namespace chrono { }                               // C++11
+    namespace placeholders { }                         // C++11
+    namespace regex_constants { }                      // C++11
+    namespace this_thread { }                          // C++11
+    inline namespace literals {                                // C++14
+      inline namespace chrono_literals { }             // C++14
+      inline namespace complex_literals { }            // C++14
+      inline namespace string_literals { }             // C++14
+      inline namespace string_view_literals { }                // C++17
     }
   }
 
@@ -282,20 +285,29 @@ namespace std
 
   namespace decimal { inline namespace __7 { } }
 
+#if __cplusplus >= 201103L
   namespace chrono { inline namespace __7 { } }
   namespace placeholders { inline namespace __7 { } }
   namespace regex_constants { inline namespace __7 { } }
   namespace this_thread { inline namespace __7 { } }
 
+#if __cplusplus >= 201402L
   inline namespace literals {
     inline namespace chrono_literals { inline namespace __7 { } }
     inline namespace complex_literals { inline namespace __7 { } }
     inline namespace string_literals { inline namespace __7 { } }
+#if __cplusplus > 201402L
+    inline namespace string_view_literals { inline namespace __7 { } }
+#endif // C++17
   }
+#endif // C++14
+#endif // C++11
 
   namespace __detail {
     inline namespace __7 { }
+#if __cplusplus > 201402L
     namespace __variant { inline namespace __7 { } }
+#endif
   }
 }
 
index c4ac2828d7b1f96a3ac4b4dea89504ca39766995..7dc47dbb3ebcd78e912feb561143be0fc06ed7be 100644 (file)
@@ -43,9 +43,9 @@ namespace experimental
 {
 inline namespace fundamentals_v2
 {
-
   namespace __detail
   {
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
     template<typename _Container, typename _Predicate>
       void
       __erase_nodes_if(_Container& __cont, _Predicate __pred)
@@ -59,9 +59,8 @@ inline namespace fundamentals_v2
            ++__iter;
        }
       }
-  }
-
-
+_GLIBCXX_END_NAMESPACE_VERSION
+  } // namespace __detail
 } // inline namespace fundamentals_v2
 } // namespace experimental
 } // namespace std
index 97f090f868b3e8a8c83b7d2e32a836d9a9a256ee..a9faa47a842fd03e9cd8cbb8bed165f76d863399 100644 (file)
@@ -46,10 +46,14 @@ inline namespace fundamentals_v2 { inline namespace __7 { } }
 
 namespace experimental
 {
-inline namespace fundamentals_v1 { inline namespace __7 { } }
+inline namespace fundamentals_v1 {
+  inline namespace __7 { }
+  namespace __detail { inline namespace __7 { } }
+}
 inline namespace fundamentals_v2 {
   inline namespace __7 { }
   namespace pmr { inline namespace __7 { } }
+  namespace __detail { inline namespace __7 { } }
 } // namespace fundamentals_v2
 inline namespace literals { inline namespace string_view_literals {
   inline namespace __7 { }
index 2a2364cfa1e88f29625c7238284ff2dc4d0deaf2..bd212ac371948dbf9bc519f0997f7ac0a420bedf 100644 (file)
@@ -434,24 +434,23 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       const _CharT* _M_str;
     };
 
+_GLIBCXX_END_NAMESPACE_VERSION
 
   // [string.view.comparison], non-member basic_string_view comparison functions
 
   namespace __detail
   {
-    //  Identity transform to make ADL work with just one argument.
-    //  See n3766.html.
-    template<typename _Tp = void>
-      struct __identity
-      { typedef _Tp type; };
-
-    template<>
-      struct __identity<void>;
-
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
+    // Identity transform to create a non-deduced context, so that only one
+    // argument participates in template argument deduction and the other
+    // argument gets implicitly converted to the deduced type. See n3766.html.
     template<typename _Tp>
-      using __idt = typename __identity<_Tp>::type;
+      using __idt = common_type_t<_Tp>;
+_GLIBCXX_END_NAMESPACE_VERSION
   }
 
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
+
   template<typename _CharT, typename _Traits>
     inline bool
     operator==(basic_string_view<_CharT, _Traits> __x,
index a71918553bb5f7c73285269bbbc57295940d0b83..311d6d725b36b38bd176b8abec5803d6ae20ba1d 100644 (file)
@@ -430,20 +430,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 _GLIBCXX_END_NAMESPACE_VERSION
 
   // [string.view.comparison], non-member basic_string_view comparison function
+
   namespace __detail
   {
 _GLIBCXX_BEGIN_NAMESPACE_VERSION
-    //  Identity transform to make ADL work with just one argument.
-    //  See n3766.html.
-    template<typename _Tp = void>
-      struct __identity
-      { typedef _Tp type; };
-
-    template<>
-      struct __identity<void>;
-
+    // Identity transform to create a non-deduced context, so that only one
+    // argument participates in template argument deduction and the other
+    // argument gets implicitly converted to the deduced type. See n3766.html.
     template<typename _Tp>
-      using __idt = typename __identity<_Tp>::type;
+      using __idt = common_type_t<_Tp>;
 _GLIBCXX_END_NAMESPACE_VERSION
   }
 
@@ -639,12 +634,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     struct __is_fast_hash<hash<u32string_view>> : std::false_type
     { };
 #endif
+_GLIBCXX_END_NAMESPACE_VERSION
 
   inline namespace literals
   {
   inline namespace string_view_literals
   {
-  _GLIBCXX_BEGIN_NAMESPACE_VERSION
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
 
     inline constexpr basic_string_view<char>
     operator""sv(const char* __str, size_t __len)
@@ -666,11 +662,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     { return basic_string_view<char32_t>{__str, __len}; }
 #endif
 
-  _GLIBCXX_END_NAMESPACE_VERSION
+_GLIBCXX_END_NAMESPACE_VERSION
   } // namespace string_literals
   } // namespace literals
 
-_GLIBCXX_END_NAMESPACE_VERSION
 } // namespace std
 
 #include <bits/string_view.tcc>