1*7a62bee6SZoe Carver // -*- C++ -*- 2*7a62bee6SZoe Carver //===----------------------------------------------------------------------===// 3*7a62bee6SZoe Carver // 4*7a62bee6SZoe Carver // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5*7a62bee6SZoe Carver // See https://llvm.org/LICENSE.txt for license information. 6*7a62bee6SZoe Carver // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7*7a62bee6SZoe Carver // 8*7a62bee6SZoe Carver //===----------------------------------------------------------------------===// 9*7a62bee6SZoe Carver 10*7a62bee6SZoe Carver // UNSUPPORTED: c++03, c++11, c++14 11*7a62bee6SZoe Carver // REQUIRES: c++experimental 12*7a62bee6SZoe Carver 13*7a62bee6SZoe Carver // <experimental/memory> 14*7a62bee6SZoe Carver 15*7a62bee6SZoe Carver // observer_ptr 16*7a62bee6SZoe Carver // 17*7a62bee6SZoe Carver // constexpr element_type* get() const noexcept; 18*7a62bee6SZoe Carver 19*7a62bee6SZoe Carver #include <experimental/memory> 20*7a62bee6SZoe Carver #include <type_traits> 21*7a62bee6SZoe Carver #include <cassert> 22*7a62bee6SZoe Carver 23*7a62bee6SZoe Carver template <class T, class Object = T> test_get()24*7a62bee6SZoe Carverconstexpr void test_get() { 25*7a62bee6SZoe Carver using Ptr = std::experimental::observer_ptr<T>; 26*7a62bee6SZoe Carver Object obj; 27*7a62bee6SZoe Carver 28*7a62bee6SZoe Carver Ptr const ptr(&obj); 29*7a62bee6SZoe Carver assert(ptr.get() == &obj); 30*7a62bee6SZoe Carver 31*7a62bee6SZoe Carver static_assert(noexcept(ptr.get())); 32*7a62bee6SZoe Carver static_assert(std::is_same<decltype(ptr.get()), T*>::value); 33*7a62bee6SZoe Carver } 34*7a62bee6SZoe Carver 35*7a62bee6SZoe Carver struct Bar {}; 36*7a62bee6SZoe Carver test()37*7a62bee6SZoe Carverconstexpr bool test() { 38*7a62bee6SZoe Carver test_get<Bar>(); 39*7a62bee6SZoe Carver test_get<int>(); 40*7a62bee6SZoe Carver test_get<void, int>(); 41*7a62bee6SZoe Carver 42*7a62bee6SZoe Carver return true; 43*7a62bee6SZoe Carver } 44*7a62bee6SZoe Carver main(int,char **)45*7a62bee6SZoe Carverint main(int, char**) { 46*7a62bee6SZoe Carver test(); 47*7a62bee6SZoe Carver static_assert(test()); 48*7a62bee6SZoe Carver 49*7a62bee6SZoe Carver return 0; 50*7a62bee6SZoe Carver } 51