1 // { dg-do run { target c++11 } } 2 // { dg-options "-g -O0" } 3 4 // Copyright (C) 2012-2018 Free Software Foundation, Inc. 5 // 6 // This file is part of the GNU ISO C++ Library. This library is free 7 // software; you can redistribute it and/or modify it under the 8 // terms of the GNU General Public License as published by the 9 // Free Software Foundation; either version 3, or (at your option) 10 // any later version. 11 12 // This library is distributed in the hope that it will be useful, 13 // but WITHOUT ANY WARRANTY; without even the implied warranty of 14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 // GNU General Public License for more details. 16 17 // You should have received a copy of the GNU General Public License along 18 // with this library; see the file COPYING3. If not see 19 // <http://www.gnu.org/licenses/>. 20 21 #include <memory> 22 #include <iostream> 23 24 template<class T> 25 void placeholder(const T & s)26placeholder(const T &s) 27 { 28 std::cout << s; 29 } 30 31 template<class T> 32 void use(const T & p)33use(const T &p) 34 { 35 placeholder(&p); 36 } 37 operator ()deleter38struct deleter { void operator()(int*) {} }; 39 make(uintptr_t p)40std::shared_ptr<int> make(uintptr_t p) 41 { 42 return std::shared_ptr<int>(reinterpret_cast<int*>(p), deleter()); 43 } 44 45 int main()46main() 47 { 48 typedef std::shared_ptr<int> shared; 49 typedef std::weak_ptr<int> weak; 50 51 shared esp; 52 // { dg-final { note-test esp "std::shared_ptr<int> (empty) = {get() = 0x0}" } } 53 weak ewp1; 54 // { dg-final { note-test ewp1 "std::weak_ptr<int> (empty) = {get() = 0x0}" } } 55 weak ewp2 = esp; 56 // { dg-final { note-test ewp2 "std::weak_ptr<int> (empty) = {get() = 0x0}" } } 57 58 shared sp1 = make(0x12345678); 59 shared sp2 = sp1; 60 // { dg-final { note-test sp1 "std::shared_ptr<int> (use count 2, weak count 0) = {get() = 0x12345678}" } } 61 62 shared sp3 = make(0x12344321); 63 weak sp4 = sp3; 64 weak wp1 = sp3; 65 // { dg-final { note-test wp1 "std::weak_ptr<int> (use count 1, weak count 2) = {get() = 0x12344321}" } } 66 67 shared sp5 = make(0x56788765); 68 weak wp2 = sp5; 69 sp5.reset(); 70 // { dg-final { note-test wp2 "std::weak_ptr<int> (expired, weak count 1) = {get() = 0x56788765}" } } 71 72 placeholder(""); // Mark SPOT 73 use(esp); 74 use(ewp1); 75 use(ewp2); 76 use(sp1); 77 use(wp1); 78 use(wp2); 79 80 std::cout << "\n"; 81 return 0; 82 } 83 84 // { dg-final { gdb-test SPOT } } 85