2017-02-14 Jonathan Wakely <jwakely@redhat.com>
+ Backport from mainline
+ 2017-01-20 Jonathan Wakely <jwakely@redhat.com>
+
+ PR libstdc++/69321
+ * include/experimental/any (__any_caster): Avoid instantiating
+ manager function for types that can't be stored in any.
+ * testsuite/experimental/any/misc/any_cast.cc: Test non-copyable type.
+ * testsuite/experimental/any/misc/any_cast_neg.cc: Adjust dg-error.
+
Backport from mainline
2017-01-18 Jonathan Wakely <jwakely@redhat.com>
_Storage _M_storage;
template<typename _Tp>
- friend void* __any_caster(const any* __any)
- {
- if (__any->_M_manager != &_Manager<decay_t<_Tp>>::_S_manage)
- return nullptr;
- _Arg __arg;
- __any->_M_manager(_Op_access, __any, &__arg);
- return __arg._M_obj;
- }
+ friend void* __any_caster(const any* __any);
// Manage in-place contained object.
template<typename _Tp>
}
// @}
+ template<typename _Tp>
+ void* __any_caster(const any* __any)
+ {
+ struct _None { };
+ using _Up = decay_t<_Tp>;
+ using _Vp = conditional_t<is_copy_constructible<_Up>::value, _Up, _None>;
+ if (__any->_M_manager != &any::_Manager<_Vp>::_S_manage)
+ return nullptr;
+ any::_Arg __arg;
+ __any->_M_manager(any::_Op_access, __any, &__arg);
+ return __arg._M_obj;
+ }
+
/**
* @brief Access the contained object.
*