Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-pythran for openSUSE:Factory 
checked in at 2025-06-16 11:11:31
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-pythran (Old)
 and      /work/SRC/openSUSE:Factory/.python-pythran.new.19631 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-pythran"

Mon Jun 16 11:11:31 2025 rev:23 rq:1285647 version:0.18.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-pythran/python-pythran.changes    
2025-06-04 20:26:40.760324372 +0200
+++ /work/SRC/openSUSE:Factory/.python-pythran.new.19631/python-pythran.changes 
2025-06-16 11:11:32.640976340 +0200
@@ -1,0 +2,17 @@
+Fri Jun 13 18:54:09 UTC 2025 - Ben Greiner <c...@bnavigator.de>
+
+- Add GCC15_pythran-PR2325-missing-operators.patch
+  * Tracking Issues for this and the previous patch:
+    gcc#120622
+    gh#serge-sans-paille/pythran#2321
+    gh#serge-sans-paille/pythran#2324
+    gh#serge-sans-paille/pythran#2325
+    boo#1243779
+
+-------------------------------------------------------------------
+Thu Jun 12 10:03:44 UTC 2025 - Ana Guerrero <ana.guerr...@suse.com>
+
+- Fix failures with GCC15:
+  GCC15_fix_Add-missing-operators-to-nditerator.patch
+
+-------------------------------------------------------------------

New:
----
  GCC15_fix_Add-missing-operators-to-nditerator.patch
  GCC15_pythran-PR2325-missing-operators.patch

BETA DEBUG BEGIN:
  New:- Fix failures with GCC15:
  GCC15_fix_Add-missing-operators-to-nditerator.patch
  New:
- Add GCC15_pythran-PR2325-missing-operators.patch
  * Tracking Issues for this and the previous patch:
BETA DEBUG END:

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-pythran.spec ++++++
--- /var/tmp/diff_new_pack.4J0FRK/_old  2025-06-16 11:11:33.529013035 +0200
+++ /var/tmp/diff_new_pack.4J0FRK/_new  2025-06-16 11:11:33.529013035 +0200
@@ -52,6 +52,10 @@
 # Tests are only availble from the github archive
 Source0:        
https://github.com/serge-sans-paille/pythran/archive/refs/tags/%{version}.tar.gz#/pythran-%{version}-gh.tar.gz
 Source99:       python-pythran-rpmlintrc
+# PATCH-FIX-UPSTREAM: 
https://github.com/serge-sans-paille/pythran/commit/14b78f0db9cbd253414b751d14644843354e7557
+Patch0:         GCC15_fix_Add-missing-operators-to-nditerator.patch
+# PATCH-FIX-UPSTREAM: 
https://github.com/serge-sans-paille/pythran/commit/623fa5031df7ec5c3dfe6789bf608cf11ac95c36
+Patch1:         GCC15_pythran-PR2325-missing-operators.patch
 BuildRequires:  %{python_module pip}
 BuildRequires:  %{python_module setuptools}
 BuildRequires:  %{python_module wheel}

++++++ GCC15_fix_Add-missing-operators-to-nditerator.patch ++++++
>From 14b78f0db9cbd253414b751d14644843354e7557 Mon Sep 17 00:00:00 2001
From: cielavenir <cielarti...@gmail.com>
Date: Fri, 6 Jun 2025 16:21:52 +0900
Subject: [PATCH 1/5] Add missing operators to nditerator

---
 pythran/pythonic/include/types/nditerator.hpp |  9 +++
 pythran/pythonic/types/nditerator.hpp         | 57 +++++++++++++++++++
 2 files changed, 66 insertions(+)

diff --git a/pythran/pythonic/include/types/nditerator.hpp 
b/pythran/pythonic/include/types/nditerator.hpp
index 0d1f8281a..934e5cc0a 100644
--- a/pythran/pythonic/include/types/nditerator.hpp
+++ b/pythran/pythonic/include/types/nditerator.hpp
@@ -66,6 +66,9 @@ namespace types
     bool operator!=(nditerator<E> const &other) const;
     bool operator==(nditerator<E> const &other) const;
     bool operator<(nditerator<E> const &other) const;
+    bool operator>(nditerator<E> const &other) const;
+    bool operator<=(nditerator<E> const &other) const;
+    bool operator>=(nditerator<E> const &other) const;
     nditerator &operator=(nditerator const &other);
   };
 
@@ -92,6 +95,9 @@ namespace types
     bool operator!=(const_nditerator<E> const &other) const;
     bool operator==(const_nditerator<E> const &other) const;
     bool operator<(const_nditerator<E> const &other) const;
+    bool operator>(const_nditerator<E> const &other) const;
+    bool operator<=(const_nditerator<E> const &other) const;
+    bool operator>=(const_nditerator<E> const &other) const;
     const_nditerator &operator=(const_nditerator const &other);
   };
 #ifdef USE_XSIMD
@@ -115,6 +121,9 @@ namespace types
     bool operator!=(const_simd_nditerator const &other) const;
     bool operator==(const_simd_nditerator const &other) const;
     bool operator<(const_simd_nditerator const &other) const;
+    bool operator>(const_simd_nditerator const &other) const;
+    bool operator<=(const_simd_nditerator const &other) const;
+    bool operator>=(const_simd_nditerator const &other) const;
     const_simd_nditerator &operator=(const_simd_nditerator const &other);
     void store(xsimd::batch<typename E::dtype> const &);
   };
diff --git a/pythran/pythonic/types/nditerator.hpp 
b/pythran/pythonic/types/nditerator.hpp
index 2cb2b9047..ef2b7c4a8 100644
--- a/pythran/pythonic/types/nditerator.hpp
+++ b/pythran/pythonic/types/nditerator.hpp
@@ -97,6 +97,24 @@ namespace types
     return index < other.index;
   }
 
+  template <class E>
+  bool nditerator<E>::operator>(nditerator<E> const &other) const
+  {
+    return index > other.index;
+  }
+
+  template <class E>
+  bool nditerator<E>::operator<=(nditerator<E> const &other) const
+  {
+    return !(index > other.index);
+  }
+
+  template <class E>
+  bool nditerator<E>::operator>=(nditerator<E> const &other) const
+  {
+    return !(index < other.index);
+  }
+
   template <class E>
   nditerator<E> &nditerator<E>::operator=(nditerator<E> const &other)
   {
@@ -188,6 +206,24 @@ namespace types
     return index < other.index;
   }
 
+  template <class E>
+  bool const_nditerator<E>::operator>(const_nditerator<E> const &other) const
+  {
+    return index > other.index;
+  }
+
+  template <class E>
+  bool const_nditerator<E>::operator<=(const_nditerator<E> const &other) const
+  {
+    return !(index > other.index);
+  }
+
+  template <class E>
+  bool const_nditerator<E>::operator>=(const_nditerator<E> const &other) const
+  {
+    return !(index < other.index);
+  }
+
   template <class E>
   const_nditerator<E> &
   const_nditerator<E>::operator=(const_nditerator const &other)
@@ -271,6 +307,27 @@ namespace types
     return data < other.data;
   }
 
+  template <class E>
+  bool const_simd_nditerator<E>::operator>(
+      const_simd_nditerator<E> const &other) const
+  {
+    return data > other.data;
+  }
+
+  template <class E>
+  bool const_simd_nditerator<E>::operator<=(
+      const_simd_nditerator<E> const &other) const
+  {
+    return !(data > other.data);
+  }
+
+  template <class E>
+  bool const_simd_nditerator<E>::operator>=(
+      const_simd_nditerator<E> const &other) const
+  {
+    return !(data < other.data);
+  }
+
   template <class E>
   const_simd_nditerator<E> &
   const_simd_nditerator<E>::operator=(const_simd_nditerator const &other)
-- 
2.49.0


++++++ GCC15_pythran-PR2325-missing-operators.patch ++++++
>From 623fa5031df7ec5c3dfe6789bf608cf11ac95c36 Mon Sep 17 00:00:00 2001
From: serge-sans-paille <serge.guel...@telecom-bretagne.eu>
Date: Wed, 11 Jun 2025 23:49:40 +0200
Subject: [PATCH] Add missing iterator comparison operators

Fix #2324
---
 pythran/pythonic/builtins/map.hpp             | 37 +++++++++++++++----
 pythran/pythonic/builtins/range.hpp           |  6 +++
 pythran/pythonic/include/builtins/map.hpp     | 16 +++++---
 pythran/pythonic/include/builtins/range.hpp   |  1 +
 .../pythonic/include/numpy/ndenumerate.hpp    |  4 ++
 pythran/pythonic/include/numpy/ndindex.hpp    |  4 ++
 pythran/pythonic/include/types/array.hpp      |  8 +++-
 pythran/pythonic/include/types/numpy_expr.hpp | 31 +++++++++-------
 pythran/pythonic/include/types/str.hpp        | 13 +++++--
 9 files changed, 88 insertions(+), 32 deletions(-)

diff --git a/pythran/pythonic/builtins/map.hpp 
b/pythran/pythonic/builtins/map.hpp
index ac6eb0354..e81dd2c46 100644
--- a/pythran/pythonic/builtins/map.hpp
+++ b/pythran/pythonic/builtins/map.hpp
@@ -143,11 +143,35 @@ namespace builtins
       return !(*this == other);
     }
 
+    template <typename Operator, typename... Iters>
+    template <size_t N>
+    bool map_iterator<Operator, Iters...>::lt(
+        map_iterator<Operator, Iters...> const &other, utils::int_<N>) const
+    {
+      return std::get<N>(it) < std::get<N>(other.it) ||
+             ((std::get<N>(it) == std::get<N>(other.it)) &&
+              lt(other, utils::int_<N - 1>()));
+    }
+
+    template <typename Operator, typename... Iters>
+    bool map_iterator<Operator, Iters...>::lt(
+        map_iterator<Operator, Iters...> const &other, utils::int_<0>) const
+    {
+      return std::get<0>(it) < std::get<0>(other.it);
+    }
+
     template <typename Operator, typename... Iters>
     bool map_iterator<Operator, Iters...>::operator<(
         map_iterator<Operator, Iters...> const &other) const
     {
-      return !(*this == other);
+      return lt(other, utils::int_<sizeof...(Iters) - 1>());
+    }
+
+    template <typename Operator, typename... Iters>
+    bool map_iterator<Operator, Iters...>::operator<=(
+        map_iterator<Operator, Iters...> const &other) const
+    {
+      return (*this == other) || (*this < other);
     }
 
     template <typename Operator, typename... Iters>
@@ -208,12 +232,11 @@ namespace builtins
   } // namespace details
 
   template <typename Operator, typename... Iter>
-  auto map(Operator &&_op, Iter &&...iters)
-      -> details::map<
-          typename std::remove_cv<
-              typename std::remove_reference<Operator>::type>::type,
-          typename types::iterator<typename std::remove_cv<
-              typename std::remove_reference<Iter>::type>::type>::type...>
+  auto map(Operator &&_op, Iter &&...iters) -> details::map<
+      typename std::remove_cv<
+          typename std::remove_reference<Operator>::type>::type,
+      typename types::iterator<typename std::remove_cv<
+          typename std::remove_reference<Iter>::type>::type>::type...>
   {
     return {std::forward<Operator>(_op), std::forward<Iter>(iters)...};
   }
diff --git a/pythran/pythonic/builtins/range.hpp 
b/pythran/pythonic/builtins/range.hpp
index 2c3f3971d..bff58960e 100644
--- a/pythran/pythonic/builtins/range.hpp
+++ b/pythran/pythonic/builtins/range.hpp
@@ -89,6 +89,12 @@ namespace builtins
     return sign * value_ < sign * other.value_;
   }
 
+  inline bool range_iterator::operator<=(range_iterator const &other) const
+  {
+    const long sign = +1 | (step_ >> (sizeof(long) * CHAR_BIT - 1));
+    return sign * value_ <= sign * other.value_;
+  }
+
   inline long range_iterator::operator-(range_iterator const &other) const
   {
     return (value_ - other.value_) / step_;
diff --git a/pythran/pythonic/include/builtins/map.hpp 
b/pythran/pythonic/include/builtins/map.hpp
index 788106712..8f358bd50 100644
--- a/pythran/pythonic/include/builtins/map.hpp
+++ b/pythran/pythonic/include/builtins/map.hpp
@@ -56,6 +56,7 @@ namespace builtins
       bool operator==(map_iterator const &other) const;
       bool operator!=(map_iterator const &other) const;
       bool operator<(map_iterator const &other) const;
+      bool operator<=(map_iterator const &other) const;
       long operator-(map_iterator const &other) const;
 
     private:
@@ -69,6 +70,10 @@ namespace builtins
       bool equal(map_iterator const &other, utils::int_<N>) const;
       bool equal(map_iterator const &other, utils::int_<0>) const;
 
+      template <size_t N>
+      bool lt(map_iterator const &other, utils::int_<N>) const;
+      bool lt(map_iterator const &other, utils::int_<0>) const;
+
       template <size_t I>
       void advance(long i, utils::int_<I>);
       void advance(long i, utils::int_<0>);
@@ -107,12 +112,11 @@ namespace builtins
   } // namespace details
 
   template <typename Operator, typename... Iter>
-  auto map(Operator &&_op, Iter &&...iters)
-      -> details::map<
-          typename std::remove_cv<
-              typename std::remove_reference<Operator>::type>::type,
-          typename types::iterator<typename std::remove_cv<
-              typename std::remove_reference<Iter>::type>::type>::type...>;
+  auto map(Operator &&_op, Iter &&...iters) -> details::map<
+      typename std::remove_cv<
+          typename std::remove_reference<Operator>::type>::type,
+      typename types::iterator<typename std::remove_cv<
+          typename std::remove_reference<Iter>::type>::type>::type...>;
 
   DEFINE_FUNCTOR(pythonic::builtins, map);
 } // namespace builtins
diff --git a/pythran/pythonic/include/builtins/range.hpp 
b/pythran/pythonic/include/builtins/range.hpp
index 7c40b6dcd..82e1c18ec 100644
--- a/pythran/pythonic/include/builtins/range.hpp
+++ b/pythran/pythonic/include/builtins/range.hpp
@@ -28,6 +28,7 @@ namespace builtins
       bool operator!=(range_iterator const &other) const;
       bool operator==(range_iterator const &other) const;
       bool operator<(range_iterator const &other) const;
+      bool operator<=(range_iterator const &other) const;
       long operator-(range_iterator const &other) const;
     };
   } // namespace
diff --git a/pythran/pythonic/include/numpy/ndenumerate.hpp 
b/pythran/pythonic/include/numpy/ndenumerate.hpp
index 18d78f2ef..ad8bbca22 100644
--- a/pythran/pythonic/include/numpy/ndenumerate.hpp
+++ b/pythran/pythonic/include/numpy/ndenumerate.hpp
@@ -25,6 +25,10 @@ namespace numpy
     ndenumerate_iterator &operator++();
     ndenumerate_iterator &operator+=(long n);
     bool operator!=(ndenumerate_iterator const &other) const;
+    bool operator==(ndenumerate_iterator const &other) const
+    {
+      return !(*this != other);
+    }
     bool operator<(ndenumerate_iterator const &other) const;
     long operator-(ndenumerate_iterator const &other) const;
   };
diff --git a/pythran/pythonic/include/numpy/ndindex.hpp 
b/pythran/pythonic/include/numpy/ndindex.hpp
index 387665cdb..8361f4ffd 100644
--- a/pythran/pythonic/include/numpy/ndindex.hpp
+++ b/pythran/pythonic/include/numpy/ndindex.hpp
@@ -25,6 +25,10 @@ namespace numpy
     ndindex_iterator &operator++();
     ndindex_iterator &operator+=(long n);
     bool operator!=(ndindex_iterator const &other) const;
+    bool operator==(ndindex_iterator const &other) const
+    {
+      return !(*this != other);
+    }
     bool operator<(ndindex_iterator const &other) const;
     long operator-(ndindex_iterator const &other) const;
   };
diff --git a/pythran/pythonic/include/types/array.hpp 
b/pythran/pythonic/include/types/array.hpp
index d4e6c1e06..b9bbe722b 100644
--- a/pythran/pythonic/include/types/array.hpp
+++ b/pythran/pythonic/include/types/array.hpp
@@ -129,6 +129,10 @@ namespace types
     {
       return index < other.index;
     }
+    bool operator<=(array_iterator const &other) const
+    {
+      return index <= other.index;
+    }
     array_iterator &operator=(array_iterator const &other)
     {
       index = other.index;
@@ -181,8 +185,8 @@ namespace types
 
     using shape_t = types::array_tuple<long, value>;
     template <size_t I>
-    auto shape() const -> decltype(details::extract_shape(*this,
-                                                          utils::int_<I>{}))
+    auto shape() const
+        -> decltype(details::extract_shape(*this, utils::int_<I>{}))
     {
       return details::extract_shape(*this, utils::int_<I>{});
     }
diff --git a/pythran/pythonic/include/types/numpy_expr.hpp 
b/pythran/pythonic/include/types/numpy_expr.hpp
index 0d13801a6..a6fc24d67 100644
--- a/pythran/pythonic/include/types/numpy_expr.hpp
+++ b/pythran/pythonic/include/types/numpy_expr.hpp
@@ -116,7 +116,7 @@ namespace types
     }
 
     auto operator*() const -> decltype(this->_dereference(
-                               utils::make_index_sequence<sizeof...(Iters)>{}))
+        utils::make_index_sequence<sizeof...(Iters)>{}))
     {
       return _dereference(utils::make_index_sequence<sizeof...(Iters)>{});
     }
@@ -240,6 +240,11 @@ namespace types
     {
       return _lt(other, utils::int_<sizeof...(Iters)>{});
     }
+
+    bool operator<=(numpy_expr_iterator const &other) const
+    {
+      return *this < other || *this == other;
+    }
   };
 #ifdef USE_XSIMD
   template <class E, class Op, class Steps, class SIters, class... Iters>
@@ -279,7 +284,7 @@ namespace types
     }
 
     auto operator*() const -> decltype(this->_dereference(
-                               utils::make_index_sequence<sizeof...(Iters)>{}))
+        utils::make_index_sequence<sizeof...(Iters)>{}))
     {
       return _dereference(utils::make_index_sequence<sizeof...(Iters)>{});
     }
@@ -439,7 +444,7 @@ namespace types
     }
 
     auto operator*() const -> decltype(this->_dereference(
-                               utils::make_index_sequence<sizeof...(Iters)>{}))
+        utils::make_index_sequence<sizeof...(Iters)>{}))
     {
       return _dereference(utils::make_index_sequence<sizeof...(Iters)>{});
     }
@@ -583,9 +588,9 @@ namespace types
   }
 
   template <size_t... J, class Arg, class Shp, class... S>
-  auto
-  make_subslice(utils::index_sequence<J...>, Arg const &arg, Shp const &shp,
-                std::tuple<S...> const &ss) -> 
decltype(arg(std::get<J>(ss)...))
+  auto make_subslice(utils::index_sequence<J...>, Arg const &arg,
+                     Shp const &shp, std::tuple<S...> const &ss)
+      -> decltype(arg(std::get<J>(ss)...))
   {
     // we need to adapt_slice to take broadcasting into account
     return arg(adapt_slice(
@@ -708,15 +713,14 @@ namespace types
     }
 
     template <class... Indices>
-    auto map_fast(Indices... indices) const
-        -> decltype(this->_map_fast(
-            array_tuple<long, sizeof...(Indices)>{{indices...}},
-            utils::make_index_sequence<sizeof...(Args)>{}));
+    auto map_fast(Indices... indices) const -> decltype(this->_map_fast(
+        array_tuple<long, sizeof...(Indices)>{{indices...}},
+        utils::make_index_sequence<sizeof...(Args)>{}));
 
   public:
     template <size_t I>
     auto shape() const -> decltype(details::init_shape_element<I>(
-                           args, valid_indices<value, std::tuple<Args...>>{}))
+        args, valid_indices<value, std::tuple<Args...>>{}))
     {
       return details::init_shape_element<I>(
           args, valid_indices<value, std::tuple<Args...>>{});
@@ -819,9 +823,8 @@ namespace types
       return Op{}(std::get<I>(args)[s]...);
     }
     template <class S>
-    auto operator[](S s) const
-        -> decltype((*this)._index(
-            (s.lower, s), utils::make_index_sequence<sizeof...(Args)>{}))
+    auto operator[](S s) const -> decltype((*this)._index(
+        (s.lower, s), utils::make_index_sequence<sizeof...(Args)>{}))
     {
       return _index(s, utils::make_index_sequence<sizeof...(Args)>{});
     }
diff --git a/pythran/pythonic/include/types/str.hpp 
b/pythran/pythonic/include/types/str.hpp
index ca373c734..73a39f35a 100644
--- a/pythran/pythonic/include/types/str.hpp
+++ b/pythran/pythonic/include/types/str.hpp
@@ -275,6 +275,14 @@ namespace types
     {
       return curr != other.curr;
     }
+    bool operator<(string_iterator const &other) const
+    {
+      return curr < other.curr;
+    }
+    bool operator<=(string_iterator const &other) const
+    {
+      return curr <= other.curr;
+    }
     std::ptrdiff_t operator-(string_iterator const &other) const
     {
       return curr - other.curr;
@@ -328,9 +336,8 @@ namespace operator_
 {
 
   template <size_t N, class Arg>
-  auto mod(const char (&fmt)[N],
-           Arg &&arg) -> decltype(pythonic::types::str(fmt) %
-                                  std::forward<Arg>(arg));
+  auto mod(const char (&fmt)[N], Arg &&arg)
+      -> decltype(pythonic::types::str(fmt) % std::forward<Arg>(arg));
 
   pythonic::types::str add(char const *self, char const *other);
 

Reply via email to