diff --git a/src/language/BuiltinFunctionEmbedder.hpp b/src/language/BuiltinFunctionEmbedder.hpp
index d6040f7be2e1f71621b1297bfe080f3cdd8b5584..99d76590b5cf001b20342991e7dde794a6f639e0 100644
--- a/src/language/BuiltinFunctionEmbedder.hpp
+++ b/src/language/BuiltinFunctionEmbedder.hpp
@@ -54,7 +54,7 @@ class BuiltinFunctionEmbedder : public IBuiltinFunctionEmbedder
   _copy_value(ArgsTuple& t, const std::vector<DataVariant>& v) const
   {
     std::visit(
-      [&](auto v_i) {
+      [&](auto&& v_i) {
         using Ti_Type = std::decay_t<decltype(std::get<I>(t))>;
         using Vi_Type = std::decay_t<decltype(v_i)>;
 
@@ -63,9 +63,13 @@ class BuiltinFunctionEmbedder : public IBuiltinFunctionEmbedder
         } else if constexpr ((std::is_arithmetic_v<Vi_Type>)and(std::is_arithmetic_v<Ti_Type> or
                                                                 std::is_same_v<Ti_Type, std::string>)) {
           std::get<I>(t) = v_i;
-        } else if constexpr (is_shared_ptr_v<Ti_Type> and std::is_same_v<Vi_Type, EmbeddedData>) {
-          auto data_handler = static_cast<const DataHandler<typename Ti_Type::element_type>&>(v_i.get());
-          std::get<I>(t)    = data_handler.data_ptr();
+        } else if constexpr (is_shared_ptr_v<Ti_Type>) {
+          if constexpr (std::is_same_v<Vi_Type, EmbeddedData>) {
+            auto data_handler = static_cast<const DataHandler<typename Ti_Type::element_type>&>(v_i.get());
+            std::get<I>(t)    = data_handler.data_ptr();
+          } else {
+            throw std::runtime_error("unexpected argument types while casting: expecting EmbeddedData");
+          }
         } else {
           std::ostringstream os;
           os << "unexpected argument types while casting " << demangle<Vi_Type>() << " -> " << demangle<Ti_Type>()