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 Bastienint 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