Skip to content

Commit cfd3a7e

Browse files
authored
Merge pull request #442 from boostorg/develop
Merge for 1.88
2 parents fd631aa + 89fe464 commit cfd3a7e

File tree

7 files changed

+284
-16
lines changed

7 files changed

+284
-16
lines changed

.github/workflows/ci.yml

+10-6
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ env:
2727
GIT_FETCH_JOBS: 8
2828
NET_RETRY_COUNT: 5
2929
DEFAULT_BUILD_VARIANT: release
30-
ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true
3130

3231
jobs:
3332
posix:
@@ -251,9 +250,6 @@ jobs:
251250
- libc++-14-dev
252251
- libc++abi-14-dev
253252

254-
- toolset: clang
255-
cxxstd: "11,14"
256-
os: macos-12
257253
- toolset: clang
258254
cxxstd: "20"
259255
os: macos-13
@@ -262,7 +258,11 @@ jobs:
262258
os: macos-14
263259

264260
runs-on: ${{matrix.os}}
265-
container: ${{matrix.container}}
261+
container:
262+
image: ${{matrix.container}}
263+
volumes:
264+
- /node20217:/node20217:rw,rshared
265+
- ${{ startsWith(matrix.container, 'ubuntu:1') && '/node20217:/__e/node20:ro,rshared' || ' ' }}
266266

267267
steps:
268268
- name: Setup environment
@@ -286,9 +286,13 @@ jobs:
286286
fi
287287
apt-get -o Acquire::Retries=$NET_RETRY_COUNT install -y sudo software-properties-common tzdata wget curl apt-transport-https ca-certificates make build-essential g++ $PYTHON_PACKAGE python3 perl git cmake
288288
fi
289+
if [[ "${{matrix.container}}" == "ubuntu:1"* ]]; then
290+
# Node 20 doesn't work with Ubuntu 16/18 glibc: https://github.com/actions/checkout/issues/1590
291+
curl -sL https://archives.boost.io/misc/node/node-v20.9.0-linux-x64-glibc-217.tar.xz | tar -xJ --strip-components 1 -C /node20217
292+
fi
289293
fi
290294
git config --global pack.threads 0
291-
- uses: actions/checkout@v3
295+
- uses: actions/checkout@v4
292296

293297
- name: Install packages
294298
if: matrix.install

include/boost/test/data/size.hpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
// STL
1919
#include <iosfwd>
20+
#include <cstddef>
2021

2122
#include <boost/test/detail/suppress_warnings.hpp>
2223

@@ -30,7 +31,7 @@ namespace data {
3031
// ************** size_t ************** //
3132
// ************************************************************************** //
3233

33-
//! Utility for handling the size of a datasets
34+
//! Utility for handling the size of a dataset
3435
class size_t {
3536
struct dummy { void nonnull() {} };
3637
typedef void (dummy::*safe_bool)();

include/boost/test/impl/execution_monitor.ipp

+14-3
Original file line numberDiff line numberDiff line change
@@ -195,8 +195,8 @@ namespace { void _set_se_translator( void* ) {} }
195195
#endif
196196

197197
#if (!defined(BOOST_MSSTL_VERSION) || (BOOST_MSSTL_VERSION >= 120)) && (!defined(__GLIBC__) || ((__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 2))))
198-
// glibc 2.2 - 2.17 required __STDC_FORMAT_MACROS to be defined for use of PRIxPTR
199-
# if defined(__GLIBC__) && !((__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 18)))
198+
// glibc 2.2 - 2.17 required __STDC_FORMAT_MACROS to be defined for use of PRIxPTR, as well as some versions of macOS.
199+
# if (defined(__GLIBC__) && !((__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 18)))) || defined(__APPLE__)
200200
# ifndef __STDC_FORMAT_MACROS
201201
# define __STDC_FORMAT_MACROS 1
202202
# define BOOST_TEST_DEFINED_STDC_FORMAT_MACROS
@@ -207,7 +207,18 @@ namespace { void _set_se_translator( void* ) {} }
207207
# ifdef BOOST_TEST_DEFINED_STDC_FORMAT_MACROS
208208
# undef __STDC_FORMAT_MACROS
209209
# endif
210-
#else
210+
#endif
211+
// If any modern toolchain did not pick up a definition from above it will here
212+
#ifndef BOOST_TEST_PRIxPTR
213+
# ifdef __has_include
214+
# if __has_include(<cinttypes>)
215+
# include <cinttypes>
216+
# define BOOST_TEST_PRIxPTR PRIxPTR
217+
# endif
218+
# endif
219+
#endif
220+
// Last resort
221+
#ifndef BOOST_TEST_PRIxPTR
211222
# define BOOST_TEST_PRIxPTR "08lx"
212223
#endif
213224

include/boost/test/impl/test_tree.ipp

+4-4
Original file line numberDiff line numberDiff line change
@@ -501,16 +501,16 @@ auto_test_unit_registrar::auto_test_unit_registrar( const_string ts_name, const_
501501

502502
//____________________________________________________________________________//
503503

504-
auto_test_unit_registrar::auto_test_unit_registrar( test_unit_generator const& tc_gen, decorator::collector_t& decorators )
504+
auto_test_unit_registrar::auto_test_unit_registrar( test_unit_generator const& tc_generator, decorator::collector_t& decorators )
505505
{
506-
framework::current_auto_test_suite().add( tc_gen, decorators );
506+
framework::current_auto_test_suite().add( tc_generator, decorators );
507507
}
508508

509509
//____________________________________________________________________________//
510510

511-
auto_test_unit_registrar::auto_test_unit_registrar( boost::shared_ptr<test_unit_generator> tc_gen, decorator::collector_t& decorators )
511+
auto_test_unit_registrar::auto_test_unit_registrar( boost::shared_ptr<test_unit_generator> tc_generator, decorator::collector_t& decorators )
512512
{
513-
framework::current_auto_test_suite().add( tc_gen, decorators );
513+
framework::current_auto_test_suite().add( tc_generator, decorators );
514514
}
515515

516516

include/boost/test/tree/auto_registration.hpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ struct BOOST_TEST_DECL auto_test_unit_registrar {
3939
// Constructors
4040
auto_test_unit_registrar( test_case* tc, decorator::collector_t& decorators, counter_t exp_fail = 0 );
4141
explicit auto_test_unit_registrar( const_string ts_name, const_string ts_file, std::size_t ts_line, decorator::collector_t& decorators );
42-
explicit auto_test_unit_registrar( test_unit_generator const& tc_gen, decorator::collector_t& decorators );
43-
explicit auto_test_unit_registrar( boost::shared_ptr<test_unit_generator> tc_gen, decorator::collector_t& decorators );
42+
explicit auto_test_unit_registrar( test_unit_generator const& tc_generator, decorator::collector_t& decorators );
43+
explicit auto_test_unit_registrar( boost::shared_ptr<test_unit_generator> tc_generator, decorator::collector_t& decorators );
4444
explicit auto_test_unit_registrar( int );
4545
};
4646

test/Jamfile.v2

+1
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ test-suite "framework-ts"
150150
[ boost.test-self-test run : framework-ts : decorators-datatestcase-test : : : : : : $(requirements_datasets) ]
151151
[ compile-fail framework-ts/master-test-suite-non-copyable-test.cpp ../build//included ]
152152
[ boost.test-self-test run : framework-ts : log-count-skipped-test : included : baseline-outputs/log-count-skipped-tests.pattern ]
153+
[ boost.test-self-test run : framework-ts : dataset-size ]
153154

154155
# ticket 13371: "Use-after-free with --log_sink=file"
155156
# this single check is not enough as we should check for various command line options: we make extensive

test/framework-ts/dataset-size.cpp

+251
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,251 @@
1+
// (C) Copyright Alexander Grund 2025.
2+
// Distributed under the Boost Software License, Version 1.0.
3+
// (See accompanying file LICENSE_1_0.txt or copy at
4+
// http://www.boost.org/LICENSE_1_0.txt)
5+
6+
#define BOOST_TEST_MODULE dataset size class
7+
#include <boost/test/unit_test.hpp>
8+
9+
#include <boost/test/data/size.hpp>
10+
#include <limits>
11+
12+
namespace data = boost::unit_test::data;
13+
14+
BOOST_AUTO_TEST_CASE(test_constructor)
15+
{
16+
data::size_t sz0;
17+
BOOST_TEST(!sz0.is_inf());
18+
BOOST_TEST(sz0.value() == 0u);
19+
BOOST_TEST(!sz0);
20+
21+
data::size_t sz2 = sz0;
22+
BOOST_TEST(!sz2.is_inf());
23+
BOOST_TEST(sz2.value() == 0u);
24+
BOOST_TEST(!sz2);
25+
26+
data::size_t sz1(42);
27+
BOOST_TEST(!sz1.is_inf());
28+
BOOST_TEST(sz1.value() == 42u);
29+
BOOST_TEST(!!sz1);
30+
31+
data::size_t sz3 = sz1;
32+
BOOST_TEST(!sz3.is_inf());
33+
BOOST_TEST(sz3.value() == 42u);
34+
BOOST_TEST(!!sz3);
35+
36+
data::size_t sz4(true);
37+
BOOST_TEST(sz4.is_inf());
38+
BOOST_TEST(sz4.value() == 0u);
39+
BOOST_TEST(!!sz4);
40+
41+
data::size_t sz5(false);
42+
BOOST_TEST(sz5.is_inf());
43+
BOOST_TEST(sz5.value() == 0u);
44+
BOOST_TEST(!!sz5);
45+
46+
sz2 = sz5;
47+
BOOST_TEST(sz2.is_inf());
48+
BOOST_TEST(sz2.value() == 0u);
49+
BOOST_TEST(!!sz2);
50+
51+
sz2 = sz1;
52+
BOOST_TEST(!sz2.is_inf());
53+
BOOST_TEST(sz2.value() == 42u);
54+
BOOST_TEST(!!sz2);
55+
}
56+
57+
BOOST_AUTO_TEST_CASE(test_unary_ops)
58+
{
59+
data::size_t sz(100);
60+
61+
data::size_t sz2 = ++sz;
62+
BOOST_TEST(!sz.is_inf());
63+
BOOST_TEST(sz.value() == 101u);
64+
BOOST_TEST(!sz2.is_inf());
65+
BOOST_TEST(sz2.value() == 101u);
66+
67+
sz2 = sz++;
68+
BOOST_TEST(!sz.is_inf());
69+
BOOST_TEST(sz.value() == 102u);
70+
BOOST_TEST(!sz2.is_inf());
71+
BOOST_TEST(sz2.value() == 101u);
72+
73+
sz2 = --sz;
74+
BOOST_TEST(!sz.is_inf());
75+
BOOST_TEST(sz.value() == 101u);
76+
BOOST_TEST(!sz2.is_inf());
77+
BOOST_TEST(sz2.value() == 101u);
78+
79+
sz2 = sz--;
80+
BOOST_TEST(!sz.is_inf());
81+
BOOST_TEST(sz.value() == 100u);
82+
BOOST_TEST(!sz2.is_inf());
83+
BOOST_TEST(sz2.value() == 101u);
84+
85+
// Over- and underflow
86+
BOOST_CONSTEXPR_OR_CONST std::size_t maxVal = (std::numeric_limits<size_t>::max)();
87+
sz = maxVal;
88+
sz2 = ++sz;
89+
BOOST_TEST(!sz.is_inf());
90+
BOOST_TEST(sz.value() == 0u);
91+
BOOST_TEST(!sz2.is_inf());
92+
BOOST_TEST(sz2.value() == 0u);
93+
94+
sz = maxVal;
95+
sz2 = sz++;
96+
BOOST_TEST(!sz.is_inf());
97+
BOOST_TEST(sz.value() == 0);
98+
BOOST_TEST(!sz2.is_inf());
99+
BOOST_TEST(sz2.value() == maxVal);
100+
101+
sz = 0;
102+
sz2 = --sz;
103+
BOOST_TEST(!sz.is_inf());
104+
BOOST_TEST(sz.value() == maxVal);
105+
BOOST_TEST(!sz2.is_inf());
106+
BOOST_TEST(sz2.value() == maxVal);
107+
108+
sz = 0;
109+
sz2 = sz--;
110+
BOOST_TEST(!sz.is_inf());
111+
BOOST_TEST(sz.value() == maxVal);
112+
BOOST_TEST(!sz2.is_inf());
113+
BOOST_TEST(sz2.value() == 0u);
114+
115+
//____________________________________________________________________________//
116+
sz = data::BOOST_TEST_DS_INFINITE_SIZE;
117+
sz2 = ++sz;
118+
BOOST_TEST(sz.is_inf());
119+
BOOST_TEST(sz.value() == 0u);
120+
BOOST_TEST(sz2.is_inf());
121+
BOOST_TEST(sz2.value() == 0u);
122+
123+
sz2 = sz++;
124+
BOOST_TEST(sz.is_inf());
125+
BOOST_TEST(sz.value() == 0u);
126+
BOOST_TEST(sz2.is_inf());
127+
BOOST_TEST(sz2.value() == 0u);
128+
129+
sz2 = --sz;
130+
BOOST_TEST(sz.is_inf());
131+
BOOST_TEST(sz.value() == 0u);
132+
BOOST_TEST(sz2.is_inf());
133+
BOOST_TEST(sz2.value() == 0u);
134+
135+
sz2 = sz--;
136+
BOOST_TEST(sz.is_inf());
137+
BOOST_TEST(sz.value() == 0u);
138+
BOOST_TEST(sz2.is_inf());
139+
BOOST_TEST(sz2.value() == 0u);
140+
}
141+
142+
BOOST_AUTO_TEST_CASE(test_binary_inc)
143+
{
144+
data::size_t sz(100);
145+
146+
sz += 5;
147+
BOOST_TEST(!sz.is_inf());
148+
BOOST_TEST(sz.value() == 105u);
149+
150+
sz += data::size_t(5);
151+
BOOST_TEST(!sz.is_inf());
152+
BOOST_TEST(sz.value() == 110u);
153+
154+
sz += data::BOOST_TEST_DS_INFINITE_SIZE;
155+
BOOST_TEST(sz.is_inf());
156+
BOOST_TEST(sz.value() == 0u);
157+
158+
//____________________________________________________________________________//
159+
sz = data::BOOST_TEST_DS_INFINITE_SIZE;
160+
161+
sz += 5;
162+
BOOST_TEST(sz.is_inf());
163+
BOOST_TEST(sz.value() == 0u);
164+
165+
sz += data::size_t(5);
166+
BOOST_TEST(sz.is_inf());
167+
BOOST_TEST(sz.value() == 0u);
168+
169+
sz += data::BOOST_TEST_DS_INFINITE_SIZE;
170+
BOOST_TEST(sz.is_inf());
171+
BOOST_TEST(sz.value() == 0u);
172+
173+
//____________________________________________________________________________//
174+
data::size_t sz2(100);
175+
176+
sz = sz2 + 5;
177+
BOOST_TEST(!sz.is_inf());
178+
BOOST_TEST(sz.value() == 105u);
179+
180+
sz = sz2 + data::size_t(5);
181+
BOOST_TEST(!sz.is_inf());
182+
BOOST_TEST(sz.value() == 105u);
183+
184+
sz = sz2 + data::BOOST_TEST_DS_INFINITE_SIZE;
185+
BOOST_TEST(sz.is_inf());
186+
BOOST_TEST(sz.value() == 0u);
187+
188+
//____________________________________________________________________________//
189+
sz2 = data::BOOST_TEST_DS_INFINITE_SIZE;
190+
191+
sz = sz2 + 5;
192+
BOOST_TEST(sz.is_inf());
193+
BOOST_TEST(sz.value() == 0u);
194+
195+
sz = sz2 + data::size_t(5);
196+
BOOST_TEST(sz.is_inf());
197+
BOOST_TEST(sz.value() == 0u);
198+
199+
sz = sz2 + data::BOOST_TEST_DS_INFINITE_SIZE;
200+
BOOST_TEST(sz.is_inf());
201+
BOOST_TEST(sz.value() == 0u);
202+
}
203+
204+
BOOST_AUTO_TEST_CASE(test_binary_dec)
205+
{
206+
data::size_t sz(100);
207+
208+
sz -= 5;
209+
BOOST_TEST(!sz.is_inf());
210+
BOOST_TEST(sz.value() == 95u);
211+
212+
sz -= data::size_t(5);
213+
BOOST_TEST(!sz.is_inf());
214+
BOOST_TEST(sz.value() == 90u);
215+
216+
sz -= data::BOOST_TEST_DS_INFINITE_SIZE;
217+
BOOST_TEST(!sz.is_inf());
218+
BOOST_TEST(sz.value() == 90u);
219+
220+
//____________________________________________________________________________//
221+
sz = data::BOOST_TEST_DS_INFINITE_SIZE;
222+
223+
sz -= 5;
224+
BOOST_TEST(sz.is_inf());
225+
BOOST_TEST(sz.value() == 0u);
226+
227+
sz -= data::size_t(5);
228+
BOOST_TEST(sz.is_inf());
229+
BOOST_TEST(sz.value() == 0u);
230+
231+
sz -= data::BOOST_TEST_DS_INFINITE_SIZE;
232+
BOOST_TEST(sz.is_inf());
233+
BOOST_TEST(sz.value() == 0u);
234+
235+
BOOST_CONSTEXPR_OR_CONST std::size_t maxVal = (std::numeric_limits<size_t>::max)();
236+
// Underflow is avoided for data::size_t values
237+
sz = 1;
238+
sz -= 5;
239+
BOOST_TEST(!sz.is_inf());
240+
BOOST_TEST(sz.value() == maxVal - 5u + 2u);
241+
242+
sz = 1;
243+
sz -= data::size_t(5);
244+
BOOST_TEST(!sz.is_inf());
245+
BOOST_TEST(sz.value() == 0u);
246+
247+
sz = 1;
248+
sz -= data::BOOST_TEST_DS_INFINITE_SIZE;
249+
BOOST_TEST(!sz.is_inf());
250+
BOOST_TEST(sz.value() == 1u);
251+
}

0 commit comments

Comments
 (0)