COMPMID-556 Add macro for checking graph's tensor object

Change-Id: I1de1c2932c9906b23b49e18bd82c173846d98723
Reviewed-on: http://mpd-gerrit.cambridge.arm.com/93860
Tested-by: Kaizen <jeremy.johnson+kaizengerrit@arm.com>
Reviewed-by: Anthony Barbier <anthony.barbier@arm.com>
Reviewed-by: Pablo Tello <pablo.tello@arm.com>
diff --git a/arm_compute/graph/Error.h b/arm_compute/graph/Error.h
new file mode 100644
index 0000000..0c8ed26
--- /dev/null
+++ b/arm_compute/graph/Error.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef __ARM_COMPUTE_GRAPH_ERROR_H__
+#define __ARM_COMPUTE_GRAPH_ERROR_H__
+
+#include "arm_compute/graph/ITensorObject.h"
+
+namespace arm_compute
+{
+namespace graph
+{
+/** Evaluate if a tensor object is null. If the condition is true then an error message is printed and an exception thrown
+ *
+ * @param[in] function       Function in which the error occurred.
+ * @param[in] file           Name of the file where the error occurred.
+ * @param[in] line           Line on which the error occurred.
+ * @param[in] tensor_object  Tensor object to evaluate
+ * @param[in] tensor_objects (Optional) Further allowed tensor objects.
+ */
+template <typename... Ts>
+void error_on_unallocated_tensor_object(const char *function, const char *file, int line,
+                                        const ITensorObject *tensor_object, Ts... tensor_objects)
+{
+    ARM_COMPUTE_UNUSED(function);
+    ARM_COMPUTE_UNUSED(file);
+    ARM_COMPUTE_UNUSED(line);
+    ARM_COMPUTE_UNUSED(tensor_object);
+
+    ARM_COMPUTE_ERROR_ON_LOC(tensor_object == nullptr || tensor_object->tensor() == nullptr, function, file, line);
+
+    const std::array<const ITensorObject *, sizeof...(Ts)> tensor_objects_array{ { std::forward<Ts>(tensor_objects)... } };
+    ARM_COMPUTE_UNUSED(tensor_objects_array);
+
+    ARM_COMPUTE_ERROR_ON_LOC(std::any_of(tensor_objects_array.begin(), tensor_objects_array.end(), [&](const ITensorObject * tensor_obj)
+    {
+        return (tensor_obj == nullptr || tensor_object->tensor() == nullptr);
+    }),
+    function, file, line);
+}
+#define ARM_COMPUTE_ERROR_ON_UNALLOCATED_TENSOR_OBJECT(...) ::arm_compute::graph::error_on_unallocated_tensor_object(__func__, __FILE__, __LINE__, __VA_ARGS__)
+} // namespace graph
+} // namespace arm_compute
+#endif /* __ARM_COMPUTE_GRAPH_ERROR_H__ */
diff --git a/arm_compute/graph/ITensorObject.h b/arm_compute/graph/ITensorObject.h
index 61be286..a922dd5 100644
--- a/arm_compute/graph/ITensorObject.h
+++ b/arm_compute/graph/ITensorObject.h
@@ -61,7 +61,8 @@
      *
      * @return Tensor
      */
-    virtual ITensor *tensor() = 0;
+    virtual ITensor       *tensor()       = 0;
+    virtual const ITensor *tensor() const = 0;
     /** Return the target that this tensor is pinned on
      *
      * @return Target of the tensor
diff --git a/arm_compute/graph/SubTensor.h b/arm_compute/graph/SubTensor.h
index 22a0a9e..72aa789 100644
--- a/arm_compute/graph/SubTensor.h
+++ b/arm_compute/graph/SubTensor.h
@@ -72,9 +72,10 @@
     bool                  call_accessor() override;
     bool                  has_accessor() const override;
     arm_compute::ITensor *set_target(TargetHint target) override;
-    arm_compute::ITensor *tensor() override;
-    TargetHint            target() const override;
-    void                  allocate() override;
+    arm_compute::ITensor       *tensor() override;
+    const arm_compute::ITensor *tensor() const override;
+    TargetHint                  target() const override;
+    void                        allocate() override;
 
 private:
     /** Instantiates a sub-tensor */
diff --git a/arm_compute/graph/Tensor.h b/arm_compute/graph/Tensor.h
index 94822c2..e5821dc 100644
--- a/arm_compute/graph/Tensor.h
+++ b/arm_compute/graph/Tensor.h
@@ -107,9 +107,10 @@
     bool                  call_accessor() override;
     bool                  has_accessor() const override;
     arm_compute::ITensor *set_target(TargetHint target) override;
-    arm_compute::ITensor *tensor() override;
-    TargetHint            target() const override;
-    void                  allocate() override;
+    arm_compute::ITensor       *tensor() override;
+    const arm_compute::ITensor *tensor() const override;
+    TargetHint                  target() const override;
+    void                        allocate() override;
 
 private:
     TargetHint                            _target;   /**< Target that this tensor is pinned on */
diff --git a/src/graph/SubTensor.cpp b/src/graph/SubTensor.cpp
index da8de95..2edeb3b 100644
--- a/src/graph/SubTensor.cpp
+++ b/src/graph/SubTensor.cpp
@@ -88,6 +88,11 @@
     return _subtensor.get();
 }
 
+const arm_compute::ITensor *SubTensor::tensor() const
+{
+    return _subtensor.get();
+}
+
 TargetHint SubTensor::target() const
 {
     return _target;
diff --git a/src/graph/Tensor.cpp b/src/graph/Tensor.cpp
index f85fe27..4db79e9 100644
--- a/src/graph/Tensor.cpp
+++ b/src/graph/Tensor.cpp
@@ -95,6 +95,11 @@
     return _tensor.get();
 }
 
+const arm_compute::ITensor *Tensor::tensor() const
+{
+    return _tensor.get();
+}
+
 const TensorInfo &Tensor::info() const
 {
     return _info;
diff --git a/src/graph/nodes/ActivationLayer.cpp b/src/graph/nodes/ActivationLayer.cpp
index d335214..54f30ef 100644
--- a/src/graph/nodes/ActivationLayer.cpp
+++ b/src/graph/nodes/ActivationLayer.cpp
@@ -23,6 +23,7 @@
  */
 #include "arm_compute/graph/nodes/ActivationLayer.h"
 
+#include "arm_compute/graph/Error.h"
 #include "arm_compute/graph/NodeContext.h"
 #include "arm_compute/graph/OperationRegistry.h"
 #include "support/ToolchainSupport.h"
@@ -36,8 +37,7 @@
 
 std::unique_ptr<arm_compute::IFunction> ActivationLayer::instantiate_node(GraphContext &ctx, ITensorObject *input, ITensorObject *output)
 {
-    ARM_COMPUTE_ERROR_ON(input == nullptr || input->tensor() == nullptr);
-    ARM_COMPUTE_ERROR_ON(output == nullptr || output->tensor() == nullptr);
+    ARM_COMPUTE_ERROR_ON_UNALLOCATED_TENSOR_OBJECT(input, output);
 
     arm_compute::ITensor *in  = input->tensor();
     arm_compute::ITensor *out = output->tensor();
diff --git a/src/graph/nodes/BatchNormalizationLayer.cpp b/src/graph/nodes/BatchNormalizationLayer.cpp
index a433f39..1fc83e4 100644
--- a/src/graph/nodes/BatchNormalizationLayer.cpp
+++ b/src/graph/nodes/BatchNormalizationLayer.cpp
@@ -23,6 +23,7 @@
  */
 #include "arm_compute/graph/nodes/BatchNormalizationLayer.h"
 
+#include "arm_compute/graph/Error.h"
 #include "arm_compute/graph/NodeContext.h"
 #include "arm_compute/graph/OperationRegistry.h"
 #include "support/ToolchainSupport.h"
@@ -31,8 +32,7 @@
 
 std::unique_ptr<arm_compute::IFunction> BatchNormalizationLayer::instantiate_node(GraphContext &ctx, ITensorObject *input, ITensorObject *output)
 {
-    ARM_COMPUTE_ERROR_ON(input == nullptr || input->tensor() == nullptr);
-    ARM_COMPUTE_ERROR_ON(output == nullptr || output->tensor() == nullptr);
+    ARM_COMPUTE_ERROR_ON_UNALLOCATED_TENSOR_OBJECT(input, output);
 
     arm_compute::ITensor *in  = input->tensor();
     arm_compute::ITensor *out = output->tensor();
diff --git a/src/graph/nodes/BranchLayer.cpp b/src/graph/nodes/BranchLayer.cpp
index 28f58c6..d062e4b 100644
--- a/src/graph/nodes/BranchLayer.cpp
+++ b/src/graph/nodes/BranchLayer.cpp
@@ -23,6 +23,7 @@
  */
 #include "arm_compute/graph/nodes/BranchLayer.h"
 
+#include "arm_compute/graph/Error.h"
 #include "arm_compute/graph/Graph.h"
 #include "arm_compute/graph/SubGraph.h"
 #include "arm_compute/graph/Tensor.h"
@@ -111,8 +112,7 @@
 {
     ARM_COMPUTE_ERROR_ON(_branch_merge_method != BranchMergeMethod::DEPTH_CONCATENATE);
     ARM_COMPUTE_UNUSED(_branch_merge_method);
-    ARM_COMPUTE_ERROR_ON(input == nullptr || input->tensor() == nullptr);
-    ARM_COMPUTE_ERROR_ON(output == nullptr || output->tensor() == nullptr);
+    ARM_COMPUTE_ERROR_ON_UNALLOCATED_TENSOR_OBJECT(input, output);
 
     // Create branch function
     auto func = arm_compute::support::cpp14::make_unique<BranchFunction>();
diff --git a/src/graph/nodes/ConvolutionLayer.cpp b/src/graph/nodes/ConvolutionLayer.cpp
index d3ab97f..a7236fc 100644
--- a/src/graph/nodes/ConvolutionLayer.cpp
+++ b/src/graph/nodes/ConvolutionLayer.cpp
@@ -23,6 +23,7 @@
  */
 #include "arm_compute/graph/nodes/ConvolutionLayer.h"
 
+#include "arm_compute/graph/Error.h"
 #include "arm_compute/runtime/CL/functions/CLConvolutionLayer.h"
 #include "arm_compute/runtime/CL/functions/CLDirectConvolutionLayer.h"
 #include "arm_compute/runtime/IFunction.h"
@@ -175,8 +176,7 @@
 
 std::unique_ptr<arm_compute::IFunction> ConvolutionLayer::instantiate_node(GraphContext &ctx, ITensorObject *input, ITensorObject *output)
 {
-    ARM_COMPUTE_ERROR_ON(input == nullptr || input->tensor() == nullptr);
-    ARM_COMPUTE_ERROR_ON(output == nullptr || output->tensor() == nullptr);
+    ARM_COMPUTE_ERROR_ON_UNALLOCATED_TENSOR_OBJECT(input, output);
 
     arm_compute::ITensor *in  = input->tensor();
     arm_compute::ITensor *out = output->tensor();
diff --git a/src/graph/nodes/DeQuantizationLayer.cpp b/src/graph/nodes/DeQuantizationLayer.cpp
index 3760de6..af9ecee 100644
--- a/src/graph/nodes/DeQuantizationLayer.cpp
+++ b/src/graph/nodes/DeQuantizationLayer.cpp
@@ -23,6 +23,7 @@
  */
 #include "arm_compute/graph/nodes/DequantizationLayer.h"
 
+#include "arm_compute/graph/Error.h"
 #include "arm_compute/graph/NodeContext.h"
 #include "arm_compute/graph/OperationRegistry.h"
 
@@ -30,8 +31,7 @@
 
 std::unique_ptr<arm_compute::IFunction> DequantizationLayer::instantiate_node(GraphContext &ctx, ITensorObject *input, ITensorObject *output)
 {
-    ARM_COMPUTE_ERROR_ON(input == nullptr || input->tensor() == nullptr);
-    ARM_COMPUTE_ERROR_ON(output == nullptr || output->tensor() == nullptr);
+    ARM_COMPUTE_ERROR_ON_UNALLOCATED_TENSOR_OBJECT(input, output);
 
     _target_hint              = ctx.hints().target_hint();
     arm_compute::ITensor *in  = input->tensor();
diff --git a/src/graph/nodes/DepthConvertLayer.cpp b/src/graph/nodes/DepthConvertLayer.cpp
index 62f3082..9b328e7 100644
--- a/src/graph/nodes/DepthConvertLayer.cpp
+++ b/src/graph/nodes/DepthConvertLayer.cpp
@@ -23,6 +23,7 @@
  */
 #include "arm_compute/graph/nodes/DepthConvertLayer.h"
 
+#include "arm_compute/graph/Error.h"
 #include "arm_compute/graph/NodeContext.h"
 #include "arm_compute/graph/OperationRegistry.h"
 
@@ -35,8 +36,7 @@
 
 std::unique_ptr<arm_compute::IFunction> DepthConvertLayer::instantiate_node(GraphContext &ctx, ITensorObject *input, ITensorObject *output)
 {
-    ARM_COMPUTE_ERROR_ON(input == nullptr || input->tensor() == nullptr);
-    ARM_COMPUTE_ERROR_ON(output == nullptr || output->tensor() == nullptr);
+    ARM_COMPUTE_ERROR_ON_UNALLOCATED_TENSOR_OBJECT(input, output);
 
     _target_hint              = ctx.hints().target_hint();
     arm_compute::ITensor *in  = input->tensor();
diff --git a/src/graph/nodes/FlattenLayer.cpp b/src/graph/nodes/FlattenLayer.cpp
index 1e42bd0..66840f6 100644
--- a/src/graph/nodes/FlattenLayer.cpp
+++ b/src/graph/nodes/FlattenLayer.cpp
@@ -23,6 +23,7 @@
  */
 #include "arm_compute/graph/nodes/FlattenLayer.h"
 
+#include "arm_compute/graph/Error.h"
 #include "arm_compute/graph/NodeContext.h"
 #include "arm_compute/graph/OperationRegistry.h"
 #include "support/ToolchainSupport.h"
@@ -31,8 +32,7 @@
 
 std::unique_ptr<arm_compute::IFunction> FlattenLayer::instantiate_node(GraphContext &ctx, ITensorObject *input, ITensorObject *output)
 {
-    ARM_COMPUTE_ERROR_ON(input == nullptr || input->tensor() == nullptr);
-    ARM_COMPUTE_ERROR_ON(output == nullptr || output->tensor() == nullptr);
+    ARM_COMPUTE_ERROR_ON_UNALLOCATED_TENSOR_OBJECT(input, output);
 
     _target_hint              = ctx.hints().target_hint();
     arm_compute::ITensor *in  = input->tensor();
diff --git a/src/graph/nodes/FloorLayer.cpp b/src/graph/nodes/FloorLayer.cpp
index 21c82b8..8750546 100644
--- a/src/graph/nodes/FloorLayer.cpp
+++ b/src/graph/nodes/FloorLayer.cpp
@@ -23,6 +23,7 @@
  */
 #include "arm_compute/graph/nodes/FloorLayer.h"
 
+#include "arm_compute/graph/Error.h"
 #include "arm_compute/graph/NodeContext.h"
 #include "arm_compute/graph/OperationRegistry.h"
 #include "support/ToolchainSupport.h"
@@ -31,8 +32,7 @@
 
 std::unique_ptr<arm_compute::IFunction> FloorLayer::instantiate_node(GraphContext &ctx, ITensorObject *input, ITensorObject *output)
 {
-    ARM_COMPUTE_ERROR_ON(input == nullptr || input->tensor() == nullptr);
-    ARM_COMPUTE_ERROR_ON(output == nullptr || output->tensor() == nullptr);
+    ARM_COMPUTE_ERROR_ON_UNALLOCATED_TENSOR_OBJECT(input, output);
 
     arm_compute::ITensor *in  = input->tensor();
     arm_compute::ITensor *out = output->tensor();
diff --git a/src/graph/nodes/FullyConnectedLayer.cpp b/src/graph/nodes/FullyConnectedLayer.cpp
index 39ed827..41f679b 100644
--- a/src/graph/nodes/FullyConnectedLayer.cpp
+++ b/src/graph/nodes/FullyConnectedLayer.cpp
@@ -23,6 +23,7 @@
  */
 #include "arm_compute/graph/nodes/FullyConnectedLayer.h"
 
+#include "arm_compute/graph/Error.h"
 #include "arm_compute/graph/NodeContext.h"
 #include "arm_compute/graph/OperationRegistry.h"
 #include "support/ToolchainSupport.h"
@@ -45,8 +46,7 @@
 
 std::unique_ptr<arm_compute::IFunction> FullyConnectedLayer::instantiate_node(GraphContext &ctx, ITensorObject *input, ITensorObject *output)
 {
-    ARM_COMPUTE_ERROR_ON(input == nullptr || input->tensor() == nullptr);
-    ARM_COMPUTE_ERROR_ON(output == nullptr || output->tensor() == nullptr);
+    ARM_COMPUTE_ERROR_ON_UNALLOCATED_TENSOR_OBJECT(input, output);
 
     arm_compute::ITensor *in  = input->tensor();
     arm_compute::ITensor *out = output->tensor();
diff --git a/src/graph/nodes/L2NormalizeLayer.cpp b/src/graph/nodes/L2NormalizeLayer.cpp
index bcc3b94..9813ba4 100644
--- a/src/graph/nodes/L2NormalizeLayer.cpp
+++ b/src/graph/nodes/L2NormalizeLayer.cpp
@@ -23,6 +23,7 @@
  */
 #include "arm_compute/graph/nodes/L2NormalizeLayer.h"
 
+#include "arm_compute/graph/Error.h"
 #include "arm_compute/graph/NodeContext.h"
 #include "arm_compute/graph/OperationRegistry.h"
 #include "support/ToolchainSupport.h"
@@ -36,8 +37,7 @@
 
 std::unique_ptr<arm_compute::IFunction> L2NormalizeLayer::instantiate_node(GraphContext &ctx, ITensorObject *input, ITensorObject *output)
 {
-    ARM_COMPUTE_ERROR_ON(input == nullptr || input->tensor() == nullptr);
-    ARM_COMPUTE_ERROR_ON(output == nullptr || output->tensor() == nullptr);
+    ARM_COMPUTE_ERROR_ON_UNALLOCATED_TENSOR_OBJECT(input, output);
 
     arm_compute::ITensor *in  = input->tensor();
     arm_compute::ITensor *out = output->tensor();
diff --git a/src/graph/nodes/NormalizationLayer.cpp b/src/graph/nodes/NormalizationLayer.cpp
index 5036231..a489329 100644
--- a/src/graph/nodes/NormalizationLayer.cpp
+++ b/src/graph/nodes/NormalizationLayer.cpp
@@ -23,6 +23,7 @@
  */
 #include "arm_compute/graph/nodes/NormalizationLayer.h"
 
+#include "arm_compute/graph/Error.h"
 #include "arm_compute/graph/NodeContext.h"
 #include "arm_compute/graph/OperationRegistry.h"
 #include "support/ToolchainSupport.h"
@@ -36,8 +37,7 @@
 
 std::unique_ptr<arm_compute::IFunction> NormalizationLayer::instantiate_node(GraphContext &ctx, ITensorObject *input, ITensorObject *output)
 {
-    ARM_COMPUTE_ERROR_ON(input == nullptr || input->tensor() == nullptr);
-    ARM_COMPUTE_ERROR_ON(output == nullptr || output->tensor() == nullptr);
+    ARM_COMPUTE_ERROR_ON_UNALLOCATED_TENSOR_OBJECT(input, output);
 
     arm_compute::ITensor *in  = input->tensor();
     arm_compute::ITensor *out = output->tensor();
diff --git a/src/graph/nodes/PoolingLayer.cpp b/src/graph/nodes/PoolingLayer.cpp
index 26df585..2c15119 100644
--- a/src/graph/nodes/PoolingLayer.cpp
+++ b/src/graph/nodes/PoolingLayer.cpp
@@ -23,6 +23,7 @@
  */
 #include "arm_compute/graph/nodes/PoolingLayer.h"
 
+#include "arm_compute/graph/Error.h"
 #include "arm_compute/graph/NodeContext.h"
 #include "arm_compute/graph/OperationRegistry.h"
 #include "support/ToolchainSupport.h"
@@ -36,8 +37,7 @@
 
 std::unique_ptr<arm_compute::IFunction> PoolingLayer::instantiate_node(GraphContext &ctx, ITensorObject *input, ITensorObject *output)
 {
-    ARM_COMPUTE_ERROR_ON(input == nullptr || input->tensor() == nullptr);
-    ARM_COMPUTE_ERROR_ON(output == nullptr || output->tensor() == nullptr);
+    ARM_COMPUTE_ERROR_ON_UNALLOCATED_TENSOR_OBJECT(input, output);
 
     arm_compute::ITensor *in  = input->tensor();
     arm_compute::ITensor *out = output->tensor();
diff --git a/src/graph/nodes/QuantizationLayer.cpp b/src/graph/nodes/QuantizationLayer.cpp
index 8e7dadb..c102f47 100644
--- a/src/graph/nodes/QuantizationLayer.cpp
+++ b/src/graph/nodes/QuantizationLayer.cpp
@@ -23,6 +23,7 @@
  */
 #include "arm_compute/graph/nodes/QuantizationLayer.h"
 
+#include "arm_compute/graph/Error.h"
 #include "arm_compute/graph/NodeContext.h"
 #include "arm_compute/graph/OperationRegistry.h"
 
@@ -30,8 +31,7 @@
 
 std::unique_ptr<arm_compute::IFunction> QuantizationLayer::instantiate_node(GraphContext &ctx, ITensorObject *input, ITensorObject *output)
 {
-    ARM_COMPUTE_ERROR_ON(input == nullptr || input->tensor() == nullptr);
-    ARM_COMPUTE_ERROR_ON(output == nullptr || output->tensor() == nullptr);
+    ARM_COMPUTE_ERROR_ON_UNALLOCATED_TENSOR_OBJECT(input, output);
 
     _target_hint              = ctx.hints().target_hint();
     arm_compute::ITensor *in  = input->tensor();
diff --git a/src/graph/nodes/ReshapeLayer.cpp b/src/graph/nodes/ReshapeLayer.cpp
index 3d1a679..4967534 100644
--- a/src/graph/nodes/ReshapeLayer.cpp
+++ b/src/graph/nodes/ReshapeLayer.cpp
@@ -23,6 +23,7 @@
  */
 #include "arm_compute/graph/nodes/ReshapeLayer.h"
 
+#include "arm_compute/graph/Error.h"
 #include "arm_compute/graph/NodeContext.h"
 #include "arm_compute/graph/OperationRegistry.h"
 #include "support/ToolchainSupport.h"
@@ -36,8 +37,7 @@
 
 std::unique_ptr<arm_compute::IFunction> ReshapeLayer::instantiate_node(GraphContext &ctx, ITensorObject *input, ITensorObject *output)
 {
-    ARM_COMPUTE_ERROR_ON(input == nullptr || input->tensor() == nullptr);
-    ARM_COMPUTE_ERROR_ON(output == nullptr || output->tensor() == nullptr);
+    ARM_COMPUTE_ERROR_ON_UNALLOCATED_TENSOR_OBJECT(input, output);
 
     _target_hint              = ctx.hints().target_hint();
     arm_compute::ITensor *in  = input->tensor();
diff --git a/src/graph/nodes/SoftmaxLayer.cpp b/src/graph/nodes/SoftmaxLayer.cpp
index 62057c7..7f2325b 100644
--- a/src/graph/nodes/SoftmaxLayer.cpp
+++ b/src/graph/nodes/SoftmaxLayer.cpp
@@ -23,6 +23,7 @@
  */
 #include "arm_compute/graph/nodes/SoftmaxLayer.h"
 
+#include "arm_compute/graph/Error.h"
 #include "arm_compute/graph/NodeContext.h"
 #include "arm_compute/graph/OperationRegistry.h"
 #include "support/ToolchainSupport.h"
@@ -31,8 +32,7 @@
 
 std::unique_ptr<arm_compute::IFunction> SoftmaxLayer::instantiate_node(GraphContext &ctx, ITensorObject *input, ITensorObject *output)
 {
-    ARM_COMPUTE_ERROR_ON(input == nullptr || input->tensor() == nullptr);
-    ARM_COMPUTE_ERROR_ON(output == nullptr || output->tensor() == nullptr);
+    ARM_COMPUTE_ERROR_ON_UNALLOCATED_TENSOR_OBJECT(input, output);
 
     arm_compute::ITensor *in  = input->tensor();
     arm_compute::ITensor *out = output->tensor();