fix bogus return value policy fallbacks (fixes #389)
diff --git a/include/pybind11/cast.h b/include/pybind11/cast.h
index c8c8f77..d28141a 100644
--- a/include/pybind11/cast.h
+++ b/include/pybind11/cast.h
@@ -220,14 +220,16 @@
             policy = return_value_policy::reference;
 
         if (policy == return_value_policy::copy) {
-            wrapper->value = copy_constructor(wrapper->value);
-            if (wrapper->value == nullptr)
+            if (copy_constructor)
+                wrapper->value = copy_constructor(wrapper->value);
+            else
                 throw cast_error("return_value_policy = copy, but the object is non-copyable!");
         } else if (policy == return_value_policy::move) {
-            wrapper->value = move_constructor(wrapper->value);
-            if (wrapper->value == nullptr)
+            if (move_constructor)
+                wrapper->value = move_constructor(wrapper->value);
+            else if (copy_constructor)
                 wrapper->value = copy_constructor(wrapper->value);
-            if (wrapper->value == nullptr)
+            else
                 throw cast_error("return_value_policy = move, but the object is neither movable nor copyable!");
         } else if (policy == return_value_policy::reference) {
             wrapper->owned = false;
diff --git a/tests/test_issues.cpp b/tests/test_issues.cpp
index 16a44c7..535ee39 100644
--- a/tests/test_issues.cpp
+++ b/tests/test_issues.cpp
@@ -172,6 +172,25 @@
     m2.def("get_NestA", [](const NestA &a) { return a.value; });
     m2.def("get_NestB", [](const NestB &b) { return b.value; });
     m2.def("get_NestC", [](const NestC &c) { return c.value; });
+
+    // Issue 389: r_v_p::move should fall-through to copy on non-movable objects
+    class MoveIssue1 {
+    public:
+        MoveIssue1(int v) : v{v} {}
+        MoveIssue1(const MoveIssue1 &c) { std::cerr << "copy ctor\n"; v=c.v; }
+        MoveIssue1(MoveIssue1 &&) = delete;
+        int v;
+    };
+    class MoveIssue2 {
+    public:
+        MoveIssue2(int v) : v{v} {}
+        MoveIssue2(MoveIssue2 &&) = default;
+        int v;
+    };
+    py::class_<MoveIssue1>(m2, "MoveIssue1").def(py::init<int>()).def_readwrite("value", &MoveIssue1::v);
+    py::class_<MoveIssue2>(m2, "MoveIssue2").def(py::init<int>()).def_readwrite("value", &MoveIssue2::v);
+    m2.def("get_moveissue1", [](int i) -> MoveIssue1 * { return new MoveIssue1(i); }, py::return_value_policy::move);
+    m2.def("get_moveissue2", [](int i) { return MoveIssue2(i); }, py::return_value_policy::move);
 }
 
 // MSVC workaround: trying to use a lambda here crashes MSCV
diff --git a/tests/test_issues.py b/tests/test_issues.py
index 38a5324..c1e0756 100644
--- a/tests/test_issues.py
+++ b/tests/test_issues.py
@@ -158,3 +158,11 @@
     assert abase.value == 42
     del abase, b
     gc.collect()
+
+
+def test_move_fallback():
+    from pybind11_tests.issues import get_moveissue1, get_moveissue2
+    m2 = get_moveissue2(2)
+    assert m2.value == 2
+    m1 = get_moveissue1(1)
+    assert m1.value == 1