brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.0 KiB · 628538e Raw
83 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++14, c++17, c++2010 11// constexpr const T& operator*() const & noexcept;12// constexpr T& operator*() & noexcept;13// constexpr T&& operator*() && noexcept;14// constexpr const T&& operator*() const && noexcept;15 16#include <cassert>17#include <concepts>18#include <expected>19#include <type_traits>20#include <utility>21 22#include "test_macros.h"23 24// Test noexcept25template <class T>26concept DerefNoexcept =27    requires(T t) {28      { std::forward<T>(t).operator*() } noexcept;29    };30 31static_assert(!DerefNoexcept<int>);32 33static_assert(DerefNoexcept<std::expected<int, int>&>);34static_assert(DerefNoexcept<const std::expected<int, int>&>);35static_assert(DerefNoexcept<std::expected<int, int>&&>);36static_assert(DerefNoexcept<const std::expected<int, int>&&>);37 38constexpr bool test() {39  // non-const &40  {41    std::expected<int, int> e(5);42    decltype(auto) x = *e;43    static_assert(std::same_as<decltype(x), int&>);44    assert(&x == &(e.value()));45    assert(x == 5);46  }47 48  // const &49  {50    const std::expected<int, int> e(5);51    decltype(auto) x = *e;52    static_assert(std::same_as<decltype(x), const int&>);53    assert(&x == &(e.value()));54    assert(x == 5);55  }56 57  // non-const &&58  {59    std::expected<int, int> e(5);60    decltype(auto) x = *std::move(e);61    static_assert(std::same_as<decltype(x), int&&>);62    assert(&x == &(e.value()));63    assert(x == 5);64  }65 66  // const &&67  {68    const std::expected<int, int> e(5);69    decltype(auto) x = *std::move(e);70    static_assert(std::same_as<decltype(x), const int&&>);71    assert(&x == &(e.value()));72    assert(x == 5);73  }74 75  return true;76}77 78int main(int, char**) {79  test();80  static_assert(test());81  return 0;82}83