Add more tests for enable_shared_from_this ambiguities
authorJonathan Wakely <jwakely@redhat.com>
Thu, 20 Oct 2016 10:13:04 +0000 (11:13 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Thu, 20 Oct 2016 10:13:04 +0000 (11:13 +0100)
* testsuite/20_util/enable_shared_from_this/56383.cc: Add tests for
additional ambiguous cases.

From-SVN: r241364

libstdc++-v3/ChangeLog
libstdc++-v3/testsuite/20_util/enable_shared_from_this/56383.cc

index 93a8f3ec4ca2343791b73448ce2f9640ac6930bb..340a7f6bfe3e67c96a39f9750db65985b4a7532d 100644 (file)
@@ -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
index fb3fa69d073a5df5beef22f846d940e634ac45e6..9220eaf4e821566f7d42bba8c54065755cf2375e 100644 (file)
 #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();
 }