diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2016-10-20 11:13:04 +0100 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2016-10-20 11:13:04 +0100 |
commit | 4f63d614fa51b4f2f28ea8d61af765c6b58b90e2 (patch) | |
tree | f24e3aeb17983171351c0d6abf2d7bfe5044caf9 /libstdc++-v3 | |
parent | 775669c1ebd58284734ae4261965b425356e2fca (diff) | |
download | gcc-4f63d614fa51b4f2f28ea8d61af765c6b58b90e2.zip gcc-4f63d614fa51b4f2f28ea8d61af765c6b58b90e2.tar.gz gcc-4f63d614fa51b4f2f28ea8d61af765c6b58b90e2.tar.bz2 |
Add more tests for enable_shared_from_this ambiguities
* testsuite/20_util/enable_shared_from_this/56383.cc: Add tests for
additional ambiguous cases.
From-SVN: r241364
Diffstat (limited to 'libstdc++-v3')
-rw-r--r-- | libstdc++-v3/ChangeLog | 5 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/20_util/enable_shared_from_this/56383.cc | 69 |
2 files changed, 54 insertions, 20 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 93a8f3e..340a7f6 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,8 @@ +2016-10-20 Jonathan Wakely <jwakely@redhat.com> + + * testsuite/20_util/enable_shared_from_this/56383.cc: Add tests for + additional ambiguous cases. + 2016-10-19 Jonathan Wakely <jwakely@redhat.com> * include/backward/auto_ptr.h (__shared_ptr(auto_ptr&&)): Call diff --git a/libstdc++-v3/testsuite/20_util/enable_shared_from_this/56383.cc b/libstdc++-v3/testsuite/20_util/enable_shared_from_this/56383.cc index fb3fa69..9220eaf 100644 --- a/libstdc++-v3/testsuite/20_util/enable_shared_from_this/56383.cc +++ b/libstdc++-v3/testsuite/20_util/enable_shared_from_this/56383.cc @@ -20,37 +20,66 @@ #include <memory> #include <testsuite_hooks.h> -struct A : std::enable_shared_from_this<A> +template<typename T> +bool not_enabled(T& t) { - void* a() { return shared_from_this().get(); } -}; +#if __cpp_lib_enable_shared_from_this >= 201603 + return t.weak_from_this().expired(); +#else + try { + t.shared_from_this(); + return false; + } catch (const std::bad_weak_ptr&) { + return true; + } +#endif +} -struct B : std::enable_shared_from_this<B> -{ -}; +struct A : std::enable_shared_from_this<A> { }; +struct B : std::enable_shared_from_this<B> { }; +struct D : A, B { }; -struct D : A, B +void test01() { -}; + auto d = std::make_shared<D>(); + VERIFY( not_enabled( static_cast<A&>(*d) ) ); + VERIFY( not_enabled( static_cast<const A&>(*d) ) ); + VERIFY( not_enabled( static_cast<B&>(*d) ) ); + VERIFY( not_enabled( static_cast<const B&>(*d) ) ); +} -void test01() +struct E : std::__enable_shared_from_this<E> { }; +struct F : std::__enable_shared_from_this<F> { }; +struct G : E, F { }; + +void test02() { - bool test = false; + auto g = std::make_shared<G>(); + VERIFY( not_enabled( static_cast<E&>(*g) ) ); + VERIFY( not_enabled( static_cast<const E&>(*g) ) ); + VERIFY( not_enabled( static_cast<F&>(*g) ) ); + VERIFY( not_enabled( static_cast<const F&>(*g) ) ); +} - auto d = std::make_shared<D>(); - try - { - d->a(); - } - catch (const std::bad_weak_ptr&) - { - test = true; - } - VERIFY(test); +struct H : D, G { }; + +void test03() +{ + auto h = std::make_shared<H>(); + VERIFY( not_enabled( static_cast<A&>(*h) ) ); + VERIFY( not_enabled( static_cast<const A&>(*h) ) ); + VERIFY( not_enabled( static_cast<B&>(*h) ) ); + VERIFY( not_enabled( static_cast<const B&>(*h) ) ); + VERIFY( not_enabled( static_cast<E&>(*h) ) ); + VERIFY( not_enabled( static_cast<const E&>(*h) ) ); + VERIFY( not_enabled( static_cast<F&>(*h) ) ); + VERIFY( not_enabled( static_cast<const F&>(*h) ) ); } int main() { test01(); + test02(); + test03(); } |