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);