xref: /llvm-project/libcxx/test/std/experimental/memory/memory.observer.ptr/get.pass.cpp (revision 7a62bee611f1c451fa026c146b03a3a277a5a1dd)
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 Carver constexpr 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 Carver constexpr 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 Carver int 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