STL_MSFT created this revision. STL_MSFT added reviewers: EricWF, mclow.lists. STL_MSFT added a subscriber: cfe-commits.
Make dtor_noexcept.pass.cpp tests more portable. They were static_asserting that in certain situations, the following things have throwing destructors: ordered/unordered associative containers non-array sequence containers (deque, forward_list, list, vector, vector<bool>) basic_string However, C++11 through N4594 17.6.5.12 [res.on.exception.handling]/4 says "Destructor operations defined in the C++ standard library shall not throw exceptions. Every destructor in the C++ standard library shall behave as if it had a non-throwing exception specification." This is observable through is_nothrow_destructible, so I actually believe that both the libc++ product and tests are being non-conformant here. MSVC's STL marks all destructors as unconditionally noexcept (permitted and indeed required by the Standardese quoted above), so these static_asserts are failing for us. Changing them to LIBCPP_STATIC_ASSERT resolves these failures. http://reviews.llvm.org/D21717 Files: test/std/containers/associative/map/map.cons/dtor_noexcept.pass.cpp test/std/containers/associative/multimap/multimap.cons/dtor_noexcept.pass.cpp test/std/containers/associative/multiset/multiset.cons/dtor_noexcept.pass.cpp test/std/containers/associative/set/set.cons/dtor_noexcept.pass.cpp test/std/containers/sequences/deque/deque.cons/dtor_noexcept.pass.cpp test/std/containers/sequences/forwardlist/forwardlist.cons/dtor_noexcept.pass.cpp test/std/containers/sequences/list/list.cons/dtor_noexcept.pass.cpp test/std/containers/sequences/vector.bool/dtor_noexcept.pass.cpp test/std/containers/sequences/vector/vector.cons/dtor_noexcept.pass.cpp test/std/containers/unord/unord.map/unord.map.cnstr/dtor_noexcept.pass.cpp test/std/containers/unord/unord.multimap/unord.multimap.cnstr/dtor_noexcept.pass.cpp test/std/containers/unord/unord.multiset/unord.multiset.cnstr/dtor_noexcept.pass.cpp test/std/containers/unord/unord.set/unord.set.cnstr/dtor_noexcept.pass.cpp test/std/strings/basic.string/string.cons/dtor_noexcept.pass.cpp
Index: test/std/strings/basic.string/string.cons/dtor_noexcept.pass.cpp =================================================================== --- test/std/strings/basic.string/string.cons/dtor_noexcept.pass.cpp +++ test/std/strings/basic.string/string.cons/dtor_noexcept.pass.cpp @@ -38,6 +38,6 @@ } { typedef std::basic_string<char, std::char_traits<char>, some_alloc<char>> C; - static_assert(!std::is_nothrow_destructible<C>::value, ""); + LIBCPP_STATIC_ASSERT(!std::is_nothrow_destructible<C>::value, ""); } } Index: test/std/containers/unord/unord.set/unord.set.cnstr/dtor_noexcept.pass.cpp =================================================================== --- test/std/containers/unord/unord.set/unord.set.cnstr/dtor_noexcept.pass.cpp +++ test/std/containers/unord/unord.set/unord.set.cnstr/dtor_noexcept.pass.cpp @@ -54,11 +54,11 @@ } { typedef std::unordered_set<MoveOnly, some_hash<MoveOnly>> C; - static_assert(!std::is_nothrow_destructible<C>::value, ""); + LIBCPP_STATIC_ASSERT(!std::is_nothrow_destructible<C>::value, ""); } { typedef std::unordered_set<MoveOnly, std::hash<MoveOnly>, some_comp<MoveOnly>> C; - static_assert(!std::is_nothrow_destructible<C>::value, ""); + LIBCPP_STATIC_ASSERT(!std::is_nothrow_destructible<C>::value, ""); } } Index: test/std/containers/unord/unord.multiset/unord.multiset.cnstr/dtor_noexcept.pass.cpp =================================================================== --- test/std/containers/unord/unord.multiset/unord.multiset.cnstr/dtor_noexcept.pass.cpp +++ test/std/containers/unord/unord.multiset/unord.multiset.cnstr/dtor_noexcept.pass.cpp @@ -54,11 +54,11 @@ } { typedef std::unordered_multiset<MoveOnly, some_hash<MoveOnly>> C; - static_assert(!std::is_nothrow_destructible<C>::value, ""); + LIBCPP_STATIC_ASSERT(!std::is_nothrow_destructible<C>::value, ""); } { typedef std::unordered_multiset<MoveOnly, std::hash<MoveOnly>, some_comp<MoveOnly>> C; - static_assert(!std::is_nothrow_destructible<C>::value, ""); + LIBCPP_STATIC_ASSERT(!std::is_nothrow_destructible<C>::value, ""); } } Index: test/std/containers/unord/unord.multimap/unord.multimap.cnstr/dtor_noexcept.pass.cpp =================================================================== --- test/std/containers/unord/unord.multimap/unord.multimap.cnstr/dtor_noexcept.pass.cpp +++ test/std/containers/unord/unord.multimap/unord.multimap.cnstr/dtor_noexcept.pass.cpp @@ -54,11 +54,11 @@ } { typedef std::unordered_multimap<MoveOnly, MoveOnly, some_hash<MoveOnly>> C; - static_assert(!std::is_nothrow_destructible<C>::value, ""); + LIBCPP_STATIC_ASSERT(!std::is_nothrow_destructible<C>::value, ""); } { typedef std::unordered_multimap<MoveOnly, MoveOnly, std::hash<MoveOnly>, some_comp<MoveOnly>> C; - static_assert(!std::is_nothrow_destructible<C>::value, ""); + LIBCPP_STATIC_ASSERT(!std::is_nothrow_destructible<C>::value, ""); } } Index: test/std/containers/unord/unord.map/unord.map.cnstr/dtor_noexcept.pass.cpp =================================================================== --- test/std/containers/unord/unord.map/unord.map.cnstr/dtor_noexcept.pass.cpp +++ test/std/containers/unord/unord.map/unord.map.cnstr/dtor_noexcept.pass.cpp @@ -54,11 +54,11 @@ } { typedef std::unordered_map<MoveOnly, MoveOnly, some_hash<MoveOnly>> C; - static_assert(!std::is_nothrow_destructible<C>::value, ""); + LIBCPP_STATIC_ASSERT(!std::is_nothrow_destructible<C>::value, ""); } { typedef std::unordered_map<MoveOnly, MoveOnly, std::hash<MoveOnly>, some_comp<MoveOnly>> C; - static_assert(!std::is_nothrow_destructible<C>::value, ""); + LIBCPP_STATIC_ASSERT(!std::is_nothrow_destructible<C>::value, ""); } } Index: test/std/containers/sequences/vector/vector.cons/dtor_noexcept.pass.cpp =================================================================== --- test/std/containers/sequences/vector/vector.cons/dtor_noexcept.pass.cpp +++ test/std/containers/sequences/vector/vector.cons/dtor_noexcept.pass.cpp @@ -43,6 +43,6 @@ } { typedef std::vector<MoveOnly, some_alloc<MoveOnly>> C; - static_assert(!std::is_nothrow_destructible<C>::value, ""); + LIBCPP_STATIC_ASSERT(!std::is_nothrow_destructible<C>::value, ""); } } Index: test/std/containers/sequences/vector.bool/dtor_noexcept.pass.cpp =================================================================== --- test/std/containers/sequences/vector.bool/dtor_noexcept.pass.cpp +++ test/std/containers/sequences/vector.bool/dtor_noexcept.pass.cpp @@ -42,6 +42,6 @@ } { typedef std::vector<bool, some_alloc<bool>> C; - static_assert(!std::is_nothrow_destructible<C>::value, ""); + LIBCPP_STATIC_ASSERT(!std::is_nothrow_destructible<C>::value, ""); } } Index: test/std/containers/sequences/list/list.cons/dtor_noexcept.pass.cpp =================================================================== --- test/std/containers/sequences/list/list.cons/dtor_noexcept.pass.cpp +++ test/std/containers/sequences/list/list.cons/dtor_noexcept.pass.cpp @@ -43,6 +43,6 @@ } { typedef std::list<MoveOnly, some_alloc<MoveOnly>> C; - static_assert(!std::is_nothrow_destructible<C>::value, ""); + LIBCPP_STATIC_ASSERT(!std::is_nothrow_destructible<C>::value, ""); } } Index: test/std/containers/sequences/forwardlist/forwardlist.cons/dtor_noexcept.pass.cpp =================================================================== --- test/std/containers/sequences/forwardlist/forwardlist.cons/dtor_noexcept.pass.cpp +++ test/std/containers/sequences/forwardlist/forwardlist.cons/dtor_noexcept.pass.cpp @@ -43,6 +43,6 @@ } { typedef std::forward_list<MoveOnly, some_alloc<MoveOnly>> C; - static_assert(!std::is_nothrow_destructible<C>::value, ""); + LIBCPP_STATIC_ASSERT(!std::is_nothrow_destructible<C>::value, ""); } } Index: test/std/containers/sequences/deque/deque.cons/dtor_noexcept.pass.cpp =================================================================== --- test/std/containers/sequences/deque/deque.cons/dtor_noexcept.pass.cpp +++ test/std/containers/sequences/deque/deque.cons/dtor_noexcept.pass.cpp @@ -43,6 +43,6 @@ } { typedef std::deque<MoveOnly, some_alloc<MoveOnly>> C; - static_assert(!std::is_nothrow_destructible<C>::value, ""); + LIBCPP_STATIC_ASSERT(!std::is_nothrow_destructible<C>::value, ""); } } Index: test/std/containers/associative/set/set.cons/dtor_noexcept.pass.cpp =================================================================== --- test/std/containers/associative/set/set.cons/dtor_noexcept.pass.cpp +++ test/std/containers/associative/set/set.cons/dtor_noexcept.pass.cpp @@ -43,6 +43,6 @@ } { typedef std::set<MoveOnly, some_comp<MoveOnly>> C; - static_assert(!std::is_nothrow_destructible<C>::value, ""); + LIBCPP_STATIC_ASSERT(!std::is_nothrow_destructible<C>::value, ""); } } Index: test/std/containers/associative/multiset/multiset.cons/dtor_noexcept.pass.cpp =================================================================== --- test/std/containers/associative/multiset/multiset.cons/dtor_noexcept.pass.cpp +++ test/std/containers/associative/multiset/multiset.cons/dtor_noexcept.pass.cpp @@ -43,6 +43,6 @@ } { typedef std::multiset<MoveOnly, some_comp<MoveOnly>> C; - static_assert(!std::is_nothrow_destructible<C>::value, ""); + LIBCPP_STATIC_ASSERT(!std::is_nothrow_destructible<C>::value, ""); } } Index: test/std/containers/associative/multimap/multimap.cons/dtor_noexcept.pass.cpp =================================================================== --- test/std/containers/associative/multimap/multimap.cons/dtor_noexcept.pass.cpp +++ test/std/containers/associative/multimap/multimap.cons/dtor_noexcept.pass.cpp @@ -44,6 +44,6 @@ } { typedef std::multimap<MoveOnly, MoveOnly, some_comp<MoveOnly>> C; - static_assert(!std::is_nothrow_destructible<C>::value, ""); + LIBCPP_STATIC_ASSERT(!std::is_nothrow_destructible<C>::value, ""); } } Index: test/std/containers/associative/map/map.cons/dtor_noexcept.pass.cpp =================================================================== --- test/std/containers/associative/map/map.cons/dtor_noexcept.pass.cpp +++ test/std/containers/associative/map/map.cons/dtor_noexcept.pass.cpp @@ -44,6 +44,6 @@ } { typedef std::map<MoveOnly, MoveOnly, some_comp<MoveOnly>> C; - static_assert(!std::is_nothrow_destructible<C>::value, ""); + LIBCPP_STATIC_ASSERT(!std::is_nothrow_destructible<C>::value, ""); } }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits