diff options
Diffstat (limited to 'meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0129-2011-04-15-Daniel-Krugler-daniel.kruegler-googlemail.patch')
-rw-r--r-- | meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0129-2011-04-15-Daniel-Krugler-daniel.kruegler-googlemail.patch | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0129-2011-04-15-Daniel-Krugler-daniel.kruegler-googlemail.patch b/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0129-2011-04-15-Daniel-Krugler-daniel.kruegler-googlemail.patch new file mode 100644 index 000000000..8fba41287 --- /dev/null +++ b/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0129-2011-04-15-Daniel-Krugler-daniel.kruegler-googlemail.patch @@ -0,0 +1,143 @@ +From 2ce87b6b9c9143a22381eec77bbf1fd7016e132d Mon Sep 17 00:00:00 2001 +From: paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> +Date: Sat, 16 Apr 2011 00:55:53 +0000 +Subject: [PATCH 129/200] 2011-04-15 Daniel Krugler <daniel.kruegler@googlemail.com> + Paolo Carlini <paolo.carlini@oracle.com> + + PR libstdc++/48635 + * include/bits/unique_ptr.h (unique_ptr<>::operator=(unique_ptr&&), + unique_ptr<>::operator=(unique_ptr<>&&), + unique_ptr<_Tp[],>::operator=(unique_ptr&&), + unique_ptr<_Tp[],>::operator=(unique_ptr<>&&)): Forward the deleter + instead of moving it. + * testsuite/20_util/unique_ptr/assign/48635.cc: New. + + +git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch@172533 138bc75d-0d04-0410-961f-82ee72b054a4 + +index 5df4325..1be2e7a 100644 +--- a/libstdc++-v3/include/bits/unique_ptr.h ++++ b/libstdc++-v3/include/bits/unique_ptr.h +@@ -171,7 +171,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION + operator=(unique_ptr&& __u) + { + reset(__u.release()); +- get_deleter() = std::move(__u.get_deleter()); ++ get_deleter() = std::forward<deleter_type>(__u.get_deleter()); + return *this; + } + +@@ -184,7 +184,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION + operator=(unique_ptr<_Up, _Ep>&& __u) + { + reset(__u.release()); +- get_deleter() = std::move(__u.get_deleter()); ++ get_deleter() = std::forward<deleter_type>(__u.get_deleter()); + return *this; + } + +@@ -315,7 +315,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION + operator=(unique_ptr&& __u) + { + reset(__u.release()); +- get_deleter() = std::move(__u.get_deleter()); ++ get_deleter() = std::forward<deleter_type>(__u.get_deleter()); + return *this; + } + +@@ -324,7 +324,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION + operator=(unique_ptr<_Up, _Ep>&& __u) + { + reset(__u.release()); +- get_deleter() = std::move(__u.get_deleter()); ++ get_deleter() = std::forward<deleter_type>(__u.get_deleter()); + return *this; + } + +diff --git a/libstdc++-v3/testsuite/20_util/unique_ptr/assign/48635.cc b/libstdc++-v3/testsuite/20_util/unique_ptr/assign/48635.cc +new file mode 100644 +index 0000000..99b412b +--- /dev/null ++++ b/libstdc++-v3/testsuite/20_util/unique_ptr/assign/48635.cc +@@ -0,0 +1,78 @@ ++// { dg-options "-std=gnu++0x" } ++ ++// Copyright (C) 2011 Free Software Foundation ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 3, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING3. If not see ++// <http://www.gnu.org/licenses/>. ++ ++#include <memory> ++#include <testsuite_hooks.h> ++ ++struct Deleter ++{ ++ Deleter() = default; ++ Deleter(const Deleter&) = default; ++ Deleter(Deleter&&) = default; ++ ++ Deleter& ++ operator=(const Deleter&) ++ { ++ bool test __attribute__((unused)) = true; ++ VERIFY( true ); ++ return *this; ++ } ++ ++ Deleter& ++ operator=(Deleter&&) ++ { ++ bool test __attribute__((unused)) = true; ++ VERIFY( false ); ++ return *this; ++ } ++ ++ template<class T> ++ void ++ operator()(T*) const { } ++}; ++ ++struct DDeleter : Deleter { }; ++ ++// libstdc++/48635 ++void test01() ++{ ++ Deleter d; ++ ++ std::unique_ptr<int, Deleter&> p1(nullptr, d), p2(nullptr, d); ++ p2 = std::move(p1); ++ ++ DDeleter dd; ++ ++ std::unique_ptr<int, DDeleter&> p1t(nullptr, dd); ++ std::unique_ptr<int, Deleter&> p2t(nullptr, d); ++ p2t = std::move(p1t); ++ ++ std::unique_ptr<int[], Deleter&> p1a(nullptr, d), p2a(nullptr, d); ++ p2a = std::move(p1a); ++ ++ std::unique_ptr<int[], DDeleter&> p1at(nullptr, dd); ++ std::unique_ptr<int[], Deleter&> p2at(nullptr, d); ++ p2at = std::move(p1at); ++} ++ ++int main() ++{ ++ test01(); ++ return 0; ++} +-- +1.7.0.4 + |