nested_exception.h: Do not try to derive from final classes.
authorJonathan Wakely <jwakely@redhat.com>
Tue, 17 Mar 2015 14:24:55 +0000 (14:24 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Tue, 17 Mar 2015 14:24:55 +0000 (14:24 +0000)
* libsupc++/nested_exception.h: Do not try to derive from final
classes.
* testsuite/18_support/nested_exception/throw_with_nested.cc: Test
final class.

From-SVN: r221476

libstdc++-v3/ChangeLog
libstdc++-v3/libsupc++/nested_exception.h
libstdc++-v3/testsuite/18_support/nested_exception/throw_with_nested.cc

index efba7a417fc67d35339992b8ead9cced6eee0d57..ce12e81ab5f4c38fe3b00f1a5b54fd21c7d39997 100644 (file)
@@ -1,3 +1,10 @@
+2015-03-17  Jonathan Wakely  <jwakely@redhat.com>
+
+       * libsupc++/nested_exception.h: Do not try to derive from final
+       classes.
+       * testsuite/18_support/nested_exception/throw_with_nested.cc: Test
+       final class.
+
 2015-03-13  Jonathan Wakely  <jwakely@redhat.com>
 
        * acinclude.m4: Make --enable-libstdcxx-time=auto work for dragonfly.
index 7f7e14e32f67975c09776a5e0f50ea496469c69a..a716f75adf4e06557a8468052922b0bb5a8caccd 100644 (file)
@@ -108,7 +108,7 @@ namespace std
        { throw static_cast<_Up&&>(__t); }
     };
 
-  template<typename _Tp, bool = __is_class(_Tp)>
+  template<typename _Tp, bool = __is_class(_Tp) && !__is_final(_Tp)>
     struct _Throw_with_nested_helper : _Throw_with_nested_impl<_Tp>
     { };
 
index f1a0e9a20f4165daac0156248d023bc412945528..7ebf3b774e6075a09097798748ac0021324bedaa 100644 (file)
@@ -26,6 +26,8 @@ struct derived : std::nested_exception { };
 struct not_derived { virtual ~not_derived() noexcept; };
 inline not_derived::~not_derived() noexcept = default;
 
+struct uninheritable final { };
+
 void test01() 
 {
   bool test __attribute__((unused)) = false;
@@ -72,9 +74,29 @@ void test02()
   VERIFY( test );
 }
 
+void test03()
+{
+  bool test __attribute__((unused)) = false;
+
+  try
+  {
+    std::throw_with_nested(uninheritable());
+  }
+  catch (const std::nested_exception&)
+  {
+    VERIFY( false );
+  }
+  catch(const uninheritable&)
+  {
+    test = true;
+  }
+  VERIFY( test );
+}
+
 int main()
 {
   test01();
   test02();
+  test03();
   return 0;
 }