blob: 9159b4108f8c5de7ca145dbee73fd7c4019b0701 [file] [log] [blame]
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: c++98, c++03
// type_traits
// extension
// template <typename _Tp> struct __has_operator_addressof
#include <type_traits>
#include "test_macros.h"
struct A
{
};
struct B
{
constexpr B* operator&() const;
};
struct D;
struct C
{
template <class U>
D operator,(U&&);
};
struct E
{
constexpr C operator&() const;
};
struct F {};
constexpr F* operator&(F const &) { return nullptr; }
struct G {};
constexpr G* operator&(G &&) { return nullptr; }
struct H {};
constexpr H* operator&(H const &&) { return nullptr; }
struct J
{
constexpr J* operator&() const &&;
};
int main(int, char**)
{
static_assert(std::__has_operator_addressof<int>::value == false, "");
static_assert(std::__has_operator_addressof<A>::value == false, "");
static_assert(std::__has_operator_addressof<B>::value == true, "");
static_assert(std::__has_operator_addressof<E>::value == true, "");
static_assert(std::__has_operator_addressof<F>::value == true, "");
static_assert(std::__has_operator_addressof<G>::value == true, "");
static_assert(std::__has_operator_addressof<H>::value == true, "");
static_assert(std::__has_operator_addressof<J>::value == true, "");
return 0;
}