Merge branch 'develop'

This commit is contained in:
Andrzej Krzemienski
2018-11-08 18:49:34 +01:00
8 changed files with 83 additions and 7 deletions

View File

@@ -15,6 +15,7 @@
* Remove deprecation mark from `reset()` method (without arguments). * Remove deprecation mark from `reset()` method (without arguments).
* Fixed [@https://github.com/boostorg/optional/issues/59 issue #59]. * Fixed [@https://github.com/boostorg/optional/issues/59 issue #59].
* Fixed bug with initialization of certain wrapper types in clang with -std=c++03. See [@https://github.com/boostorg/optional/pull/64 pr #64].
[heading Boost Release 1.68] [heading Boost Release 1.68]

View File

@@ -39,6 +39,10 @@
Fixed <a href="https://github.com/boostorg/optional/issues/59" target="_top">issue Fixed <a href="https://github.com/boostorg/optional/issues/59" target="_top">issue
#59</a>. #59</a>.
</li> </li>
<li class="listitem">
Fixed bug with initialization of certain wrapper types in clang with -std=c++03.
See <a href="https://github.com/boostorg/optional/pull/64" target="_top">pr #64</a>.
</li>
</ul></div> </ul></div>
<h4> <h4>
<a name="boost_optional.relnotes.h1"></a> <a name="boost_optional.relnotes.h1"></a>

View File

@@ -145,7 +145,7 @@
</div> </div>
</div> </div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"><p><small>Last revised: October 29, 2018 at 21:06:01 GMT</small></p></td> <td align="left"><p><small>Last revised: November 08, 2018 at 17:44:53 GMT</small></p></td>
<td align="right"><div class="copyright-footer"></div></td> <td align="right"><div class="copyright-footer"></div></td>
</tr></table> </tr></table>
<hr> <hr>

View File

@@ -30,7 +30,7 @@ class tc_optional_base : public optional_tag
: :
m_initialized(false) {} m_initialized(false) {}
tc_optional_base ( argument_type val ) tc_optional_base ( init_value_tag, argument_type val )
: :
m_initialized(true), m_storage(val) {} m_initialized(true), m_storage(val) {}

View File

@@ -107,6 +107,8 @@ using optional_ns::in_place_init_if;
namespace optional_detail { namespace optional_detail {
struct init_value_tag {};
struct optional_tag {}; struct optional_tag {};
@@ -147,7 +149,7 @@ class optional_base : public optional_tag
// Creates an optional<T> initialized with 'val'. // Creates an optional<T> initialized with 'val'.
// Can throw if T::T(T const&) does // Can throw if T::T(T const&) does
optional_base ( argument_type val ) optional_base ( init_value_tag, argument_type val )
: :
m_initialized(false) m_initialized(false)
{ {
@@ -157,7 +159,7 @@ class optional_base : public optional_tag
#ifndef BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES #ifndef BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES
// move-construct an optional<T> initialized from an rvalue-ref to 'val'. // move-construct an optional<T> initialized from an rvalue-ref to 'val'.
// Can throw if T::T(T&&) does // Can throw if T::T(T&&) does
optional_base ( rval_reference_type val ) optional_base ( init_value_tag, rval_reference_type val )
: :
m_initialized(false) m_initialized(false)
{ {
@@ -870,12 +872,12 @@ class optional
// Creates an optional<T> initialized with 'val'. // Creates an optional<T> initialized with 'val'.
// Can throw if T::T(T const&) does // Can throw if T::T(T const&) does
optional ( argument_type val ) : base(val) {} optional ( argument_type val ) : base(optional_detail::init_value_tag(), val) {}
#ifndef BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES #ifndef BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES
// Creates an optional<T> initialized with 'move(val)'. // Creates an optional<T> initialized with 'move(val)'.
// Can throw if T::T(T &&) does // Can throw if T::T(T &&) does
optional ( rval_reference_type val ) : base( boost::forward<T>(val) ) optional ( rval_reference_type val ) : base(optional_detail::init_value_tag(), boost::forward<T>(val))
{} {}
#endif #endif

View File

@@ -76,6 +76,7 @@ import testing ;
[ run optional_test_static_properties.cpp ] [ run optional_test_static_properties.cpp ]
[ compile optional_test_maybe_uninitialized_warning.cpp ] [ compile optional_test_maybe_uninitialized_warning.cpp ]
[ compile optional_test_deleted_default_ctor.cpp ] [ compile optional_test_deleted_default_ctor.cpp ]
[ compile optional_test_constructible_from_other.cpp ]
#[ run optional_xconfig_HACK_TO_LIST_PREDEFINED_MACROS.cpp ] #[ run optional_xconfig_HACK_TO_LIST_PREDEFINED_MACROS.cpp ]
[ run optional_xconfig_NO_PROPER_ASSIGN_FROM_CONST_INT_pass.cpp ] [ run optional_xconfig_NO_PROPER_ASSIGN_FROM_CONST_INT_pass.cpp ]
[ run-fail optional_xconfig_NO_PROPER_ASSIGN_FROM_CONST_INT_fail.cpp ] [ run-fail optional_xconfig_NO_PROPER_ASSIGN_FROM_CONST_INT_fail.cpp ]

View File

@@ -0,0 +1,57 @@
// Copyright (c) 2018 Andrey Semashev
//
// Use, modification, and distribution is subject to the Boost Software
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// The test verifies that Boost.Optional copy constructors do not attempt to invoke
// the element type initializing constructors from templated arguments
#include <boost/optional/optional.hpp>
#include <boost/core/enable_if.hpp>
struct no_type
{
char data;
};
struct yes_type
{
char data[2];
};
template< unsigned int Size >
struct size_tag {};
template< typename T, typename U >
struct is_constructible
{
template< typename T1, typename U1 >
static yes_type check_helper(size_tag< sizeof(static_cast< T1 >(U1())) >*);
template< typename T1, typename U1 >
static no_type check_helper(...);
static const bool value = sizeof(check_helper< T, U >(0)) == sizeof(yes_type);
};
template< typename T >
class wrapper
{
public:
wrapper() {}
wrapper(wrapper const&) {}
template< typename U >
wrapper(U const&, typename boost::enable_if_c< is_constructible< T, U >::value, int >::type = 0) {}
};
inline boost::optional< wrapper< int > > foo()
{
return boost::optional< wrapper< int > >();
}
int main()
{
// Invokes boost::optional copy constructor. Should not invoke wrapper constructor from U.
boost::optional< wrapper< int > > res = foo();
return 0;
}

View File

@@ -58,10 +58,20 @@ struct W
void test_value_init() void test_value_init()
{ {
#ifndef BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
{ {
S s; S s;
W<S> w{s}; W<S> w{s};
} }
#endif
{
S s;
W<S> w(s);
}
}
void test_optoinal_reference_wrapper()
{
boost::optional<W<S&> > o; boost::optional<W<S&> > o;
BOOST_TEST(boost::none == o); BOOST_TEST(boost::none == o);
} }
@@ -70,6 +80,7 @@ int main()
{ {
test_tc_base(); test_tc_base();
test_value_init(); test_value_init();
test_optoinal_reference_wrapper();
return boost::report_errors(); return boost::report_errors();
} }