From 7c5c4ef25000522f341d2edb21344a2fe2b881ad Mon Sep 17 00:00:00 2001 From: Dimitry Andric Date: Sat, 3 Jun 2017 15:21:10 +0000 Subject: Vendor import of libc++ trunk r304659: https://llvm.org/svn/llvm-project/libcxx/trunk@304659 --- include/__hash_table | 2 +- test/libcxx/containers/unord/next_pow2.pass.cpp | 88 ++++++++++++++++++++++ .../coroutine.handle.completion/done.pass.cpp | 2 +- .../end.to.end/await_result.pass.cpp | 4 +- .../end.to.end/bool_await_suspend.pass.cpp | 5 +- .../end.to.end/generator.pass.cpp | 3 + .../end.to.end/oneshot_func.pass.cpp | 4 +- 7 files changed, 101 insertions(+), 7 deletions(-) create mode 100644 test/libcxx/containers/unord/next_pow2.pass.cpp diff --git a/include/__hash_table b/include/__hash_table index 79336ff793ec..3f430af1283e 100644 --- a/include/__hash_table +++ b/include/__hash_table @@ -137,7 +137,7 @@ inline _LIBCPP_INLINE_VISIBILITY size_t __next_hash_pow2(size_t __n) { - return size_t(1) << (std::numeric_limits::digits - __clz(__n-1)); + return __n < 2 ? __n : (size_t(1) << (std::numeric_limits::digits - __clz(__n-1))); } diff --git a/test/libcxx/containers/unord/next_pow2.pass.cpp b/test/libcxx/containers/unord/next_pow2.pass.cpp new file mode 100644 index 000000000000..3784eb87cebb --- /dev/null +++ b/test/libcxx/containers/unord/next_pow2.pass.cpp @@ -0,0 +1,88 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// REQUIRES: long_tests +// UNSUPPORTED: c++98, c++03 + +// Not a portable test + +// <__hash_table> + +// size_t __next_hash_pow2(size_t n); + +// If n <= 1, return n. If n is a power of 2, return n. +// Otherwise, return the next power of 2. + +#include <__hash_table> +#include +#include + +#include + +bool +is_power_of_two(unsigned long n) +{ + return __builtin_popcount(n) == 1; +} + +void test_next_pow2_val(size_t n) +{ + std::size_t npow2 = std::__next_hash_pow2(n); + assert(is_power_of_two(npow2) && npow2 > n); +} + +void +test_next_pow2() +{ + assert(!is_power_of_two(0)); + assert(is_power_of_two(1)); + assert(is_power_of_two(2)); + assert(!is_power_of_two(3)); + + assert(std::__next_hash_pow2(0) == 0); + assert(std::__next_hash_pow2(1) == 1); + + for (std::size_t n = 2; n < (sizeof(std::size_t) * 8 - 1); ++n) + { + std::size_t pow2 = 1ULL << n; + assert(std::__next_hash_pow2(pow2) == pow2); + } + + test_next_pow2_val(3); + test_next_pow2_val(7); + test_next_pow2_val(9); + test_next_pow2_val(15); + test_next_pow2_val(127); + test_next_pow2_val(129); +} + +// Note: this is only really useful when run with -fsanitize=undefined. +void +fuzz_unordered_map_reserve(unsigned num_inserts, + unsigned num_reserve1, + unsigned num_reserve2) +{ + std::unordered_map m; + m.reserve(num_reserve1); + for (unsigned I = 0; I < num_inserts; ++I) m[I] = 0; + m.reserve(num_reserve2); + assert(m.bucket_count() >= num_reserve2); +} + +int main() +{ + test_next_pow2(); + + for (unsigned num_inserts = 0; num_inserts <= 64; ++num_inserts) + for (unsigned num_reserve1 = 1; num_reserve1 <= 64; ++num_reserve1) + for (unsigned num_reserve2 = 1; num_reserve2 <= 64; ++num_reserve2) + fuzz_unordered_map_reserve(num_inserts, num_reserve1, num_reserve2); + + return 0; +} diff --git a/test/std/experimental/language.support/support.coroutines/coroutine.handle/coroutine.handle.completion/done.pass.cpp b/test/std/experimental/language.support/support.coroutines/coroutine.handle/coroutine.handle.completion/done.pass.cpp index 74a9e7bda04e..240d9324507c 100644 --- a/test/std/experimental/language.support/support.coroutines/coroutine.handle/coroutine.handle.completion/done.pass.cpp +++ b/test/std/experimental/language.support/support.coroutines/coroutine.handle/coroutine.handle.completion/done.pass.cpp @@ -33,7 +33,7 @@ void do_test(coro::coroutine_handle const& H) { // FIXME Add a runtime test { ASSERT_SAME_TYPE(decltype(H.done()), bool); - ASSERT_NOT_NOEXCEPT(H.done()); + LIBCPP_ASSERT_NOT_NOEXCEPT(H.done()); } } diff --git a/test/std/experimental/language.support/support.coroutines/end.to.end/await_result.pass.cpp b/test/std/experimental/language.support/support.coroutines/end.to.end/await_result.pass.cpp index 769a825df001..b8606317ae56 100644 --- a/test/std/experimental/language.support/support.coroutines/end.to.end/await_result.pass.cpp +++ b/test/std/experimental/language.support/support.coroutines/end.to.end/await_result.pass.cpp @@ -23,7 +23,7 @@ struct coro_t { } suspend_never initial_suspend() { return {}; } suspend_never final_suspend() { return {}; } - void return_void(){} + void return_void() {} static void unhandled_exception() {} }; }; @@ -37,7 +37,7 @@ struct B { struct A { - ~A(){} + ~A() {} bool await_ready() { return true; } int await_resume() { return 42; } template void await_suspend(F) {} diff --git a/test/std/experimental/language.support/support.coroutines/end.to.end/bool_await_suspend.pass.cpp b/test/std/experimental/language.support/support.coroutines/end.to.end/bool_await_suspend.pass.cpp index 9c3becffc0ac..12ab92ff3004 100644 --- a/test/std/experimental/language.support/support.coroutines/end.to.end/bool_await_suspend.pass.cpp +++ b/test/std/experimental/language.support/support.coroutines/end.to.end/bool_await_suspend.pass.cpp @@ -10,6 +10,9 @@ // UNSUPPORTED: c++98, c++03, c++11 +// See https://bugs.llvm.org/show_bug.cgi?id=33271 +// UNSUPPORTED: ubsan + #include #include @@ -22,7 +25,7 @@ struct coro_t { } suspend_never initial_suspend() { return {}; } suspend_never final_suspend() { return {}; } - void return_void(){} + void return_void() {} void unhandled_exception() {} }; coro_t(coroutine_handle hh) : h(hh) {} diff --git a/test/std/experimental/language.support/support.coroutines/end.to.end/generator.pass.cpp b/test/std/experimental/language.support/support.coroutines/end.to.end/generator.pass.cpp index 9200fae91576..c92e26184ff6 100644 --- a/test/std/experimental/language.support/support.coroutines/end.to.end/generator.pass.cpp +++ b/test/std/experimental/language.support/support.coroutines/end.to.end/generator.pass.cpp @@ -10,6 +10,9 @@ // UNSUPPORTED: c++98, c++03, c++11 +// See https://bugs.llvm.org/show_bug.cgi?id=33271 +// UNSUPPORTED: ubsan + #include #include #include diff --git a/test/std/experimental/language.support/support.coroutines/end.to.end/oneshot_func.pass.cpp b/test/std/experimental/language.support/support.coroutines/end.to.end/oneshot_func.pass.cpp index d5f2c40e2a79..ae0a950dc686 100644 --- a/test/std/experimental/language.support/support.coroutines/end.to.end/oneshot_func.pass.cpp +++ b/test/std/experimental/language.support/support.coroutines/end.to.end/oneshot_func.pass.cpp @@ -68,10 +68,10 @@ private: std::vector yielded_values = {}; int yield(int x) { yielded_values.push_back(x); return x + 1; } -float fyield(int x) { yielded_values.push_back(x); return x + 2; } +float fyield(int x) { yielded_values.push_back(x); return static_cast(x + 2); } void Do1(func f) { yield(f()); } -void Do2(func f) { yield(f()); } +void Do2(func f) { yield(static_cast(f())); } int main() { Do1([] { return yield(43); }); -- cgit v1.2.3