From 5d817a7966a05fcb2ee8d591b88dc5a2cfe6f3ed Mon Sep 17 00:00:00 2001 From: Johan Mabille Date: Wed, 11 Nov 2026 01:12:18 +0100 Subject: [PATCH 1/3] Fixed xexpression_holder generic constructor --- include/xtensor/misc/xexpression_holder.hpp | 23 ++++++++++++--------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/include/xtensor/misc/xexpression_holder.hpp b/include/xtensor/misc/xexpression_holder.hpp index f720cc006..bc19ab79b 100644 --- a/include/xtensor/misc/xexpression_holder.hpp +++ b/include/xtensor/misc/xexpression_holder.hpp @@ -10,7 +10,9 @@ #ifndef XTENSOR_XEXPRESSION_HOLDER_HPP #define XTENSOR_XEXPRESSION_HOLDER_HPP +#include #include +#include #include @@ -38,6 +40,7 @@ namespace xt xexpression_holder() = default; template + requires (!std::same_as, xexpression_holder>) xexpression_holder(E&& expr); xexpression_holder(implementation_type* holder); @@ -118,6 +121,7 @@ namespace xt } template + requires (!std::same_as, xexpression_holder>) inline xexpression_holder::xexpression_holder(E&& expr) : p_holder(new detail::xexpression_wrapper(std::forward(expr))) { @@ -181,30 +185,29 @@ namespace xt inline void xexpression_holder::init_pointer_from_json(const nlohmann::json& j) { - if (j.is_array()) + if (j.is_array() && !j.empty()) { - return init_pointer_from_json(j[0]); + init_pointer_from_json(j[0]); } - - if (j.is_number()) + else if (j.is_number()) { xt::xarray empty_arr; p_holder.reset(new detail::xexpression_wrapper>(std::move(empty_arr))); } - - if (j.is_boolean()) + else if (j.is_boolean()) { xt::xarray empty_arr; p_holder.reset(new detail::xexpression_wrapper>(std::move(empty_arr))); } - - if (j.is_string()) + else if (j.is_string()) { xt::xarray empty_arr; p_holder.reset(new detail::xexpression_wrapper>(std::move(empty_arr))); } - - XTENSOR_THROW(std::runtime_error, "Received a JSON with a tensor that contains unsupported data type"); + else + { + XTENSOR_THROW(std::runtime_error, "Received a JSON with a tensor that contains unsupported data type"); + } } inline void xexpression_holder::check_holder() const From 76691ceda7006cb42169028fa0dd663664c21bf0 Mon Sep 17 00:00:00 2001 From: Johan Mabille Date: Wed, 11 Nov 2026 01:30:32 +0100 Subject: [PATCH 2/3] Release xtensor 0.27.2 --- README.md | 1 + docs/source/changelog.rst | 5 +++++ include/xtensor/core/xtensor_config.hpp | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0bc823eaa..797dd1681 100644 --- a/README.md +++ b/README.md @@ -98,6 +98,7 @@ library: | `xtensor` | `xtl` |`xsimd` (optional) | |-----------|---------|-------------------| | master | ^0.8.0 | ^13.2.0 | +| 0.27.2 | ^0.8.0 | ^13.2.0 | | 0.27.1 | ^0.8.0 | ^13.2.0 | | 0.27.0 | ^0.8.0 | ^13.2.0 | | 0.26.0 | ^0.8.0 | ^13.2.0 | diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst index 982773051..8118485ea 100644 --- a/docs/source/changelog.rst +++ b/docs/source/changelog.rst @@ -7,6 +7,11 @@ Changelog ========= +0.27.2 +------ + +- Fixed xexpression_holder generic constructor + 0.27.1 ------ diff --git a/include/xtensor/core/xtensor_config.hpp b/include/xtensor/core/xtensor_config.hpp index 959a3b2a4..a3fb00081 100644 --- a/include/xtensor/core/xtensor_config.hpp +++ b/include/xtensor/core/xtensor_config.hpp @@ -12,7 +12,7 @@ #define XTENSOR_VERSION_MAJOR 0 #define XTENSOR_VERSION_MINOR 27 -#define XTENSOR_VERSION_PATCH 1 +#define XTENSOR_VERSION_PATCH 2 // Define if the library is going to be using exceptions. From 982acb98b5d2022fa895d53236da58e40e5d018a Mon Sep 17 00:00:00 2001 From: Johan Mabille Date: Wed, 11 Nov 2026 01:36:39 +0100 Subject: [PATCH 3/3] Fixed linter --- include/xtensor/misc/xexpression_holder.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/xtensor/misc/xexpression_holder.hpp b/include/xtensor/misc/xexpression_holder.hpp index bc19ab79b..283b331ce 100644 --- a/include/xtensor/misc/xexpression_holder.hpp +++ b/include/xtensor/misc/xexpression_holder.hpp @@ -40,7 +40,7 @@ namespace xt xexpression_holder() = default; template - requires (!std::same_as, xexpression_holder>) + requires(!std::same_as, xexpression_holder>) xexpression_holder(E&& expr); xexpression_holder(implementation_type* holder); @@ -121,7 +121,7 @@ namespace xt } template - requires (!std::same_as, xexpression_holder>) + requires(!std::same_as, xexpression_holder>) inline xexpression_holder::xexpression_holder(E&& expr) : p_holder(new detail::xexpression_wrapper(std::forward(expr))) {