Bug 48521

Summary: [4.5 Regression] [C++0x] std::result_of doesn't work with pointer to member
Product: gcc Reporter: Jonathan Wakely <redi>
Component: libstdc++Assignee: Jonathan Wakely <redi>
Status: RESOLVED FIXED    
Severity: normal Keywords: rejects-valid
Priority: P3    
Version: 4.6.0   
Target Milestone: 4.6.1   
Host: Target:
Build: Known to work: 4.6.1, 4.7.0
Known to fail: Last reconfirmed: 2011-04-08 21:16:52

Description Jonathan Wakely 2011-04-08 21:16:02 UTC
This is supposed to work, and did with 4.4:

#include <functional>
struct X
{
  int foo();
};

typedef int (X::*pm)();
std::result_of<pm()>::type i = 0;

This means we don't accept std::async(X::foo, ...) which is defined in terms of result_of

I think I intentionally removed support for pointers to members from result_of, because an earlier C++0x draft said it shouldn't work
Comment 1 Jonathan Wakely 2011-04-09 10:55:02 UTC
(In reply to comment #0)
> This means we don't accept std::async(X::foo, ...)

Oops, meant to say std::async(&X::foo, ...)
Comment 2 Jonathan Wakely 2011-04-16 19:53:27 UTC
I have a fix for this now, as well as a few issues in <functional> such as LWG 2017, 2021, missing deleted ref/cref overloads etc.
Comment 3 Paolo Carlini 2011-04-16 23:11:57 UTC
Excellent!
Comment 4 Jonathan Wakely 2011-04-17 20:28:36 UTC
I'm just trying to figure out whether to enumerate every type of member function w.r.t cv-qualifiers and ref-qualifiers and varargs as I think that's 8 partial specializations (24 when we get support for ref-qualifiers on member functions!) some of which are missing for mem_fn/_Mem_fn (see my mails to the reflector)
Comment 5 Jonathan Wakely 2011-04-18 21:43:36 UTC
(In reply to comment #0)
> This is supposed to work, and did with 4.4:
> 
> #include <functional>
> struct X
> {
>   int foo();
> };
> 
> typedef int (X::*pm)();
> std::result_of<pm()>::type i = 0;

Bah, that shouldn't work! But this should:

std::result_of<pm(X)>::type i = 0;
Comment 6 Jonathan Wakely 2011-04-19 13:26:15 UTC
Author: redi
Date: Tue Apr 19 13:26:08 2011
New Revision: 172709

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=172709
Log:
2011-04-19  Jonathan Wakely  <jwakely.gcc@gmail.com>

	PR libstdc++/48521
	* include/std/type_traits (result_of): Handle pointer to member.
	* include/std/functional (__invoke): Likewise.
	(_Function_to_function_pointer): Remove.
	(_Reference_wrapper_base): Provide nested types independent of
	unary_function and binary_function.
	(reference_wrapper::operator()): DR 2017.
	(ref(const A&&), cref(const A&&): Define as deleted.
	* include/std/future (async): Simplify SFINAE and use result_of to
	support pointer to member.
	* testsuite/20_util/reference_wrapper/invoke.cc: Test pointer to 
	member.
	* testsuite/20_util/reference_wrapper/24803.cc: Likewise.
	* testsuite/20_util/reference_wrapper/typedefs.cc: Test for types
	instead of derivation from unary_function and binary_function.
	* testsuite/20_util/declval/requirements/1_neg.cc: Adjust.
	* testsuite/20_util/reference_wrapper/invoke-2.cc: New.
	* testsuite/20_util/reference_wrapper/ref_neg.c: New.
	* testsuite/20_util/reference_wrapper/typedefs-3.c: New.

Added:
    trunk/libstdc++-v3/testsuite/20_util/reference_wrapper/invoke-2.cc
    trunk/libstdc++-v3/testsuite/20_util/reference_wrapper/ref_neg.cc
    trunk/libstdc++-v3/testsuite/20_util/reference_wrapper/typedefs-3.cc
Modified:
    trunk/libstdc++-v3/ChangeLog
    trunk/libstdc++-v3/include/std/functional
    trunk/libstdc++-v3/include/std/future
    trunk/libstdc++-v3/include/std/type_traits
    trunk/libstdc++-v3/testsuite/20_util/declval/requirements/1_neg.cc
    trunk/libstdc++-v3/testsuite/20_util/reference_wrapper/24803.cc
    trunk/libstdc++-v3/testsuite/20_util/reference_wrapper/invoke.cc
    trunk/libstdc++-v3/testsuite/20_util/reference_wrapper/typedefs.cc
Comment 7 Jonathan Wakely 2011-04-19 13:28:33 UTC
Fixed on trunk so far
Comment 8 Jonathan Wakely 2011-04-23 17:51:34 UTC
Author: redi
Date: Sat Apr 23 17:51:31 2011
New Revision: 172901

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=172901
Log:
2011-04-23  Jonathan Wakely  <jwakely.gcc@gmail.com>

	PR libstdc++/48521
	* include/std/type_traits (result_of): Handle pointer to member.
	* include/std/functional (__invoke): Likewise.
	(_Function_to_function_pointer): Remove.
	(_Reference_wrapper_base): Provide nested types independent of
	unary_function and binary_function.
	(reference_wrapper::operator()): DR 2017.
	(ref(const A&&), cref(const A&&): Define as deleted.
	* include/std/future (async): Simplify SFINAE and use result_of to
	support pointer to member.
	* testsuite/20_util/reference_wrapper/invoke.cc: Test pointer to 
	member.
	* testsuite/20_util/reference_wrapper/24803.cc: Likewise.
	* testsuite/20_util/reference_wrapper/typedefs.cc: Test for types
	instead of derivation from unary_function and binary_function.
	* testsuite/20_util/reference_wrapper/invoke-2.cc: New.
	* testsuite/20_util/reference_wrapper/ref_neg.c: New.
	* testsuite/20_util/reference_wrapper/typedefs-3.c: New.


Added:
    branches/gcc-4_6-branch/libstdc++-v3/testsuite/20_util/reference_wrapper/invoke-2.cc
    branches/gcc-4_6-branch/libstdc++-v3/testsuite/20_util/reference_wrapper/ref_neg.cc
    branches/gcc-4_6-branch/libstdc++-v3/testsuite/20_util/reference_wrapper/typedefs-3.cc
Modified:
    branches/gcc-4_6-branch/libstdc++-v3/ChangeLog
    branches/gcc-4_6-branch/libstdc++-v3/include/std/functional
    branches/gcc-4_6-branch/libstdc++-v3/include/std/future
    branches/gcc-4_6-branch/libstdc++-v3/include/std/type_traits
    branches/gcc-4_6-branch/libstdc++-v3/testsuite/20_util/reference_wrapper/24803.cc
    branches/gcc-4_6-branch/libstdc++-v3/testsuite/20_util/reference_wrapper/invoke.cc
    branches/gcc-4_6-branch/libstdc++-v3/testsuite/20_util/reference_wrapper/typedefs.cc
Comment 9 Jonathan Wakely 2011-04-23 17:54:45 UTC
fixed for 4.6.1

I don't plan to fix this on the 4.5 branch