diff options
| author | Louis Dionne <ldionne@apple.com> | 2019-04-11 16:14:56 +0000 |
|---|---|---|
| committer | Louis Dionne <ldionne@apple.com> | 2019-04-11 16:14:56 +0000 |
| commit | 7c142fcc06850c7cee3cdb07e98cc57f04ee5e8b (patch) | |
| tree | 91fc657ab4f9df17c22b8d4c2c6199bb4cb5f2a5 /libcxx/include/set | |
| parent | b971b59709075a28fa64e31564cf7d6f0bc9fecf (diff) | |
| download | bcm5719-llvm-7c142fcc06850c7cee3cdb07e98cc57f04ee5e8b.tar.gz bcm5719-llvm-7c142fcc06850c7cee3cdb07e98cc57f04ee5e8b.zip | |
[libc++] Make sure we don't eagerly diagnose non-const comparators for containers of incomplete types
Summary:
In r348529, I improved the library-defined diagnostic for using containers
with a non-const comparator/hasher. However, the check is now performed
too early, which leads to the diagnostic being emitted in cases where it
shouldn't. See PR41360 for details.
This patch moves the diagnostic to the destructor of the containers, which
means that the diagnostic will only be emitted when the container is instantiated
at a point where the comparator and the key/value are required to be complete.
We still retain better diagnostics than before r348529, because the diagnostics
are performed in the containers themselves instead of __tree and __hash_table.
As a drive-by fix, I improved the diagnostic to mention that we can't find
a _viable_ const call operator, as suggested by EricWF in PR41360.
Reviewers: EricWF, mclow.lists
Subscribers: christof, jkorous, dexonsmith, libcxx-commits, zoecarver
Tags: #libc
Differential Revision: https://reviews.llvm.org/D60540
llvm-svn: 358189
Diffstat (limited to 'libcxx/include/set')
| -rw-r--r-- | libcxx/include/set | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/libcxx/include/set b/libcxx/include/set index 17837228f26..4574f69fa8a 100644 --- a/libcxx/include/set +++ b/libcxx/include/set @@ -450,7 +450,6 @@ public: typedef value_type& reference; typedef const value_type& const_reference; - static_assert(sizeof(__diagnose_non_const_comparator<_Key, _Compare>()), ""); static_assert((is_same<typename allocator_type::value_type, value_type>::value), "Allocator::value_type must be same type as value_type"); @@ -597,6 +596,11 @@ public: #endif // _LIBCPP_CXX03_LANG _LIBCPP_INLINE_VISIBILITY + ~set() { + static_assert(sizeof(__diagnose_non_const_comparator<_Key, _Compare>()), ""); + } + + _LIBCPP_INLINE_VISIBILITY iterator begin() _NOEXCEPT {return __tree_.begin();} _LIBCPP_INLINE_VISIBILITY const_iterator begin() const _NOEXCEPT {return __tree_.begin();} @@ -938,7 +942,6 @@ public: typedef value_type& reference; typedef const value_type& const_reference; - static_assert(sizeof(__diagnose_non_const_comparator<_Key, _Compare>()), ""); static_assert((is_same<typename allocator_type::value_type, value_type>::value), "Allocator::value_type must be same type as value_type"); @@ -1084,6 +1087,11 @@ public: #endif // _LIBCPP_CXX03_LANG _LIBCPP_INLINE_VISIBILITY + ~multiset() { + static_assert(sizeof(__diagnose_non_const_comparator<_Key, _Compare>()), ""); + } + + _LIBCPP_INLINE_VISIBILITY iterator begin() _NOEXCEPT {return __tree_.begin();} _LIBCPP_INLINE_VISIBILITY const_iterator begin() const _NOEXCEPT {return __tree_.begin();} |

