* [Bug libstdc++/45228] Can't copy-construct "tuple<int,int,int>" from "const tuple<int,int,int>" rvalue
2010-08-07 20:03 [Bug libstdc++/45228] New: Can't copy-construct "tuple<int,int,int>" from "const tuple<int,int,int>" rvalue jorrit at jorrit dot de
@ 2010-08-07 20:25 ` jorrit at jorrit dot de
2010-08-07 22:19 ` [Bug libstdc++/45228] [C++0x] " paolo dot carlini at oracle dot com
` (6 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: jorrit at jorrit dot de @ 2010-08-07 20:25 UTC (permalink / raw)
To: gcc-bugs
------- Comment #1 from jorrit at jorrit dot de 2010-08-07 20:24 -------
I also reported this to Debian: http://bugs.debian.org/592153
--
jorrit at jorrit dot de changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |jorrit at jorrit dot de
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45228
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug libstdc++/45228] [C++0x] Can't copy-construct "tuple<int,int,int>" from "const tuple<int,int,int>" rvalue
2010-08-07 20:03 [Bug libstdc++/45228] New: Can't copy-construct "tuple<int,int,int>" from "const tuple<int,int,int>" rvalue jorrit at jorrit dot de
2010-08-07 20:25 ` [Bug libstdc++/45228] " jorrit at jorrit dot de
@ 2010-08-07 22:19 ` paolo dot carlini at oracle dot com
2010-08-09 13:22 ` jason at redhat dot com
` (5 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: paolo dot carlini at oracle dot com @ 2010-08-07 22:19 UTC (permalink / raw)
To: gcc-bugs
------- Comment #2 from paolo dot carlini at oracle dot com 2010-08-07 22:19 -------
Our std::tuple still needs work, but I see am inconsistency here between the
variadic and the non variadic case which I don't understand, irrespective of
library details. Consider the following reduced testcase: it outputs *only*
"Two (m)", no "Two (2)". It seems pretty obvious to me that the constructor
"Two", which takes *individual elements*, certainly should never be involved,
but it is, in the variadic case only.
Jason can you have a look? Thanks in advance!
///////////
#include <iostream>
template<typename... Types>
struct tuple_m
{
tuple_m() { }
explicit
tuple_m(const Types&...)
{ std::cout << "One (m)\n"; }
template<typename... UTypes>
explicit
tuple_m(UTypes&&...)
{ std::cout << "Two (m)\n"; }
tuple_m(const tuple_m&)
{ std::cout << "Three (m)\n"; }
tuple_m(tuple_m&&)
{ std::cout << "Four (m)\n"; }
template<typename... UTypes>
tuple_m(const tuple_m<UTypes...>&)
{ std::cout << "Five (m)\n"; }
template<typename... UTypes>
tuple_m(tuple_m<UTypes...>&&)
{ std::cout << "Six (m)\n"; }
};
template<typename T1, typename T2>
struct tuple_2
{
tuple_2() { }
explicit
tuple_2(const T1&, const T2&)
{ std::cout << "One (2)\n"; }
template<typename UT1, typename UT2>
explicit
tuple_2(UT1&&, UT2&&)
{ std::cout << "Two (2)\n"; }
tuple_2(const tuple_2&)
{ std::cout << "Three (2)\n"; }
tuple_2(tuple_2&&)
{ std::cout << "Four (2)\n"; }
template<typename UT1, typename UT2>
tuple_2(const tuple_2<UT1, UT2>&)
{ std::cout << "Five (2)\n"; }
template<typename UT1, typename UT2>
tuple_2(tuple_2<UT1, UT2>&&)
{ std::cout << "Six (2)\n"; }
};
typedef tuple_2<int, int> tuple_2_type;
typedef tuple_m<int, int, int> tuple_m_type;
const tuple_2_type f2() { return tuple_2_type(); }
const tuple_m_type fm() { return tuple_m_type(); }
int main()
{
tuple_2_type test_2(f2());
tuple_m_type test_m(fm());
}
--
paolo dot carlini at oracle dot com changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |paolo dot carlini at oracle
| |dot com, jason at gcc dot
| |gnu dot org
Summary|Can't copy-construct |[C++0x] Can't copy-construct
|"tuple<int,int,int>" from |"tuple<int,int,int>" from
|"const tuple<int,int,int>" |"const tuple<int,int,int>"
|rvalue |rvalue
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45228
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug libstdc++/45228] [C++0x] Can't copy-construct "tuple<int,int,int>" from "const tuple<int,int,int>" rvalue
2010-08-07 20:03 [Bug libstdc++/45228] New: Can't copy-construct "tuple<int,int,int>" from "const tuple<int,int,int>" rvalue jorrit at jorrit dot de
2010-08-07 20:25 ` [Bug libstdc++/45228] " jorrit at jorrit dot de
2010-08-07 22:19 ` [Bug libstdc++/45228] [C++0x] " paolo dot carlini at oracle dot com
@ 2010-08-09 13:22 ` jason at redhat dot com
2010-08-09 13:31 ` paolo dot carlini at oracle dot com
` (4 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: jason at redhat dot com @ 2010-08-09 13:22 UTC (permalink / raw)
To: gcc-bugs
------- Comment #3 from jason at redhat dot com 2010-08-09 13:22 -------
Subject: Re: [C++0x] Can't copy-construct "tuple<int,int,int>"
from "const tuple<int,int,int>" rvalue
For tuple_m, you have a variadic template constructor that can take
*any* arguments whatsoever, and will therefore be a better match than
anything that doesn't have a specific constructor. In this case, you're
trying to create a tuple_m from a const tuple_m rvalue, and therefore
the variadic template is instantiated to form tuple_m(const tuple_m&&),
which is a better match than either tuple_m(const tuple_m&) or
tuple_m(tuple_m&&).
For tuple_2, the T&& constructor requires two arguments, so this isn't
an issue.
This is the same issue that we had with thread; I worked around that for
the non-const lvalue case by adding thread(thread&) = delete, and you
could do the same here by adding a const tuple_m&& overload.
But in general, I think any time you have a variadic constructor that
can take a single T&&, you probably want to use SFINAE to make sure that
it isn't chosen for a single argument of the enclosing class type.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45228
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug libstdc++/45228] [C++0x] Can't copy-construct "tuple<int,int,int>" from "const tuple<int,int,int>" rvalue
2010-08-07 20:03 [Bug libstdc++/45228] New: Can't copy-construct "tuple<int,int,int>" from "const tuple<int,int,int>" rvalue jorrit at jorrit dot de
` (2 preceding siblings ...)
2010-08-09 13:22 ` jason at redhat dot com
@ 2010-08-09 13:31 ` paolo dot carlini at oracle dot com
2010-08-09 13:39 ` jason at redhat dot com
` (3 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: paolo dot carlini at oracle dot com @ 2010-08-09 13:31 UTC (permalink / raw)
To: gcc-bugs
------- Comment #4 from paolo dot carlini at oracle dot com 2010-08-09 13:31 -------
Thanks for the clarification Jason. Indeed, I think the most robust fix is
using SFINAE, and actually we have already quite a bit of language in the FCD
about tuple constuctors vs constraining, I think it's time to look into that in
detail.
I'm also thinking that the weird constructor tuple(tuple<_UElements...>& __in),
which has been suggested at the time by Peter Dimov, falls under the same
reasoning and should be removed, the actual issue sorted out elsewhere again
through SFINAE. If you think differently, just let me know here... Thanks
again.
--
paolo dot carlini at oracle dot com changed:
What |Removed |Added
----------------------------------------------------------------------------
AssignedTo|unassigned at gcc dot gnu |paolo dot carlini at oracle
|dot org |dot com
Status|UNCONFIRMED |ASSIGNED
Ever Confirmed|0 |1
Last reconfirmed|0000-00-00 00:00:00 |2010-08-09 13:31:39
date| |
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45228
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug libstdc++/45228] [C++0x] Can't copy-construct "tuple<int,int,int>" from "const tuple<int,int,int>" rvalue
2010-08-07 20:03 [Bug libstdc++/45228] New: Can't copy-construct "tuple<int,int,int>" from "const tuple<int,int,int>" rvalue jorrit at jorrit dot de
` (3 preceding siblings ...)
2010-08-09 13:31 ` paolo dot carlini at oracle dot com
@ 2010-08-09 13:39 ` jason at redhat dot com
2010-08-09 13:45 ` paolo dot carlini at oracle dot com
` (2 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: jason at redhat dot com @ 2010-08-09 13:39 UTC (permalink / raw)
To: gcc-bugs
------- Comment #5 from jason at redhat dot com 2010-08-09 13:38 -------
Subject: Re: [C++0x] Can't copy-construct "tuple<int,int,int>"
from "const tuple<int,int,int>" rvalue
On 08/09/2010 09:31 AM, paolo dot carlini at oracle dot com wrote:
> I'm also thinking that the weird constructor tuple(tuple<_UElements...>& __in),
> which has been suggested at the time by Peter Dimov, falls under the same
> reasoning and should be removed, the actual issue sorted out elsewhere again
> through SFINAE.
Removed? To be clear, I was suggesting that you keep the constructor,
just prevent it from being selected when the deduced parameter type is
reference-related to the enclosing class.
Jason
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45228
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug libstdc++/45228] [C++0x] Can't copy-construct "tuple<int,int,int>" from "const tuple<int,int,int>" rvalue
2010-08-07 20:03 [Bug libstdc++/45228] New: Can't copy-construct "tuple<int,int,int>" from "const tuple<int,int,int>" rvalue jorrit at jorrit dot de
` (4 preceding siblings ...)
2010-08-09 13:39 ` jason at redhat dot com
@ 2010-08-09 13:45 ` paolo dot carlini at oracle dot com
2010-08-10 7:18 ` paolo at gcc dot gnu dot org
2010-08-10 7:23 ` paolo dot carlini at oracle dot com
7 siblings, 0 replies; 9+ messages in thread
From: paolo dot carlini at oracle dot com @ 2010-08-09 13:45 UTC (permalink / raw)
To: gcc-bugs
------- Comment #6 from paolo dot carlini at oracle dot com 2010-08-09 13:44 -------
Note the specific constructor I mentioned:
// XXX http://gcc.gnu.org/ml/libstdc++/2008-02/msg00047.html
template<typename... _UElements>
tuple(tuple<_UElements...>& __in)
we are *not* talking there about any of the constructors part of the user
interface, we are talking about a constructor added only for the purpose of
getting right special cases (having to do with cc qualifiers, conversions)
without resorting to SFINAE. I think we should be able to uniformly use *only*
constraining on the user visible constructors, for this issue too. Agreed?
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45228
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug libstdc++/45228] [C++0x] Can't copy-construct "tuple<int,int,int>" from "const tuple<int,int,int>" rvalue
2010-08-07 20:03 [Bug libstdc++/45228] New: Can't copy-construct "tuple<int,int,int>" from "const tuple<int,int,int>" rvalue jorrit at jorrit dot de
` (5 preceding siblings ...)
2010-08-09 13:45 ` paolo dot carlini at oracle dot com
@ 2010-08-10 7:18 ` paolo at gcc dot gnu dot org
2010-08-10 7:23 ` paolo dot carlini at oracle dot com
7 siblings, 0 replies; 9+ messages in thread
From: paolo at gcc dot gnu dot org @ 2010-08-10 7:18 UTC (permalink / raw)
To: gcc-bugs
------- Comment #7 from paolo at gcc dot gnu dot org 2010-08-10 07:18 -------
Subject: Bug 45228
Author: paolo
Date: Tue Aug 10 07:17:44 2010
New Revision: 163049
URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=163049
Log:
2010-08-10 Paolo Carlini <paolo.carlini@oracle.com>
PR libstdc++/45228
* include/std/tuple (tuple<typename... _Elements>): Constrain
converting constructors and assignment operators with
sizeof...(_UElements) == sizeof...(_Elements).
(tuple(tuple<_UElements...>&): Remove.
(tuple<typename _T1>): Add.
* testsuite/20_util/tuple/cons/45228.cc: New.
* testsuite/20_util/tuple/cons/converting.cc: Likewise.
* testsuite/20_util/weak_ptr/comparison/cmp_neg.cc: Adjust
dg-error line number.
* include/std/tuple (_Tuple_impl<>::_Tuple_impl(const _Tuple_impl&)):
Defaulted.
* include/std/tuple (tuple<typename _T1, typename _T2>
::operator=(pair<_U1, _U2>&&)): Use forward.
Added:
trunk/libstdc++-v3/testsuite/20_util/tuple/cons/45228.cc
trunk/libstdc++-v3/testsuite/20_util/tuple/cons/converting.cc
Modified:
trunk/libstdc++-v3/ChangeLog
trunk/libstdc++-v3/include/std/tuple
trunk/libstdc++-v3/testsuite/20_util/weak_ptr/comparison/cmp_neg.cc
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45228
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug libstdc++/45228] [C++0x] Can't copy-construct "tuple<int,int,int>" from "const tuple<int,int,int>" rvalue
2010-08-07 20:03 [Bug libstdc++/45228] New: Can't copy-construct "tuple<int,int,int>" from "const tuple<int,int,int>" rvalue jorrit at jorrit dot de
` (6 preceding siblings ...)
2010-08-10 7:18 ` paolo at gcc dot gnu dot org
@ 2010-08-10 7:23 ` paolo dot carlini at oracle dot com
7 siblings, 0 replies; 9+ messages in thread
From: paolo dot carlini at oracle dot com @ 2010-08-10 7:23 UTC (permalink / raw)
To: gcc-bugs
------- Comment #8 from paolo dot carlini at oracle dot com 2010-08-10 07:23 -------
Fixed.
--
paolo dot carlini at oracle dot com changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|ASSIGNED |RESOLVED
Resolution| |FIXED
Target Milestone|--- |4.6.0
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45228
^ permalink raw reply [flat|nested] 9+ messages in thread