15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier 
95a83710eSEric Fiselier // <memory>
105a83710eSEric Fiselier 
115a83710eSEric Fiselier // template<class Y> explicit shared_ptr(Y* p);
125a83710eSEric Fiselier 
135a83710eSEric Fiselier #include <memory>
145a83710eSEric Fiselier #include <cassert>
155a83710eSEric Fiselier 
167fc6a556SMarshall Clow #include "test_macros.h"
177fc6a556SMarshall Clow 
185a83710eSEric Fiselier struct A
195a83710eSEric Fiselier {
205a83710eSEric Fiselier     static int count;
215a83710eSEric Fiselier 
AA225a83710eSEric Fiselier     A() {++count;}
AA235a83710eSEric Fiselier     A(const A&) {++count;}
~AA245a83710eSEric Fiselier     ~A() {--count;}
255a83710eSEric Fiselier };
265a83710eSEric Fiselier 
275a83710eSEric Fiselier int A::count = 0;
285a83710eSEric Fiselier 
main(int,char **)292df59c50SJF Bastien int main(int, char**)
305a83710eSEric Fiselier {
315a83710eSEric Fiselier     {
32*6b9e0af8SLouis Dionne         assert(A::count == 0);
335a83710eSEric Fiselier         A* ptr = new A;
345a83710eSEric Fiselier         std::shared_ptr<A> p(ptr);
355a83710eSEric Fiselier         assert(A::count == 1);
365a83710eSEric Fiselier         assert(p.use_count() == 1);
375a83710eSEric Fiselier         assert(p.get() == ptr);
385a83710eSEric Fiselier     }
39*6b9e0af8SLouis Dionne 
40276ca873SLouis Dionne     {
41*6b9e0af8SLouis Dionne         assert(A::count == 0);
42*6b9e0af8SLouis Dionne         A const* ptr = new A;
43*6b9e0af8SLouis Dionne         std::shared_ptr<A const> p(ptr);
44*6b9e0af8SLouis Dionne         assert(A::count == 1);
45*6b9e0af8SLouis Dionne         assert(p.use_count() == 1);
46*6b9e0af8SLouis Dionne         assert(p.get() == ptr);
47*6b9e0af8SLouis Dionne     }
48*6b9e0af8SLouis Dionne 
49*6b9e0af8SLouis Dionne     {
50*6b9e0af8SLouis Dionne         assert(A::count == 0);
515a83710eSEric Fiselier         A* ptr = new A;
525a83710eSEric Fiselier         std::shared_ptr<void> p(ptr);
535a83710eSEric Fiselier         assert(A::count == 1);
545a83710eSEric Fiselier         assert(p.use_count() == 1);
555a83710eSEric Fiselier         assert(p.get() == ptr);
565a83710eSEric Fiselier     }
572df59c50SJF Bastien 
58ce195fb2Szoecarver #if TEST_STD_VER > 14
59ce195fb2Szoecarver     {
60*6b9e0af8SLouis Dionne         assert(A::count == 0);
61ce195fb2Szoecarver         std::shared_ptr<A[8]> pA(new A[8]);
62ce195fb2Szoecarver         assert(pA.use_count() == 1);
63ce195fb2Szoecarver         assert(A::count == 8);
64ce195fb2Szoecarver     }
65ce195fb2Szoecarver 
66ce195fb2Szoecarver     {
67*6b9e0af8SLouis Dionne         assert(A::count == 0);
68ce195fb2Szoecarver         std::shared_ptr<A[]> pA(new A[8]);
69ce195fb2Szoecarver         assert(pA.use_count() == 1);
70ce195fb2Szoecarver         assert(A::count == 8);
71ce195fb2Szoecarver     }
72b84da5baSKonstantin Varlamov 
73b84da5baSKonstantin Varlamov     {
74*6b9e0af8SLouis Dionne           assert(A::count == 0);
75b84da5baSKonstantin Varlamov         std::shared_ptr<const A[]> pA(new A[8]);
76b84da5baSKonstantin Varlamov         assert(pA.use_count() == 1);
77b84da5baSKonstantin Varlamov         assert(A::count == 8);
78b84da5baSKonstantin Varlamov     }
79ce195fb2Szoecarver #endif
80ce195fb2Szoecarver 
812df59c50SJF Bastien     return 0;
825a83710eSEric Fiselier }
83