From: Ville Voutilainen Date: Mon, 3 Apr 2017 16:30:58 +0000 (+0300) Subject: re PR libstdc++/79141 (std::pair p = {}; fails to compile due to ambiguous... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c1e2889a320a2e45eb60b6bb7c1d3d8fc0068582;p=gcc.git re PR libstdc++/79141 (std::pair p = {}; fails to compile due to ambiguous overload) PR libstdc++/79141 * include/bits/stl_pair.h (__nonesuch_no_braces): New. (operator=(typename conditional< __and_, is_copy_assignable<_T2>>::value, const pair&, const __nonesuch&>::type)): Change __nonesuch to __nonesuch_no_braces. (operator=(typename conditional< __not_<__and_, is_copy_assignable<_T2>>>::value, const pair&, const __nonesuch&>::type)): Likewise. (operator=(typename conditional< __and_, is_move_assignable<_T2>>::value, pair&&, __nonesuch&&>::type)): Likewise. * testsuite/20_util/pair/79141.cc: New. From-SVN: r246653 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 62c8288644a..4073a82e2a3 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,22 @@ +2017-04-03 Ville Voutilainen + + PR libstdc++/79141 + * include/bits/stl_pair.h (__nonesuch_no_braces): New. + (operator=(typename conditional< + __and_, + is_copy_assignable<_T2>>::value, + const pair&, const __nonesuch&>::type)): Change __nonesuch + to __nonesuch_no_braces. + (operator=(typename conditional< + __not_<__and_, + is_copy_assignable<_T2>>>::value, + const pair&, const __nonesuch&>::type)): Likewise. + (operator=(typename conditional< + __and_, + is_move_assignable<_T2>>::value, + pair&&, __nonesuch&&>::type)): Likewise. + * testsuite/20_util/pair/79141.cc: New. + 2017-04-03 Ville Voutilainen Implement std::is_aggregate. diff --git a/libstdc++-v3/include/bits/stl_pair.h b/libstdc++-v3/include/bits/stl_pair.h index 7c7cee262a6..b6245b65cd1 100644 --- a/libstdc++-v3/include/bits/stl_pair.h +++ b/libstdc++-v3/include/bits/stl_pair.h @@ -179,6 +179,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } }; + // PR libstdc++/79141, a utility type for preventing + // initialization of an argument of a disabled assignment + // operator from a pair of empty braces. + struct __nonesuch_no_braces : std::__nonesuch { + explicit __nonesuch_no_braces(const __nonesuch&) = delete; + }; + #endif /** @@ -360,7 +367,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION operator=(typename conditional< __and_, is_copy_assignable<_T2>>::value, - const pair&, const __nonesuch&>::type __p) + const pair&, const __nonesuch_no_braces&>::type __p) { first = __p.first; second = __p.second; @@ -371,13 +378,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION operator=(typename conditional< __not_<__and_, is_copy_assignable<_T2>>>::value, - const pair&, const __nonesuch&>::type __p) = delete; + const pair&, const __nonesuch_no_braces&>::type __p) = delete; pair& operator=(typename conditional< __and_, is_move_assignable<_T2>>::value, - pair&&, __nonesuch&&>::type __p) + pair&&, __nonesuch_no_braces&&>::type __p) noexcept(__and_, 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 00000000000..d4b5c9443f2 --- /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 +// . + +#include + +int main() { + std::pair p; + p = {}; +}