blob: ea067eb3af3b2bbb0adcbb8f0eb9ab9094075ac6 [file] [log] [blame]
// { dg-do compile { target c++11 } }
#include <memory>
// 2762. unique_ptr operator*() should be noexcept
static_assert( noexcept(*std::declval<std::unique_ptr<long>>()), "LWG 2762" );
template<bool B>
struct deleter
{
struct pointer
{
int& operator*() && noexcept(B); // this is used by unique_ptr
int& operator*() const& = delete; // this should not be
int* operator->() noexcept(false); // noexcept here doesn't affect anything
// Needed for NullablePointer requirements
pointer(int* = nullptr);
bool operator==(const pointer&) const noexcept;
bool operator!=(const pointer&) const noexcept;
};
void operator()(pointer) const noexcept { }
};
template<typename T, bool Nothrow>
using UPtr = std::unique_ptr<T, deleter<Nothrow>>;
// noexcept-specifier depends on the pointer type
static_assert( noexcept(*std::declval<UPtr<int, true>&>()), "LWG 2762" );
static_assert( ! noexcept(*std::declval<UPtr<int, false>&>()), "LWG 2762" );
// This has always been required, even in C++11.
static_assert( noexcept(std::declval<std::unique_ptr<long>>().operator->()),
"operator-> is always noexcept" );
static_assert( noexcept(std::declval<UPtr<int, false>&>().operator->()),
"operator-> is always noexcept" );