DR 1402 generalization

François Dumont frs.dumont@gmail.com
Fri Apr 5 20:18:00 GMT 2013


Looks like this problem is not having a lot of success :-)

I finally had a regression with my little modification of gcc/cp/call.c 
to generalize DR 1402 to copy semantic.

In testsuite/23_containers/unordered_set/55043.cc, in debug mode the 
following static assertion fails:

static_assert(!std::is_copy_constructible<uim_rval>::value, "is not 
copyable");

With my modification gcc starts considering the constructor from a 
normal unordered_set instance which is not deleted.

So we fall back to the problem of gcc not being SFINAE friendly enough. 
Is it a know issue ?

I still think that proposing a generalization of DR 1402 would be nice 
to simplify code but I now realize that the core issue is a compiler 
limitation. I add gcc mailing list just in case someone would like to react.

François



On 03/22/2013 09:36 PM, François Dumont wrote:
> Hi
>
>     I completed my little study on the 
> std::is_copy_assignable<std::pair<const int, int>> issue.
>
> On 03/15/2013 11:31 PM, Marc Glisse wrote:
>> So instead of having deleted functions we get the same as if there 
>> was no declaration? I thought this had already been proposed and 
>> rejected at the time (some people love features that prevent programs 
>> from compiling), but maybe it wasn't exactly the same. In any case, 
>> still worth trying again with the std::pair example.
>
>     I think it has been discuss indeed Marc. Surely during review of 
> DR 1402 which resolution is exactly what I had in mind but limited to 
> the move constructor and move assignment operator.
>
>     It hasn't been difficult for me then to tweak the joust function 
> in gcc/cp/call.c to remove this limitation of the DR 1402 resolution. 
> I then changed std::pair to have a defaulted copy and move assignment 
> operators and run libstdc++ tests without any regression. A test on 
> std::pair<int&, int&> also worked. So it doesn't seem to be a too 
> dangerous proposal.
>
>     Note that thanks to DR 1402 already applied to gcc I think that 
> using a defaulted move assignment operator for std::pair or std::tuple 
> wouldn't be a problem. Do you known why it is not defaulted ?
>
>     However it had no impact on the wrong result of 
> std::is_copy_assignable<std::pair<const int, int>>. I realized that 
> this problem is rather a compiler limitation. I thought that 
> std::is_copy_assignable was using some compiler support to detect that 
> copy assignment is deleted or not but it is not, it is simply checking 
> that the operator = (const T&) expression has a match. The problem is 
> that gcc do not check that the matches are not ill formed. Could gcc 
> detect in a SFINAE context that the expression is invalid ? Should I 
> file a PR for that or is it a known issue ?
>
>     I also find surprising that std::is_copy_assignable<int&> is true. 
> It introduces a little inconsistency between what the compiler 
> consider as copy assignable and the library feedback. Despite 
> std::is_copy_assignable<int&> being true the compiler is not able to 
> generate a copy assignment operator for std::pair<int&, int&>. Maybe I 
> am confusing std:::is_copy_assignable purpose with the 
> std::is_trivially_copy_assignable one ?
>
> François
>
>




More information about the Gcc mailing list