Fix copy and move constructors
diff --git a/aten/src/ATen/Scalar.h b/aten/src/ATen/Scalar.h
index 97f866fa..df645c4 100644
--- a/aten/src/ATen/Scalar.h
+++ b/aten/src/ATen/Scalar.h
@@ -4,6 +4,7 @@
 #include <stdint.h>
 #include <stdexcept>
 #include <string>
+#include <utility>
 
 #include "ATen/ATenGeneral.h"
 #include "ATen/Half.h"
@@ -27,6 +28,26 @@
 
   explicit Scalar(const Tensor & t);
 
+  Scalar(const Scalar & rhs)
+  : tag(rhs.tag), v(rhs.v) {
+    if (Tag::HAS_t == tag && v.t) {
+      v.t->retain();
+    }
+  }
+  Scalar(Scalar && rhs) noexcept
+  : tag(rhs.tag), v(rhs.v) {
+    rhs.tag = Tag::HAS_i;
+    rhs.v.i = 0;
+  }
+  Scalar & operator=(Scalar && rhs) {
+    std::swap(this->tag, rhs.tag);
+    std::swap(this->v, rhs.v);
+    return *this;
+  }
+  Scalar & operator=(const Scalar & rhs) {
+    return *this = Scalar{rhs};
+  }
+
 #define DEFINE_IMPLICIT_CTOR(type,name,member) \
   Scalar(type vv) \
   : tag(Tag::HAS_##member) { \
diff --git a/aten/src/ATen/test/scalar_test.cpp b/aten/src/ATen/test/scalar_test.cpp
index 18b2f5f..f54e6904 100644
--- a/aten/src/ATen/test/scalar_test.cpp
+++ b/aten/src/ATen/test/scalar_test.cpp
@@ -25,6 +25,21 @@
   static void CUDA(const Type & t, Tensor a, Tensor b) {}
 };
 
+void test_ctors() {
+  // create scalars backed by tensors
+  auto s1 = Scalar(CPU(kFloat).scalarTensor(1));
+  auto s2 = Scalar(CPU(kFloat).scalarTensor(2));
+  Scalar{s1};
+  Scalar{std::move(s2)};
+  ASSERT(s2.isIntegral() && s2.toInt() == 0);
+  s2 = s1;
+  ASSERT(s2.isBackedByTensor() && s2.toFloat() == 1.0);
+  Scalar s3;
+  s3 = std::move(s2);
+  ASSERT(s2.isIntegral() && s2.toInt() == 0);
+  ASSERT(s3.isBackedByTensor() && s3.toFloat() == 1.0);
+}
+
 int main() {
   Scalar what = 257;
   Scalar bar = 3.0;
@@ -71,6 +86,8 @@
   }
   ASSERT(threw);
 
+  test_ctors();
+
   if(at::hasCUDA()) {
     auto r = CUDA(Float).copy(next_h);