From ff48f2b3a011316122c362a19e60866420ddccd8 Mon Sep 17 00:00:00 2001 From: Steven Watanabe Date: Fri, 15 Feb 2013 19:22:34 +0000 Subject: [PATCH] Work around msvc bug when explicitly destroying a class with a virtual base. Fixes #5940. [SVN r82915] --- include/boost/optional/optional.hpp | 2 +- test/optional_test.cpp | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/include/boost/optional/optional.hpp b/include/boost/optional/optional.hpp index 0d6dba4..071e07c 100644 --- a/include/boost/optional/optional.hpp +++ b/include/boost/optional/optional.hpp @@ -476,7 +476,7 @@ class optional_base : public optional_tag #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x581)) void destroy_impl ( is_not_reference_tag ) { get_ptr_impl()->internal_type::~internal_type() ; m_initialized = false ; } #else - void destroy_impl ( is_not_reference_tag ) { get_ptr_impl()->T::~T() ; m_initialized = false ; } + void destroy_impl ( is_not_reference_tag ) { get_ptr_impl()->~T() ; m_initialized = false ; } #endif void destroy_impl ( is_reference_tag ) { m_initialized = false ; } diff --git a/test/optional_test.cpp b/test/optional_test.cpp index e2e0dd5..29a1229 100644 --- a/test/optional_test.cpp +++ b/test/optional_test.cpp @@ -840,11 +840,19 @@ void test_with_builtin_types() test_none( ARG(double) ) ; } +// MSVC < 11.0 doesn't destroy X when we call ptr->VBase::VBase. +// Make sure that we work around this bug. +struct VBase : virtual X +{ + VBase(int v) : X(v) {} +}; + void test_with_class_type() { TRACE( std::endl << BOOST_CURRENT_FUNCTION ); test_basics( ARG(X) ); + test_basics( ARG(VBase) ); test_conditional_ctor_and_get_valur_or( ARG(X) ); test_direct_value_manip( ARG(X) ); test_uninitialized_access( ARG(X) );