Skip to content

Commit b8e575b

Browse files
Initially use [[msvc::no_unique_address]] for some C++23 components (#4960)
Co-authored-by: Stephan T. Lavavej <[email protected]>
1 parent 43dd4e4 commit b8e575b

File tree

17 files changed

+284
-135
lines changed

17 files changed

+284
-135
lines changed

stl/inc/algorithm

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -398,8 +398,8 @@ namespace ranges {
398398
#if _HAS_CXX23
399399
_EXPORT_STD template <class _In, class _Ty>
400400
struct in_value_result {
401-
/* [[no_unique_address]] */ _In in;
402-
/* [[no_unique_address]] */ _Ty value;
401+
_MSVC_NO_UNIQUE_ADDRESS _In in;
402+
_MSVC_NO_UNIQUE_ADDRESS _Ty value;
403403

404404
template <class _IIn, class _TTy>
405405
requires convertible_to<const _In&, _IIn> && convertible_to<const _Ty&, _TTy>

stl/inc/mdspan

Lines changed: 57 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ _STL_DISABLE_CLANG_WARNINGS
2323
#undef new
2424

2525
// TRANSITION, non-_Ugly attribute tokens
26-
#pragma push_macro("empty_bases")
27-
#undef empty_bases
26+
#pragma push_macro("msvc")
27+
#undef msvc
2828

2929
_STD_BEGIN
3030
template <class _IndexType, size_t _Size>
@@ -1073,37 +1073,37 @@ concept _Elidable_layout_mapping =
10731073
|| (same_as<_LayoutPolicy, layout_stride> && _Extents::rank() == 0);
10741074

10751075
template <class _Extents, class _LayoutPolicy>
1076-
struct _Mdspan_mapping_base {
1076+
struct _Mdspan_mapping_holder {
10771077
_STL_INTERNAL_STATIC_ASSERT(_Is_extents<_Extents>);
10781078

10791079
using _Mapping = _LayoutPolicy::template mapping<_Extents>;
10801080

1081-
constexpr _Mdspan_mapping_base() noexcept = default;
1081+
constexpr _Mdspan_mapping_holder() noexcept = default;
10821082

1083-
constexpr explicit _Mdspan_mapping_base(const _Extents& _Exts) : _Map(_Exts) {}
1083+
constexpr explicit _Mdspan_mapping_holder(const _Extents& _Exts) : _Map(_Exts) {}
10841084

1085-
constexpr explicit _Mdspan_mapping_base(_Extents&& _Exts) : _Map(_STD move(_Exts)) {}
1085+
constexpr explicit _Mdspan_mapping_holder(_Extents&& _Exts) : _Map(_STD move(_Exts)) {}
10861086

10871087
template <class _OtherMapping>
1088-
constexpr explicit _Mdspan_mapping_base(const _OtherMapping& _Map_) : _Map(_Map_) {}
1088+
constexpr explicit _Mdspan_mapping_holder(const _OtherMapping& _Map_) : _Map(_Map_) {}
10891089

1090-
_Mapping _Map = _Mapping();
1090+
_MSVC_NO_UNIQUE_ADDRESS _Mapping _Map = _Mapping();
10911091
};
10921092

10931093
template <class _Extents, _Elidable_layout_mapping<_Extents> _LayoutPolicy>
1094-
struct _Mdspan_mapping_base<_Extents, _LayoutPolicy> {
1094+
struct _Mdspan_mapping_holder<_Extents, _LayoutPolicy> {
10951095
_STL_INTERNAL_STATIC_ASSERT(_Is_extents<_Extents>);
10961096

10971097
using _Mapping = _LayoutPolicy::template mapping<_Extents>;
10981098

1099-
constexpr _Mdspan_mapping_base() noexcept = default;
1099+
constexpr _Mdspan_mapping_holder() noexcept = default;
11001100

1101-
constexpr explicit _Mdspan_mapping_base(const _Extents&) noexcept {}
1101+
constexpr explicit _Mdspan_mapping_holder(const _Extents&) noexcept {}
11021102

1103-
constexpr explicit _Mdspan_mapping_base(_Extents&&) noexcept {}
1103+
constexpr explicit _Mdspan_mapping_holder(_Extents&&) noexcept {}
11041104

11051105
template <class _OtherMapping>
1106-
constexpr explicit _Mdspan_mapping_base(const _OtherMapping& _Map_) {
1106+
constexpr explicit _Mdspan_mapping_holder(const _OtherMapping& _Map_) {
11071107
// NB: Constructing _Mapping from _OtherMapping may have side effects - we should create a temporary.
11081108
if constexpr (!_Elidable_layout_mapping<typename _OtherMapping::layout_type, _Extents>) {
11091109
(void) _Mapping{_Map_};
@@ -1117,21 +1117,21 @@ template <class _AccessorPolicy>
11171117
concept _Elidable_accessor_policy = _Is_specialization_v<_AccessorPolicy, default_accessor>;
11181118

11191119
template <class _AccessorPolicy>
1120-
struct _Mdspan_accessor_base {
1121-
constexpr _Mdspan_accessor_base() noexcept = default;
1120+
struct _Mdspan_accessor_holder {
1121+
constexpr _Mdspan_accessor_holder() noexcept = default;
11221122

11231123
template <class _OtherAccessorPolicy>
1124-
constexpr explicit _Mdspan_accessor_base(const _OtherAccessorPolicy& _Acc_) : _Acc(_Acc_) {}
1124+
constexpr explicit _Mdspan_accessor_holder(const _OtherAccessorPolicy& _Acc_) : _Acc(_Acc_) {}
11251125

1126-
_AccessorPolicy _Acc = _AccessorPolicy();
1126+
_MSVC_NO_UNIQUE_ADDRESS _AccessorPolicy _Acc = _AccessorPolicy();
11271127
};
11281128

11291129
template <_Elidable_accessor_policy _AccessorPolicy>
1130-
struct _Mdspan_accessor_base<_AccessorPolicy> {
1131-
constexpr _Mdspan_accessor_base() noexcept = default;
1130+
struct _Mdspan_accessor_holder<_AccessorPolicy> {
1131+
constexpr _Mdspan_accessor_holder() noexcept = default;
11321132

11331133
template <class _OtherAccessorPolicy>
1134-
constexpr explicit _Mdspan_accessor_base(const _OtherAccessorPolicy& _Acc_) {
1134+
constexpr explicit _Mdspan_accessor_holder(const _OtherAccessorPolicy& _Acc_) {
11351135
// NB: Constructing _AccessorPolicy from _OtherAccessorPolicy may have side effects - we should create a
11361136
// temporary.
11371137
if constexpr (!_Elidable_accessor_policy<_OtherAccessorPolicy>) {
@@ -1160,8 +1160,7 @@ _NODISCARD constexpr _IndexType _Mdspan_checked_index_cast(_OtherIndexType&& _Id
11601160

11611161
_EXPORT_STD template <class _ElementType, class _Extents, class _LayoutPolicy = layout_right,
11621162
class _AccessorPolicy = default_accessor<_ElementType>>
1163-
class __declspec(empty_bases) mdspan : private _Mdspan_mapping_base<_Extents, _LayoutPolicy>,
1164-
private _Mdspan_accessor_base<_AccessorPolicy> {
1163+
class mdspan {
11651164
public:
11661165
using extents_type = _Extents;
11671166
using layout_type = _LayoutPolicy;
@@ -1176,9 +1175,6 @@ public:
11761175
using reference = accessor_type::reference;
11771176

11781177
private:
1179-
using _Mapping_base = _Mdspan_mapping_base<extents_type, layout_type>;
1180-
using _Accessor_base = _Mdspan_accessor_base<accessor_type>;
1181-
11821178
static_assert(
11831179
sizeof(element_type) > 0, "ElementType must be a complete type (N4950 [mdspan.mdspan.overview]/2.1).");
11841180
static_assert(
@@ -1208,7 +1204,7 @@ public:
12081204
}
12091205

12101206
_NODISCARD constexpr index_type extent(_In_range_(<, extents_type::_Rank) const rank_type _Idx) const noexcept {
1211-
return this->_Map.extents().extent(_Idx);
1207+
return _Mapping._Map.extents().extent(_Idx);
12121208
}
12131209

12141210
constexpr mdspan() noexcept(is_nothrow_default_constructible_v<data_handle_type>
@@ -1229,8 +1225,7 @@ public:
12291225
constexpr explicit mdspan(data_handle_type _Ptr_, _OtherIndexTypes... _Exts)
12301226
noexcept(is_nothrow_constructible_v<mapping_type, extents_type>
12311227
&& is_nothrow_default_constructible_v<accessor_type>) // strengthened
1232-
: _Mapping_base(extents_type{static_cast<index_type>(_STD move(_Exts))...}), _Accessor_base(),
1233-
_Ptr(_STD move(_Ptr_)) {}
1228+
: _Mapping(extents_type{static_cast<index_type>(_STD move(_Exts))...}), _Accessor(), _Ptr(_STD move(_Ptr_)) {}
12341229

12351230
template <class _OtherIndexType, size_t _Size>
12361231
requires is_convertible_v<const _OtherIndexType&, index_type>
@@ -1240,7 +1235,7 @@ public:
12401235
constexpr explicit(_Size != rank_dynamic()) mdspan(data_handle_type _Ptr_, span<_OtherIndexType, _Size> _Exts)
12411236
noexcept(is_nothrow_constructible_v<mapping_type, extents_type>
12421237
&& is_nothrow_default_constructible_v<accessor_type>) // strengthened
1243-
: _Mapping_base(extents_type{_Exts}), _Accessor_base(), _Ptr(_STD move(_Ptr_)) {}
1238+
: _Mapping(extents_type{_Exts}), _Accessor(), _Ptr(_STD move(_Ptr_)) {}
12441239

12451240
template <class _OtherIndexType, size_t _Size>
12461241
requires is_convertible_v<const _OtherIndexType&, index_type>
@@ -1251,23 +1246,23 @@ public:
12511246
mdspan(data_handle_type _Ptr_, const array<_OtherIndexType, _Size>& _Exts)
12521247
noexcept(is_nothrow_constructible_v<mapping_type, extents_type>
12531248
&& is_nothrow_default_constructible_v<accessor_type>) // strengthened
1254-
: _Mapping_base(extents_type{_Exts}), _Accessor_base(), _Ptr(_STD move(_Ptr_)) {}
1249+
: _Mapping(extents_type{_Exts}), _Accessor(), _Ptr(_STD move(_Ptr_)) {}
12551250

12561251
constexpr mdspan(data_handle_type _Ptr_, const extents_type& _Exts)
12571252
noexcept(is_nothrow_constructible_v<mapping_type, const extents_type&>
12581253
&& is_nothrow_default_constructible_v<accessor_type>) // strengthened
12591254
requires is_constructible_v<mapping_type, const extents_type&> && is_default_constructible_v<accessor_type>
1260-
: _Mapping_base(_Exts), _Accessor_base(), _Ptr(_STD move(_Ptr_)) {}
1255+
: _Mapping(_Exts), _Accessor(), _Ptr(_STD move(_Ptr_)) {}
12611256

12621257
constexpr mdspan(data_handle_type _Ptr_, const mapping_type& _Map_)
12631258
noexcept(is_nothrow_copy_constructible_v<mapping_type>
12641259
&& is_nothrow_default_constructible_v<accessor_type>) // strengthened
12651260
requires is_default_constructible_v<accessor_type>
1266-
: _Mapping_base(_Map_), _Accessor_base(), _Ptr(_STD move(_Ptr_)) {}
1261+
: _Mapping(_Map_), _Accessor(), _Ptr(_STD move(_Ptr_)) {}
12671262

12681263
constexpr mdspan(data_handle_type _Ptr_, const mapping_type& _Map_, const accessor_type& _Acc_) noexcept(
12691264
is_nothrow_copy_constructible_v<mapping_type> && is_nothrow_copy_constructible_v<accessor_type>) // strengthened
1270-
: _Mapping_base(_Map_), _Accessor_base(_Acc_), _Ptr(_STD move(_Ptr_)) {}
1265+
: _Mapping(_Map_), _Accessor(_Acc_), _Ptr(_STD move(_Ptr_)) {}
12711266

12721267
template <class _OtherElementType, class _OtherExtents, class _OtherLayoutPolicy, class _OtherAccessor>
12731268
requires is_constructible_v<mapping_type, const typename _OtherLayoutPolicy::template mapping<_OtherExtents>&>
@@ -1280,7 +1275,7 @@ public:
12801275
&& is_nothrow_constructible_v<mapping_type,
12811276
const typename _OtherLayoutPolicy::template mapping<_OtherExtents>&>
12821277
&& is_nothrow_constructible_v<accessor_type, const _OtherAccessor&>) // strengthened
1283-
: _Mapping_base(_Other.mapping()), _Accessor_base(_Other.accessor()), _Ptr(_Other.data_handle()) {
1278+
: _Mapping(_Other.mapping()), _Accessor(_Other.accessor()), _Ptr(_Other.data_handle()) {
12841279
static_assert(is_constructible_v<data_handle_type, const typename _OtherAccessor::data_handle_type&>,
12851280
"The data_handle_type must be constructible from const typename OtherAccessor::data_handle_type& (N4950 "
12861281
"[mdspan.mdspan.cons]/20.1).");
@@ -1346,20 +1341,21 @@ public:
13461341
_NODISCARD constexpr size_type size() const noexcept {
13471342
#if _ITERATOR_DEBUG_LEVEL != 0
13481343
if constexpr (rank_dynamic() != 0) {
1349-
_STL_VERIFY(this->_Map.extents().template _Is_dynamic_multidim_index_space_size_representable<size_type>(),
1344+
_STL_VERIFY(
1345+
_Mapping._Map.extents().template _Is_dynamic_multidim_index_space_size_representable<size_type>(),
13501346
"The size of the multidimensional index space extents() must be representable as a value of type "
13511347
"size_type (N4950 [mdspan.mdspan.members]/7).");
13521348
}
13531349
#endif // _ITERATOR_DEBUG_LEVEL != 0
13541350
return static_cast<size_type>(
1355-
_Fwd_prod_of_extents<extents_type>::_Calculate(this->_Map.extents(), extents_type::_Rank));
1351+
_Fwd_prod_of_extents<extents_type>::_Calculate(_Mapping._Map.extents(), extents_type::_Rank));
13561352
}
13571353

13581354
_NODISCARD constexpr bool empty() const noexcept {
13591355
if constexpr (extents_type::_Multidim_index_space_size_is_always_zero) {
13601356
return true;
13611357
} else {
1362-
const extents_type& _Exts = this->_Map.extents();
1358+
const extents_type& _Exts = _Mapping._Map.extents();
13631359
for (rank_type _Idx = 0; _Idx < extents_type::_Rank; ++_Idx) {
13641360
if (_Exts.extent(_Idx) == 0) {
13651361
return true;
@@ -1373,28 +1369,28 @@ public:
13731369
swap(_Left._Ptr, _Right._Ptr); // intentional ADL
13741370

13751371
if constexpr (!_Elidable_layout_mapping<layout_type, extents_type>) {
1376-
swap(_Left._Map, _Right._Map); // intentional ADL
1372+
swap(_Left._Mapping._Map, _Right._Mapping._Map); // intentional ADL
13771373
}
13781374

13791375
if constexpr (!_Elidable_accessor_policy<accessor_type>) {
1380-
swap(_Left._Acc, _Right._Acc); // intentional ADL
1376+
swap(_Left._Accessor._Acc, _Right._Accessor._Acc); // intentional ADL
13811377
}
13821378
}
13831379

13841380
_NODISCARD constexpr const extents_type& extents() const noexcept {
1385-
return this->_Map.extents();
1381+
return _Mapping._Map.extents();
13861382
}
13871383

13881384
_NODISCARD constexpr const data_handle_type& data_handle() const noexcept {
13891385
return _Ptr;
13901386
}
13911387

13921388
_NODISCARD constexpr const mapping_type& mapping() const noexcept {
1393-
return this->_Map;
1389+
return _Mapping._Map;
13941390
}
13951391

13961392
_NODISCARD constexpr const accessor_type& accessor() const noexcept {
1397-
return this->_Acc;
1393+
return _Accessor._Acc;
13981394
}
13991395

14001396
_NODISCARD static constexpr bool is_always_unique() noexcept /* strengthened */ {
@@ -1412,38 +1408,42 @@ public:
14121408
return _Result;
14131409
}
14141410

1415-
_NODISCARD constexpr bool is_unique() const noexcept(noexcept(this->_Map.is_unique())) /* strengthened */ {
1416-
return this->_Map.is_unique();
1411+
_NODISCARD constexpr bool is_unique() const noexcept(noexcept(_Mapping._Map.is_unique())) /* strengthened */ {
1412+
return _Mapping._Map.is_unique();
14171413
}
14181414

1419-
_NODISCARD constexpr bool is_exhaustive() const noexcept(noexcept(this->_Map.is_exhaustive())) /* strengthened */ {
1420-
return this->_Map.is_exhaustive();
1415+
_NODISCARD constexpr bool is_exhaustive() const
1416+
noexcept(noexcept(_Mapping._Map.is_exhaustive())) /* strengthened */ {
1417+
return _Mapping._Map.is_exhaustive();
14211418
}
14221419

1423-
_NODISCARD constexpr bool is_strided() const noexcept(noexcept(this->_Map.is_strided())) /* strengthened */ {
1424-
return this->_Map.is_strided();
1420+
_NODISCARD constexpr bool is_strided() const noexcept(noexcept(_Mapping._Map.is_strided())) /* strengthened */ {
1421+
return _Mapping._Map.is_strided();
14251422
}
14261423

14271424
_NODISCARD constexpr index_type stride(const rank_type _Idx) const
1428-
noexcept(noexcept(this->_Map.stride(_Idx))) /* strengthened */ {
1429-
return this->_Map.stride(_Idx);
1425+
noexcept(noexcept(_Mapping._Map.stride(_Idx))) /* strengthened */ {
1426+
return _Mapping._Map.stride(_Idx);
14301427
}
14311428

14321429
private:
14331430
template <class... _OtherIndexTypes>
14341431
_NODISCARD constexpr reference _Access_impl(_OtherIndexTypes... _Indices) const
1435-
noexcept(noexcept(this->_Acc.access(_Ptr, static_cast<size_t>(this->_Map(_Indices...))))) {
1432+
noexcept(noexcept(_Accessor._Acc.access(_Ptr, static_cast<size_t>(_Mapping._Map(_Indices...))))) {
14361433
_STL_INTERNAL_STATIC_ASSERT(conjunction_v<is_same<_OtherIndexTypes, index_type>...>);
14371434
#if _MSVC_STL_HARDENING_MDSPAN || _ITERATOR_DEBUG_LEVEL != 0
1438-
_STL_VERIFY(this->_Map.extents()._Contains_multidimensional_index(make_index_sequence<rank()>{}, _Indices...),
1439-
"mdspan subscript out of range; extents_type::index-cast(std::move(indices)) must be "
1440-
"a multidimensional index in extents() (N5001 [mdspan.mdspan.members]/3).");
1435+
_STL_VERIFY(
1436+
_Mapping._Map.extents()._Contains_multidimensional_index(make_index_sequence<rank()>{}, _Indices...),
1437+
"mdspan subscript out of range; extents_type::index-cast(std::move(indices)) must be a multidimensional "
1438+
"index in extents() (N5001 [mdspan.mdspan.members]/3).");
14411439
#endif
14421440

1443-
return this->_Acc.access(_Ptr, static_cast<size_t>(this->_Map(_Indices...)));
1441+
return _Accessor._Acc.access(_Ptr, static_cast<size_t>(_Mapping._Map(_Indices...)));
14441442
}
14451443

1446-
/* [[no_unique_address]] */ data_handle_type _Ptr = data_handle_type();
1444+
_MSVC_NO_UNIQUE_ADDRESS _Mdspan_mapping_holder<extents_type, layout_type> _Mapping;
1445+
_MSVC_NO_UNIQUE_ADDRESS _Mdspan_accessor_holder<accessor_type> _Accessor;
1446+
_MSVC_NO_UNIQUE_ADDRESS data_handle_type _Ptr = data_handle_type();
14471447
};
14481448

14491449
template <class _CArray>
@@ -1480,7 +1480,7 @@ mdspan(const typename _AccessorType::data_handle_type&, const _MappingType&, con
14801480
_STD_END
14811481

14821482
// TRANSITION, non-_Ugly attribute tokens
1483-
#pragma pop_macro("empty_bases")
1483+
#pragma pop_macro("msvc")
14841484

14851485
#pragma pop_macro("new")
14861486
_STL_RESTORE_CLANG_WARNINGS

stl/inc/ranges

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ _STL_DISABLE_CLANG_WARNINGS
3131
#pragma push_macro("new")
3232
#undef new
3333

34+
// TRANSITION, non-_Ugly attribute tokens
35+
#pragma push_macro("msvc")
36+
#undef msvc
37+
3438
_STD_BEGIN
3539
namespace ranges {
3640
// MUCH machinery defined in <xutility>, some in <__msvc_ranges_to.hpp>
@@ -1087,7 +1091,7 @@ namespace ranges {
10871091
using _Index_type = conditional_t<same_as<_Bo, unreachable_sentinel_t>, ptrdiff_t, _Bo>;
10881092

10891093
const _Ty* _Value{};
1090-
/* [[no_unique_address]] */ _Index_type _Current{};
1094+
_Index_type _Current{};
10911095

10921096
constexpr explicit _Iterator(const _Ty* _Val, _Index_type _Bo_ = _Index_type{}) noexcept // strengthened
10931097
: _Value(_Val), _Current(_Bo_) {
@@ -3453,7 +3457,7 @@ namespace ranges {
34533457
using _Parent_t = _Maybe_const<_Const, join_with_view>;
34543458
using _Base = _Maybe_const<_Const, _Vw>;
34553459

3456-
/* [[no_unique_address]] */ sentinel_t<_Base> _Last{};
3460+
_MSVC_NO_UNIQUE_ADDRESS sentinel_t<_Base> _Last{};
34573461

34583462
constexpr explicit _Sentinel(_Parent_t& _Parent)
34593463
noexcept(noexcept(_RANGES end(_Parent._Range))
@@ -5129,7 +5133,7 @@ namespace ranges {
51295133
using _Base_iterator = iterator_t<_Base_t>;
51305134
using _Reference_type = tuple<range_difference_t<_Base_t>, range_reference_t<_Base_t>>;
51315135

5132-
/* [[no_unique_address]] */ _Base_iterator _Current{};
5136+
_MSVC_NO_UNIQUE_ADDRESS _Base_iterator _Current{};
51335137
range_difference_t<_Base_t> _Pos = 0;
51345138

51355139
constexpr explicit _Iterator(_Base_iterator _Current_, range_difference_t<_Base_t> _Pos_)
@@ -5289,7 +5293,7 @@ namespace ranges {
52895293
using _Base_t = _Maybe_const<_Const, _Vw>;
52905294
using _Base_sentinel = sentinel_t<_Base_t>;
52915295

5292-
/* [[no_unique_address]] */ _Base_sentinel _End{};
5296+
_MSVC_NO_UNIQUE_ADDRESS _Base_sentinel _End{};
52935297

52945298
constexpr explicit _Sentinel(_Base_sentinel _End_)
52955299
noexcept(is_nothrow_move_constructible_v<_Base_sentinel>) // strengthened
@@ -5725,8 +5729,8 @@ namespace ranges {
57255729
using _Base_iterator = iterator_t<_Base>;
57265730
using _Base_sentinel = sentinel_t<_Base>;
57275731

5728-
/* [[no_unique_address]] */ _Base_iterator _Current{};
5729-
/* [[no_unique_address]] */ _Base_sentinel _End{};
5732+
_MSVC_NO_UNIQUE_ADDRESS _Base_iterator _Current{};
5733+
_MSVC_NO_UNIQUE_ADDRESS _Base_sentinel _End{};
57305734
range_difference_t<_Base> _Count = 0;
57315735
range_difference_t<_Base> _Missing = 0;
57325736

@@ -6284,7 +6288,7 @@ namespace ranges {
62846288
class _Sentinel {
62856289
private:
62866290
friend slide_view;
6287-
/* [[no_unique_address]] */ sentinel_t<_Vw> _Last{};
6291+
_MSVC_NO_UNIQUE_ADDRESS sentinel_t<_Vw> _Last{};
62886292

62896293
constexpr explicit _Sentinel(sentinel_t<_Vw> _Last_)
62906294
noexcept(is_nothrow_move_constructible_v<sentinel_t<_Vw>>) /* strengthened */
@@ -9243,6 +9247,9 @@ _EXPORT_STD namespace views = ranges::views;
92439247

92449248
_STD_END
92459249

9250+
// TRANSITION, non-_Ugly attribute tokens
9251+
#pragma pop_macro("msvc")
9252+
92469253
#pragma pop_macro("new")
92479254
_STL_RESTORE_CLANG_WARNINGS
92489255
#pragma warning(pop)

0 commit comments

Comments
 (0)