Tested on Linux-x64.

2017-04-02  Ville Voutilainen  <ville.voutilai...@gmail.com>

    PR libstdc++/79141
    * include/bits/stl_pair.h (__wrap_nonesuch): New.
    (operator=(typename conditional<
    __and_<is_copy_assignable<_T1>,
    is_copy_assignable<_T2>>::value,
    const pair&, const __wrap_nonesuch&>::type)): Change __nonesuch
    to __wrap_nonesuch.
    (operator=(typename conditional<
    __not_<__and_<is_copy_assignable<_T1>,
    is_copy_assignable<_T2>>>::value,
    const pair&, const __nonesuch&>::type)): Likewise.
    (operator=(typename conditional<
    __and_<is_move_assignable<_T1>,
    is_move_assignable<_T2>>::value,
    pair&&, __wrap_nonesuch&&>::type)): Likewise.
    * testsuite/20_util/pair/79141.cc: New.
diff --git a/libstdc++-v3/include/bits/stl_pair.h 
b/libstdc++-v3/include/bits/stl_pair.h
index 7c7cee2..b746fb4 100644
--- a/libstdc++-v3/include/bits/stl_pair.h
+++ b/libstdc++-v3/include/bits/stl_pair.h
@@ -179,6 +179,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       }
   };
 
+  struct __wrap_nonesuch : std::__nonesuch {
+    explicit __wrap_nonesuch(const __nonesuch&) = delete;
+  };
+  
 #endif
 
  /**
@@ -360,7 +364,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       operator=(typename conditional<
                __and_<is_copy_assignable<_T1>,
                       is_copy_assignable<_T2>>::value,
-               const pair&, const __nonesuch&>::type __p)
+               const pair&, const __wrap_nonesuch&>::type __p)
       {
        first = __p.first;
        second = __p.second;
@@ -371,13 +375,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       operator=(typename conditional<
                __not_<__and_<is_copy_assignable<_T1>,
                              is_copy_assignable<_T2>>>::value,
-               const pair&, const __nonesuch&>::type __p) = delete;
+               const pair&, const __wrap_nonesuch&>::type __p) = delete;
 
       pair&
       operator=(typename conditional<
                __and_<is_move_assignable<_T1>,
                       is_move_assignable<_T2>>::value,
-               pair&&, __nonesuch&&>::type __p)
+               pair&&, __wrap_nonesuch&&>::type __p)
       noexcept(__and_<is_nothrow_move_assignable<_T1>,
                      is_nothrow_move_assignable<_T2>>::value)
       {
diff --git a/libstdc++-v3/testsuite/20_util/pair/79141.cc 
b/libstdc++-v3/testsuite/20_util/pair/79141.cc
new file mode 100644
index 0000000..d4b5c94
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/pair/79141.cc
@@ -0,0 +1,25 @@
+// { dg-do compile { target c++11 } }
+
+// Copyright (C) 2017 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <utility>
+
+int main() {
+    std::pair<int,int> p;
+    p = {};
+}

Reply via email to