diff mbox

Fix namespace versioning and remove __detail::__identity helpers

Message ID 20170126183250.GA20754@redhat.com
State New
Headers show

Commit Message

Jonathan Wakely Jan. 26, 2017, 6:32 p.m. UTC
The begin/end versioned namespace macros are misplaced (or missing) in
<experimental/bits/erase_if.h> and <experimental/string_view> and
<string_view>, the latter of which introduces new ambiguities in C++17
mode.

This fixes that regression, and removes some unnecessary __identity<T>
helpers, as we can just use std::common_type<T> instead (which is
equivalent to decay<T> for these types, but using common_type of a
single type seems more expressive as an subsititute for the identity
transform).
	
        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.

Tested x86_64-linux with versioned namespace, as c++{11,14,17}.
Tested powerpc64le-linux with normal namespace, as c++{11,14,17}.

There are a couple of pre-existing test failures using -std=c++11,
which I'll fix shortly.

Committed to trunk.
commit 9e3c2c833c64671133b4e270d358d1d1d9a7c2d7
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Thu Jan 26 17:32:24 2017 +0000

    Fix namespace versioning and remove __detail::__identity helpers
    
    	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.
diff mbox

Patch

diff --git a/libstdc++-v3/include/bits/c++config b/libstdc++-v3/include/bits/c++config
index bc1ab5f..3b694e0 100644
--- a/libstdc++-v3/include/bits/c++config
+++ b/libstdc++-v3/include/bits/c++config
@@ -179,7 +179,9 @@ 
     namespace __profile { }
     namespace __cxx1998 { }
 
-    namespace __detail { }
+    namespace __detail {
+      namespace __variant { }				// C++17
+    }
 
     namespace rel_ops { }
 
@@ -194,14 +196,15 @@ 
     
     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
   }
 }
 
diff --git a/libstdc++-v3/include/experimental/bits/erase_if.h b/libstdc++-v3/include/experimental/bits/erase_if.h
index c4ac282..7dc47db 100644
--- a/libstdc++-v3/include/experimental/bits/erase_if.h
+++ b/libstdc++-v3/include/experimental/bits/erase_if.h
@@ -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
diff --git a/libstdc++-v3/include/experimental/bits/lfts_config.h b/libstdc++-v3/include/experimental/bits/lfts_config.h
index 97f090f..a9faa47 100644
--- a/libstdc++-v3/include/experimental/bits/lfts_config.h
+++ b/libstdc++-v3/include/experimental/bits/lfts_config.h
@@ -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 { }
diff --git a/libstdc++-v3/include/experimental/string_view b/libstdc++-v3/include/experimental/string_view
index 2a2364c..bd212ac 100644
--- a/libstdc++-v3/include/experimental/string_view
+++ b/libstdc++-v3/include/experimental/string_view
@@ -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,
diff --git a/libstdc++-v3/include/std/string_view b/libstdc++-v3/include/std/string_view
index a719185..311d6d7 100644
--- a/libstdc++-v3/include/std/string_view
+++ b/libstdc++-v3/include/std/string_view
@@ -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>