blob: af97be7c35eff3fa2f5e706ab933261788b92731 [file] [log] [blame]
// PR c++/64352
// { dg-do compile { target c++11 } }
template<bool B> struct bool_type
{ static constexpr bool value = B; };
using true_type = bool_type<true>;
using false_type = bool_type<false>;
template<typename T> T&& declval();
template<typename...> struct void_ { using type = void; };
template<typename... I> using void_t = typename void_<I...>::type;
template<typename _Tp, typename = void>
struct _Has_addressof_free: false_type { };
template<typename _Tp>
struct _Has_addressof_free
<_Tp, void_t<decltype( operator&(declval<const _Tp&>()) )>>
: true_type { };
struct foo {};
void operator&(foo) = delete;
int main()
{
static_assert( !_Has_addressof_free<int>::value, "" );
// error: use of deleted function 'void operator&(foo)'
static_assert( !_Has_addressof_free<foo>::value, "" );
}