Avoid aliasing in reference passed "count" argument

This commit is contained in:
Ion Gaztañaga
2026-03-12 23:04:11 +01:00
parent 345c428f75
commit ad3db6feec
2 changed files with 10 additions and 10 deletions
@@ -33,8 +33,10 @@ namespace detail_algo {
template <class FwdIt, class Size, class T>
FwdIt fill_n_scan(FwdIt first, FwdIt last, Size& count, const T& value, non_segmented_iterator_tag)
{
for(; first != last && count > 0; ++first, --count)
Size n = count; //Avoid aliasing the count parameter
for(; first != last && n > 0; ++first, --n)
*first = value;
count = n;
return first;
}
@@ -54,8 +56,7 @@ SegIt fill_n_scan(SegIt first, SegIt last, Size& count, const T& value, segmente
lcur = fill_n_scan(lcur, traits::end(scur), count, value,
is_local_seg_t());
for(++scur; scur != slast && count > 0; ++scur)
lcur = fill_n_scan(traits::begin(scur), traits::end(scur), count, value,
is_local_seg_t());
lcur = fill_n_scan(traits::begin(scur), traits::end(scur), count, value, is_local_seg_t());
if(count > 0)
lcur = fill_n_scan(traits::begin(scur), traits::local(last), count, value,
is_local_seg_t());
@@ -33,8 +33,10 @@ namespace detail_algo {
template <class FwdIt, class Size, class Generator>
FwdIt generate_n_scan(FwdIt first, FwdIt last, Size& count, Generator& gen, non_segmented_iterator_tag)
{
for(; first != last && count > 0; ++first, --count)
Size n = count; //Avoid aliasing the count parameter
for(; first != last && n > 0; ++first, --n)
*first = gen();
count = n;
return first;
}
@@ -51,14 +53,11 @@ SegIt generate_n_scan(SegIt first, SegIt last, Size& count, Generator& gen, segm
lcur = generate_n_scan(lcur, traits::local(last), count, gen, is_local_seg_t());
}
else {
lcur = generate_n_scan(lcur, traits::end(scur), count, gen,
is_local_seg_t());
lcur = generate_n_scan(lcur, traits::end(scur), count, gen, is_local_seg_t());
for(++scur; scur != slast && count > 0; ++scur)
lcur = generate_n_scan(traits::begin(scur), traits::end(scur), count, gen,
is_local_seg_t());
lcur = generate_n_scan(traits::begin(scur), traits::end(scur), count, gen, is_local_seg_t());
if(count > 0)
lcur = generate_n_scan(traits::begin(scur), traits::local(last), count, gen,
is_local_seg_t());
lcur = generate_n_scan(traits::begin(scur), traits::local(last), count, gen, is_local_seg_t());
}
return traits::compose(scur, lcur);
}