Avoid build problem on armel caused by strange compiler.
authorDebian Science Maintainers <debian-science-maintainers@lists.alioth.debian.org>
Tue, 26 Dec 2023 19:26:37 +0000 (14:26 -0500)
committerMo Zhou <lumin@debian.org>
Tue, 26 Dec 2023 19:26:37 +0000 (14:26 -0500)
Add indirection and a result test which seem to confuse GCC 13 less
than the original statements.
 Fixes build problem:
   In file included from /usr/include/c++/13/atomic:41,
                    from /<<PKGBUILDDIR>>/test/common/doctest.h:2990,
                    from /<<PKGBUILDDIR>>/test/common/test.h:32,
                    from /<<PKGBUILDDIR>>/test/tbb/test_concurrent_monitor.cpp:26:
   In member function ‘void std::__atomic_base<_IntTp>::store(__int_type, std::memory_order) [with _ITp = bool]’,
       inlined from ‘void std::atomic<bool>::store(bool, std::memory_order)’ at /usr/include/c++/13/atomic:104:20,
       inlined from ‘void tbb::detail::r1::concurrent_monitor_base<Context>::notify_one_relaxed() [with Context = unsigned int]’ at /<<PKGBUILDDIR>>/test/tbb/../../src/tbb/concurrent_monitor.h:293:53,
       inlined from ‘void tbb::detail::r1::concurrent_monitor_base<Context>::notify_one() [with Context = unsigned int]’ at /<<PKGBUILDDIR>>/test/tbb/../../src/tbb/concurrent_monitor.h:276:27,
       inlined from ‘void DOCTEST_ANON_FUNC_35()’ at /<<PKGBUILDDIR>>/test/tbb/test_concurrent_monitor.cpp:87:44:
   /usr/include/c++/13/bits/atomic_base.h:481:25: error: ‘void __atomic_store_1(volatile void*, unsigned char, int)’ writing 1 byte into a region of size 0 overflows the destination [-Werror=stringop-overflow=]
     481 |         __atomic_store_n(&_M_i, __i, int(__m));
         |         ~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~

Author: Petter Reinholdtsen <pere@debian.org>
Forwarded: no
Bug-Debian: https://bugs.debian.org/1042009
Last-Update: 2023-07-31

Gbp-Pq: Name 1050-armel-atomic-past-buffer.patch

src/tbb/concurrent_monitor.h

index 3d20ef5b98df80ea7ab6ea547819cc73221230e8..66e0fe12d947655b85263d833058c8c88acc4624 100644 (file)
@@ -290,7 +290,15 @@ public:
             n = my_waitset.front();
             if (n != end) {
                 my_waitset.remove(*n);
-                to_wait_node(n)->my_is_in_list.store(false, std::memory_order_relaxed);
+                wait_node<Context>* wn = to_wait_node(n);
+                // Artificial 'if' test to work around confused armel
+                // gcc 13 compiler, see
+                // <URL: https://bugs.debian.org/1042009 >.
+                if (wn) {
+                    wn->my_is_in_list.store(false, std::memory_order_relaxed);
+                } else {
+                    __TBB_ASSERT(wn, "to_wait_node(n) is NULL");
+                }
             }
         }