PR libstdc++/90314 fix non-equivalent declarations of std::swap
authorJonathan Wakely <jwakely@redhat.com>
Thu, 2 May 2019 21:23:38 +0000 (22:23 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Thu, 2 May 2019 21:23:38 +0000 (22:23 +0100)
In order to use the _GLIBCXX_NOEXCEPT_IF macro for an expression
containing commas I enclosed it in parentheses, so the preprocessor
wouldn't treat it as two arguments to the function-like macro. Clang
gives an error because now the noexcept-specifier noexcept((C)) is not
equivalent to the noexcept(C) one on the declaration of swap in
<type_traits>.

Instead of requiring extra parentheses around the expression, redefine
_GLIBCXX_NOEXCEPT_IF as a variadic macro (even though supporting that in
C++98 is a GNU extension).

PR libstdc++/90314
* include/bits/c++config (_GLIBCXX_NOEXCEPT_IF): Use variadic macro.
* include/bits/move.h (swap): Remove extra parentheses.

From-SVN: r270827

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/c++config
libstdc++-v3/include/bits/move.h

index cd1508ee789ecefe31737d3aea62cd4dc4bd8b40..6c93604d3187c00ac0506b4c5bbf269d9cf7adeb 100644 (file)
@@ -1,5 +1,9 @@
 2019-05-02  Jonathan Wakely  <jwakely@redhat.com>
 
+       PR libstdc++/90314
+       * include/bits/c++config (_GLIBCXX_NOEXCEPT_IF): Use variadic macro.
+       * include/bits/move.h (swap): Remove extra parentheses.
+
        * include/experimental/bits/lfts_config.h: Improve doc markup.
        * include/experimental/optional: Improve docs.
        (_Has_addressof_mem, _Has_addressof_free, _Has_addressof)
index 5016f4853de308e6c94d62a5ef715d91e1242f79..ca1557af56436cf2411d5df6ca40f1277b5971fa 100644 (file)
 #ifndef _GLIBCXX_NOEXCEPT
 # if __cplusplus >= 201103L
 #  define _GLIBCXX_NOEXCEPT noexcept
-#  define _GLIBCXX_NOEXCEPT_IF(_COND) noexcept(_COND)
+#  define _GLIBCXX_NOEXCEPT_IF(...) noexcept(__VA_ARGS__)
 #  define _GLIBCXX_USE_NOEXCEPT noexcept
 #  define _GLIBCXX_THROW(_EXC)
 # else
 #  define _GLIBCXX_NOEXCEPT
-#  define _GLIBCXX_NOEXCEPT_IF(_COND)
+#  define _GLIBCXX_NOEXCEPT_IF(...)
 #  define _GLIBCXX_USE_NOEXCEPT throw()
 #  define _GLIBCXX_THROW(_EXC) throw(_EXC)
 # endif
index 996078cfbce436b72b5878b18210354c1cc97651..7271e273e8eed4d13fdaeca6f99da9bb0bdf4289 100644 (file)
@@ -183,8 +183,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     void
 #endif
     swap(_Tp& __a, _Tp& __b)
-    _GLIBCXX_NOEXCEPT_IF((__and_<is_nothrow_move_constructible<_Tp>,
-                                is_nothrow_move_assignable<_Tp>>::value))
+    _GLIBCXX_NOEXCEPT_IF(__and_<is_nothrow_move_constructible<_Tp>,
+                               is_nothrow_move_assignable<_Tp>>::value)
     {
       // concept requirements
       __glibcxx_function_requires(_SGIAssignableConcept<_Tp>)