[libc++] Add a test for resizing of a vector with copy-only elements
authorLouis Dionne <ldionne@apple.com>
Thu, 5 Sep 2019 13:50:18 +0000 (13:50 +0000)
committerLouis Dionne <ldionne@apple.com>
Thu, 5 Sep 2019 13:50:18 +0000 (13:50 +0000)
See https://reviews.llvm.org/D62228#1658620

llvm-svn: 371067

libcxx/test/std/containers/sequences/vector/vector.modifiers/resize.copy_only.pass.sh.cpp [new file with mode: 0644]

diff --git a/libcxx/test/std/containers/sequences/vector/vector.modifiers/resize.copy_only.pass.sh.cpp b/libcxx/test/std/containers/sequences/vector/vector.modifiers/resize.copy_only.pass.sh.cpp
new file mode 100644 (file)
index 0000000..b24736e
--- /dev/null
@@ -0,0 +1,45 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++98, c++03
+
+// RUN: %build -fno-exceptions
+// RUN: %run
+
+// RUN: %build
+// RUN: %run
+
+// UNSUPPORTED: c++98, c++03
+
+// <vector>
+
+// Test that vector won't try to call the move constructor when resizing if
+// the class has a deleted move constructor (but a working copy constructor).
+
+#include <vector>
+
+class CopyOnly {
+public:
+  CopyOnly() { }
+
+  CopyOnly(CopyOnly&&) = delete;
+  CopyOnly& operator=(CopyOnly&&) = delete;
+
+  CopyOnly(const CopyOnly&) = default;
+  CopyOnly& operator=(const CopyOnly&) = default;
+};
+
+int main() {
+    std::vector<CopyOnly> x;
+    x.emplace_back();
+
+    CopyOnly c;
+    x.push_back(c);
+
+    return 0;
+}