Author: Arthur O'Dwyer Date: 2021-06-16T13:22:55-04:00 New Revision: 6412392511340a7f1793a00b5b501692300089e6
URL: https://github.com/llvm/llvm-project/commit/6412392511340a7f1793a00b5b501692300089e6 DIFF: https://github.com/llvm/llvm-project/commit/6412392511340a7f1793a00b5b501692300089e6.diff LOG: [🍒][libc++] __bit_iterator mustn't rely on deprecated SMF generation. This allows us to turn -Wdeprecated-copy back on. We turned it off in 3b71de41cc7c7 because Clang's implementation became more stringent and started diagnosing the old code here. Differential Revision: https://reviews.llvm.org/D101183 (cherry picked from commit 70d94c3f2cae71ade2ceacdceb3d2e9899d2289a) Added: Modified: libcxx/include/__bit_reference Removed: ################################################################################ diff --git a/libcxx/include/__bit_reference b/libcxx/include/__bit_reference index 9cfb4b84e6535..d44ad03d31345 100644 --- a/libcxx/include/__bit_reference +++ b/libcxx/include/__bit_reference @@ -1114,28 +1114,26 @@ public: #endif {} - // avoid re-declaring a copy constructor for the non-const version. - using __type_for_copy_to_const = - _If<_IsConst, __bit_iterator<_Cp, false>, struct __private_nat>; - + // When _IsConst=false, this is the copy constructor. + // It is non-trivial. Making it trivial would break ABI. + // When _IsConst=true, this is a converting constructor; + // the copy and move constructors are implicitly generated + // and trivial. _LIBCPP_INLINE_VISIBILITY - __bit_iterator(const __type_for_copy_to_const& __it) _NOEXCEPT + __bit_iterator(const __bit_iterator<_Cp, false>& __it) _NOEXCEPT : __seg_(__it.__seg_), __ctz_(__it.__ctz_) {} - // The non-const __bit_iterator has historically had a non-trivial - // copy constructor (as a quirk of its construction). We need to maintain - // this for ABI purposes. - using __type_for_abi_non_trivial_copy_ctor = - _If<!_IsConst, __bit_iterator, struct __private_nat>; - - _LIBCPP_INLINE_VISIBILITY - __bit_iterator(__type_for_abi_non_trivial_copy_ctor const& __it) _NOEXCEPT - : __seg_(__it.__seg_), __ctz_(__it.__ctz_) {} - - // Always declare the copy assignment operator since the implicit declaration - // is deprecated. + // When _IsConst=false, we have a user-provided copy constructor, + // so we must also provide a copy assignment operator because + // the implicit generation of a defaulted one is deprecated. + // When _IsConst=true, the assignment operators are + // implicitly generated and trivial. _LIBCPP_INLINE_VISIBILITY - __bit_iterator& operator=(__bit_iterator const&) = default; + __bit_iterator& operator=(const _If<_IsConst, struct __private_nat, __bit_iterator>& __it) { + __seg_ = __it.__seg_; + __ctz_ = __it.__ctz_; + return *this; + } _LIBCPP_INLINE_VISIBILITY reference operator*() const _NOEXCEPT {return reference(__seg_, __storage_type(1) << __ctz_);} _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits