(root)/
gcc-13.2.0/
libstdc++-v3/
testsuite/
20_util/
optional/
observers/
lwg2762.cc
// { dg-do compile { target c++17 }  }

// LWG 2762 adds noexcept to operator-> and operator*
#include <optional>

struct S
{
  void can_throw();
  void cannot_throw() noexcept;
};

static_assert( ! noexcept(std::declval<std::optional<S>&>()->can_throw()) );
static_assert( noexcept(std::declval<std::optional<S>&>()->cannot_throw()) );

static_assert( noexcept(std::declval<std::optional<S>&>().operator->()) );
static_assert( noexcept(std::declval<std::optional<int>&>().operator->()) );

static_assert( noexcept(*std::declval<std::optional<int>&>()) );
static_assert( noexcept(*std::declval<const std::optional<int>&>()) );
static_assert( noexcept(*std::declval<std::optional<int>&&>()) );
static_assert( noexcept(*std::declval<const std::optional<int>&&>()) );