-// { dg-do compile }
-// { dg-options "-std=gnu++0x" }
+// { dg-do compile { target c++11 } }
-// Copyright (C) 2008, 2009 Free Software Foundation
+// Copyright (C) 2008-2017 Free Software Foundation, Inc.
//
// 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 2, or (at your option)
+// 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,
// 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 COPYING. If not, write to
-// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
-// Boston, MA 02110-1301, USA.
+// along with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
#include <memory>
test02()
{
std::unique_ptr<int[]> p1(new int(420));
- std::unique_ptr<int[]> p2 = p1;
+ std::unique_ptr<int[]> p2 = p1; // { dg-error "deleted" }
}
void
test03()
{
- std::unique_ptr<int[2]> p1(new int[3]);
- std::unique_ptr<int[2]> p2 = p1;
+ std::unique_ptr<int[2]> p1(new int[3]); // { dg-error "no match" }
+ std::unique_ptr<int[2]> p2 = p1; // { dg-error "deleted" }
}
-// { dg-error "used here" "" { target *-*-* } 43 }
-// { dg-error "no matching" "" { target *-*-* } 49 }
-// { dg-error "used here" "" { target *-*-* } 50 }
-// { dg-error "candidates are" "" { target *-*-* } 219 }
-// { dg-error "deleted function" "" { target *-*-* } 219 }
-// { dg-error "deleted function" "" { target *-*-* } 365 }
-// { dg-excess-errors "note" }
+struct base_pointer { operator base*() const { return nullptr; } };
+
+template<typename T>
+struct deleter
+{
+ deleter() = default;
+ template<typename U>
+ deleter(const deleter<U>) { }
+ typedef T pointer;
+ void operator()(T) const { }
+};
+
+void
+test04()
+{
+ // Disallow conversions from incompatible deleter
+ std::unique_ptr<derived[], deleter<base_pointer>> p;
+ std::unique_ptr<base[], deleter<base*>> upA;
+ upA = std::move(p); // { dg-error "no match" }
+}
+
+// { dg-prune-output "include" }