diff --git a/src/operator/Producer.cpp b/src/operator/Producer.cpp index 3d48b88ab400596d68cbfa34502e795766ff94f0..9af4586886fc98c50862672392d3b704e6bc1d0c 100644 --- a/src/operator/Producer.cpp +++ b/src/operator/Producer.cpp @@ -44,7 +44,7 @@ Aidge::Producer_Op::Producer_Op(const std::shared_ptr<Aidge::Tensor> tensor, boo attr<ProdAttr::Constant>(constant))) { mOutputs[0] = tensor; // copy the pointer of the Tensor - if (mOutputs[0]->getImpl() && Registrar<Producer_Op>::exists({mOutputs[0]->getImpl()->backend()})){ + if (mOutputs[0] && mOutputs[0]->hasImpl() && Registrar<Producer_Op>::exists({mOutputs[0]->getImpl()->backend()})){ SET_IMPL_MACRO(Producer_Op, *this, mOutputs[0]->getImpl()->backend()); } else { @@ -61,7 +61,7 @@ Aidge::Producer_Op::Producer_Op(const Aidge::Producer_Op& op) : OperatorTensor(op), mAttributes(op.mAttributes) { - mOutputs[0] = std::make_shared<Tensor>(*(op.getOutput(0))); + *mOutputs[0] = *(op.getOutput(0)); if (mOutputs[0]->getImpl() && Registrar<Producer_Op>::exists({mOutputs[0]->getImpl()->backend()})){ SET_IMPL_MACRO(Producer_Op, *this, mOutputs[0]->getImpl()->backend()); } @@ -71,7 +71,12 @@ Aidge::Producer_Op::Producer_Op(const Aidge::Producer_Op& op) } std::shared_ptr<Aidge::Operator> Aidge::Producer_Op::clone() const { - return std::make_shared<Producer_Op>(*this); + // mOutput cannot be nullptr because of OperatorTensor constructor + std::shared_ptr<Tensor> newTensor = std::make_shared<Tensor>(mOutputs[0]->clone()); + + std::shared_ptr<Producer_Op> newOp = std::make_shared<Producer_Op>(newTensor, constant()); + + return newOp; } void Aidge::Producer_Op::setBackend(const std::string& name, Aidge::DeviceIdx_t device) {