|
Boost-Commit : |
From: emil_at_[hidden]
Date: 2008-06-11 14:24:11
Author: emildotchevski
Date: 2008-06-11 14:24:10 EDT (Wed, 11 Jun 2008)
New Revision: 46333
URL: http://svn.boost.org/trac/boost/changeset/46333
Log:
Fixed exception info bug when boost::exception is derived virtually.
Text files modified:
trunk/boost/exception/enable_current_exception.hpp | 6 +++++
trunk/libs/exception/test/helper2.cpp | 43 ++++++++++++++++++++++++++++-----------
trunk/libs/exception/test/helper2.hpp | 29 +++++++++++++++++++-------
trunk/libs/exception/test/throw_exception_test.cpp | 13 +++++++----
4 files changed, 66 insertions(+), 25 deletions(-)
Modified: trunk/boost/exception/enable_current_exception.hpp
==============================================================================
--- trunk/boost/exception/enable_current_exception.hpp (original)
+++ trunk/boost/exception/enable_current_exception.hpp 2008-06-11 14:24:10 EDT (Wed, 11 Jun 2008)
@@ -64,6 +64,9 @@
clone_impl( T const & x ):
T(x)
{
+ if( boost::exception * be1=dynamic_cast<boost::exception *>(this) )
+ if( boost::exception const * be2=dynamic_cast<T const *>(&x) )
+ *be1 = *be2;
}
private:
@@ -88,6 +91,9 @@
T(x),
count_(0)
{
+ if( boost::exception * be1=dynamic_cast<boost::exception *>(this) )
+ if( boost::exception const * be2=dynamic_cast<T const *>(&x) )
+ *be1 = *be2;
}
private:
Modified: trunk/libs/exception/test/helper2.cpp
==============================================================================
--- trunk/libs/exception/test/helper2.cpp (original)
+++ trunk/libs/exception/test/helper2.cpp 2008-06-11 14:24:10 EDT (Wed, 11 Jun 2008)
@@ -13,41 +13,60 @@
exception_test
{
inline
- some_boost_exception::
- some_boost_exception( int x ):
+ derives_boost_exception::
+ derives_boost_exception( int x ):
x_(x)
{
}
- some_boost_exception::
- ~some_boost_exception() throw()
+ derives_boost_exception::
+ ~derives_boost_exception() throw()
{
}
inline
- some_std_exception::
- some_std_exception( int x ):
+ derives_boost_exception_virtually::
+ derives_boost_exception_virtually( int x ):
x_(x)
{
}
- some_std_exception::
- ~some_std_exception() throw()
+ derives_boost_exception_virtually::
+ ~derives_boost_exception_virtually() throw()
{
}
+ inline
+ derives_std_exception::
+ derives_std_exception( int x ):
+ x_(x)
+ {
+ }
+
+ derives_std_exception::
+ ~derives_std_exception() throw()
+ {
+ }
+
+ template <>
+ void
+ throw_test_exception<derives_boost_exception>( int x )
+ {
+ boost::throw_exception( derives_boost_exception(x) );
+ }
+
template <>
void
- throw_test_exception<some_boost_exception>( int x )
+ throw_test_exception<derives_boost_exception_virtually>( int x )
{
- boost::throw_exception( some_boost_exception(x) );
+ boost::throw_exception( derives_boost_exception_virtually(x) );
}
template <>
void
- throw_test_exception<some_std_exception>( int x )
+ throw_test_exception<derives_std_exception>( int x )
{
- boost::throw_exception( some_std_exception(x) );
+ boost::throw_exception( derives_std_exception(x) );
}
}
}
Modified: trunk/libs/exception/test/helper2.hpp
==============================================================================
--- trunk/libs/exception/test/helper2.hpp (original)
+++ trunk/libs/exception/test/helper2.hpp 2008-06-11 14:24:10 EDT (Wed, 11 Jun 2008)
@@ -16,21 +16,31 @@
exception_test
{
struct
- some_boost_exception:
+ derives_boost_exception:
public boost::exception,
public std::exception
{
- explicit some_boost_exception( int x );
- virtual ~some_boost_exception() throw();
+ explicit derives_boost_exception( int x );
+ virtual ~derives_boost_exception() throw();
int x_;
};
struct
- some_std_exception:
+ derives_boost_exception_virtually:
+ public virtual boost::exception,
public std::exception
{
- explicit some_std_exception( int x );
- virtual ~some_std_exception() throw();
+ explicit derives_boost_exception_virtually( int x );
+ virtual ~derives_boost_exception_virtually() throw();
+ int x_;
+ };
+
+ struct
+ derives_std_exception:
+ public std::exception
+ {
+ explicit derives_std_exception( int x );
+ virtual ~derives_std_exception() throw();
int x_;
};
@@ -38,10 +48,13 @@
void throw_test_exception( int );
template <>
- void throw_test_exception<some_boost_exception>( int );
+ void throw_test_exception<derives_boost_exception>( int );
+
+ template <>
+ void throw_test_exception<derives_boost_exception_virtually>( int );
template <>
- void throw_test_exception<some_std_exception>( int );
+ void throw_test_exception<derives_std_exception>( int );
}
}
Modified: trunk/libs/exception/test/throw_exception_test.cpp
==============================================================================
--- trunk/libs/exception/test/throw_exception_test.cpp (original)
+++ trunk/libs/exception/test/throw_exception_test.cpp 2008-06-11 14:24:10 EDT (Wed, 11 Jun 2008)
@@ -8,7 +8,7 @@
#include <boost/exception_ptr.hpp>
#include <boost/detail/lightweight_test.hpp>
-typedef boost::error_info<struct tag_test_int,int> test_int;
+typedef boost::error_info<struct tag_test_int,int> test_data;
void
throw_fwd( void (*thrower)(int) )
@@ -20,7 +20,7 @@
catch(
boost::exception & x )
{
- x << test_int(42);
+ x << test_data(42);
throw;
}
}
@@ -46,7 +46,9 @@
catch(
T & y )
{
- BOOST_TEST(*boost::get_error_info<test_int>(y)==42);
+ BOOST_TEST(boost::get_error_info<test_data>(y));
+ if( boost::shared_ptr<int const> d=boost::get_error_info<test_data>(y) )
+ BOOST_TEST(*d==42);
BOOST_TEST(y.x_==42);
}
catch(
@@ -60,7 +62,8 @@
int
main()
{
- tester<boost::exception_test::some_boost_exception>();
- tester<boost::exception_test::some_std_exception>();
+ tester<boost::exception_test::derives_boost_exception>();
+ tester<boost::exception_test::derives_boost_exception_virtually>();
+ tester<boost::exception_test::derives_std_exception>();
return boost::report_errors();
}
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk