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 <jwak...@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 --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>