http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52988
Jonathan Wakely <redi at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|ASSIGNED |NEW
AssignedTo|redi at gcc dot gnu.org |unassigned at gcc dot
| |gnu.org
--- Comment #4 from Jonathan Wakely <redi at gcc dot gnu.org> 2012-04-28
20:17:35 UTC ---
Unassigning myself as I think this is a FE issue.
I haven't been able to reduce this to something smaller but
-fdump-tree-original also shows the nullptr_t case just returns without
invoking the deferred function:
for future<int> it's OK
;; Function _Res std::future<_Res>::get() [with _Res = int] (null)
;; enabled by -tree-original
{
struct _Reset __reset;
struct _Reset __reset;
<<cleanup_point <<< Unknown tree: expr_stmt
std::__basic_future<int>::_Reset::_Reset (&__reset, (struct __basic_future &)
&((struct future *) this)->D.52275) >>>>>;
try
{
<<cleanup_point return <retval> = *std::move<int&> ((int &) (int *)
std::__future_base::_Result<int>::_M_value ((struct _Result *)
std::__basic_future<int>::_M_get_result (&((struct future *)
this)->D.52275)))>>;
}
finally
{
std::__basic_future<int>::_Reset::~_Reset (&__reset);
}
}
And for future<nullptr_t> it's not
;; Function _Res std::future<_Res>::get() [with _Res = std::nullptr_t] (null)
;; enabled by -tree-original
{
struct _Reset __reset;
struct _Reset __reset;
<<cleanup_point <<< Unknown tree: expr_stmt
std::__basic_future<std::nullptr_t>::_Reset::_Reset (&__reset, (struct
__basic_future &) &((struct future *) this)->D.51987) >>>>>;
try
{
return <retval> = 0;
}
finally
{
std::__basic_future<std::nullptr_t>::_Reset::~_Reset (&__reset);
}
}