brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.9 KiB · f0abba0 Raw
76 lines · cpp
1// -*- C++ -*-2//===----------------------------------------------------------------------===//3//4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.5// See https://llvm.org/LICENSE.txt for license information.6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception7//8//===----------------------------------------------------------------------===//9 10// UNSUPPORTED: c++03, c++11, c++1411// REQUIRES: c++experimental12 13// <experimental/memory>14 15// observer_ptr16//17// template <class W2>18// constexpr observer_ptr(observer_ptr<W2> other) noexcept;19 20#include <experimental/memory>21#include <type_traits>22#include <cassert>23 24#include "test_macros.h"25 26template <class To, class From>27constexpr void test_converting_ctor() {28  using ToPtr   = std::experimental::observer_ptr<To>;29  using FromPtr = std::experimental::observer_ptr<From>;30  From obj;31  FromPtr from(&obj);32  ToPtr to = from;33 34  assert(from.get() == &obj);35  assert(to.get() == &obj);36#if TEST_STD_VER >= 2037  static_assert(std::is_nothrow_convertible<FromPtr, ToPtr>::value);38#endif39}40 41template <class To, class From>42constexpr void check_non_constructible() {43  using ToPtr   = std::experimental::observer_ptr<To>;44  using FromPtr = std::experimental::observer_ptr<From>;45  static_assert(!std::is_constructible<ToPtr, FromPtr>::value);46}47 48struct Bar {};49struct Base {};50struct Derived : Base {};51 52constexpr bool test() {53  test_converting_ctor<void, Bar>();54  test_converting_ctor<void, int>();55  test_converting_ctor<Base, Derived>();56 57  check_non_constructible<Derived, Base>();58  check_non_constructible<int, void>();59  check_non_constructible<Bar, void>();60  check_non_constructible<int, long>();61  check_non_constructible<long, int>();62 63  // Check const-ness64  check_non_constructible<Bar, Bar const>();65  test_converting_ctor<Bar const, Bar>();66 67  return true;68}69 70int main(int, char**) {71  test();72  static_assert(test());73 74  return 0;75}76