brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.7 KiB · e9694fd Raw
79 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++03, c++11, c++1410// <optional>11 12// constexpr const T* optional<T>::operator->() const;13 14#include <optional>15#include <type_traits>16#include <cassert>17 18#include "test_macros.h"19 20using std::optional;21 22struct X23{24    constexpr int test() const {return 3;}25};26 27struct Y28{29    int test() const noexcept {return 2;}30};31 32struct Z33{34    const Z* operator&() const;35    constexpr int test() const {return 1;}36};37 38int main(int, char**)39{40    {41        const std::optional<X> opt; ((void)opt);42        ASSERT_SAME_TYPE(decltype(opt.operator->()), X const*);43        ASSERT_NOEXCEPT(opt.operator->());44    }45    {46        constexpr optional<X> opt(X{});47        static_assert(opt->test() == 3, "");48    }49    {50        constexpr optional<Y> opt(Y{});51        assert(opt->test() == 2);52    }53    {54        constexpr optional<Z> opt(Z{});55        static_assert(opt->test() == 1, "");56    }57#if TEST_STD_VER >= 2658    {59      X x{};60      const std::optional<X&> opt(x);61      ASSERT_SAME_TYPE(decltype(opt.operator->()), X*);62      ASSERT_NOEXCEPT(opt.operator->());63    }64    {65      X x{};66      const std::optional<const X&> opt(x);67      ASSERT_SAME_TYPE(decltype(opt.operator->()), const X*);68      ASSERT_NOEXCEPT(opt.operator->());69    }70    {71      static constexpr Z z{};72      constexpr optional<const Z&> opt(z);73      static_assert(opt->test() == 1);74    }75#endif76 77    return 0;78}79