Skip to content

Commit 64d143d

Browse files
authored
Enforce assign_range() mandates for sequence containers (#5086)
1 parent 99ef0d0 commit 64d143d

File tree

4 files changed

+10
-0
lines changed

4 files changed

+10
-0
lines changed

stl/inc/deque

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -832,6 +832,8 @@ public:
832832
#if _HAS_CXX23
833833
template <_Container_compatible_range<_Ty> _Rng>
834834
void assign_range(_Rng&& _Range) {
835+
static_assert(assignable_from<_Ty&, _RANGES range_reference_t<_Rng>>,
836+
"Elements must be assignable from the range's reference type (N4993 [sequence.reqmts]/60).");
835837
_Assign_range(_RANGES _Ubegin(_Range), _RANGES _Uend(_Range));
836838
}
837839
#endif // _HAS_CXX23

stl/inc/forward_list

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -967,6 +967,8 @@ public:
967967
#if _HAS_CXX23
968968
template <_Container_compatible_range<_Ty> _Rng>
969969
void assign_range(_Rng&& _Range) {
970+
static_assert(assignable_from<_Ty&, _RANGES range_reference_t<_Rng>>,
971+
"Elements must be assignable from the range's reference type (N4993 [sequence.reqmts]/60).");
970972
_Assign_unchecked(_RANGES _Ubegin(_Range), _RANGES _Uend(_Range));
971973
}
972974
#endif // _HAS_CXX23

stl/inc/list

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1344,6 +1344,8 @@ public:
13441344
#if _HAS_CXX23
13451345
template <_Container_compatible_range<_Ty> _Rng>
13461346
void assign_range(_Rng&& _Range) {
1347+
static_assert(assignable_from<_Ty&, _RANGES range_reference_t<_Rng>>,
1348+
"Elements must be assignable from the range's reference type (N4993 [sequence.reqmts]/60).");
13471349
_Assign_unchecked(_RANGES _Ubegin(_Range), _RANGES _Uend(_Range));
13481350
}
13491351
#endif // _HAS_CXX23

stl/inc/vector

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1488,6 +1488,8 @@ public:
14881488
#if _HAS_CXX23
14891489
template <_Container_compatible_range<_Ty> _Rng>
14901490
constexpr void assign_range(_Rng&& _Range) {
1491+
static_assert(assignable_from<_Ty&, _RANGES range_reference_t<_Rng>>,
1492+
"Elements must be assignable from the range's reference type (N4993 [sequence.reqmts]/60).");
14911493
if constexpr (_RANGES sized_range<_Rng> || _RANGES forward_range<_Rng>) {
14921494
const auto _Length = _To_unsigned_like(_RANGES distance(_Range));
14931495
const auto _Count = _Convert_size<size_type>(_Length);
@@ -3329,6 +3331,8 @@ public:
33293331

33303332
template <_Container_compatible_range<bool> _Rng>
33313333
constexpr void assign_range(_Rng&& _Range) {
3334+
static_assert(assignable_from<bool&, _RANGES range_reference_t<_Rng>>,
3335+
"Elements must be assignable from the range's reference type (N4993 [sequence.reqmts]/60).");
33323336
clear();
33333337
if constexpr (_RANGES forward_range<_Rng> || _RANGES sized_range<_Rng>) {
33343338
const auto _Length = _To_unsigned_like(_RANGES distance(_Range));

0 commit comments

Comments
 (0)