Compare commits

...

11 Commits

11 changed files with 475 additions and 63 deletions

View File

@ -1,4 +1,4 @@
# Copyright 2016, 2017, 2018 Peter Dimov
# Copyright 2016-2019 Peter Dimov
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
@ -6,6 +6,8 @@ language: cpp
sudo: false
dist: trusty
branches:
only:
- master
@ -24,11 +26,11 @@ matrix:
include:
- os: linux
compiler: g++
env: TOOLSET=gcc CXXSTD=03,11 VARIANT=debug,release
env: TOOLSET=gcc CXXSTD=11
- os: linux
compiler: g++-4.4
env: TOOLSET=gcc CXXSTD=98,0x
env: TOOLSET=gcc CXXSTD=0x
addons:
apt:
packages:
@ -38,7 +40,7 @@ matrix:
- os: linux
compiler: g++-4.6
env: TOOLSET=gcc CXXSTD=03,0x
env: TOOLSET=gcc CXXSTD=0x
addons:
apt:
packages:
@ -48,7 +50,7 @@ matrix:
- os: linux
compiler: g++-4.7
env: TOOLSET=gcc CXXSTD=03,11
env: TOOLSET=gcc CXXSTD=11
addons:
apt:
packages:
@ -58,7 +60,7 @@ matrix:
- os: linux
compiler: g++-4.8
env: TOOLSET=gcc CXXSTD=03,11
env: TOOLSET=gcc CXXSTD=11
addons:
apt:
packages:
@ -67,7 +69,7 @@ matrix:
- ubuntu-toolchain-r-test
- os: linux
compiler: g++-4.9
env: TOOLSET=gcc CXXSTD=03,11
env: TOOLSET=gcc CXXSTD=11
addons:
apt:
packages:
@ -77,7 +79,7 @@ matrix:
- os: linux
compiler: g++-5
env: TOOLSET=gcc CXXSTD=03,11,14,1z
env: TOOLSET=gcc CXXSTD=11,14,1z
addons:
apt:
packages:
@ -87,7 +89,7 @@ matrix:
- os: linux
compiler: g++-6
env: TOOLSET=gcc CXXSTD=03,11,14,1z
env: TOOLSET=gcc CXXSTD=11,14,1z
addons:
apt:
packages:
@ -97,7 +99,7 @@ matrix:
- os: linux
compiler: g++-7
env: TOOLSET=gcc CXXSTD=03,11,14,17 VARIANT=release
env: TOOLSET=gcc CXXSTD=11,14,17
addons:
apt:
packages:
@ -107,7 +109,7 @@ matrix:
- os: linux
compiler: g++-8
env: TOOLSET=gcc CXXSTD=03,11,14,17,2a
env: TOOLSET=gcc CXXSTD=11,14,17,2a
addons:
apt:
packages:
@ -115,9 +117,19 @@ matrix:
sources:
- ubuntu-toolchain-r-test
- os: linux
compiler: g++-9
env: TOOLSET=gcc CXXSTD=11,14,17,2a
addons:
apt:
packages:
- g++-9
sources:
- ubuntu-toolchain-r-test
- os: linux
compiler: g++-7
env: UBSAN=1 TOOLSET=gcc CXXSTD=03,11,14,17 UBSAN_OPTIONS=print_stacktrace=1 LINKFLAGS=-fuse-ld=gold
env: UBSAN=1 TOOLSET=gcc CXXSTD=11,14,17 UBSAN_OPTIONS=print_stacktrace=1 LINKFLAGS=-fuse-ld=gold
addons:
apt:
packages:
@ -127,11 +139,11 @@ matrix:
- os: linux
compiler: clang++
env: TOOLSET=clang CXXSTD=03,11 VARIANT=debug,release
env: TOOLSET=clang CXXSTD=11
- os: linux
compiler: /usr/bin/clang++
env: TOOLSET=clang CXXSTD=03,11
env: TOOLSET=clang CXXSTD=11
addons:
apt:
packages:
@ -139,7 +151,7 @@ matrix:
- os: linux
compiler: /usr/bin/clang++
env: TOOLSET=clang CXXSTD=03,11
env: TOOLSET=clang CXXSTD=11
addons:
apt:
packages:
@ -147,7 +159,7 @@ matrix:
- os: linux
compiler: clang++-3.5
env: TOOLSET=clang CXXSTD=03,11,14,1z
env: TOOLSET=clang CXXSTD=11,14,1z
addons:
apt:
packages:
@ -159,7 +171,7 @@ matrix:
- os: linux
compiler: clang++-3.6
env: TOOLSET=clang CXXSTD=03,11,14,1z
env: TOOLSET=clang CXXSTD=11,14,1z
addons:
apt:
packages:
@ -170,7 +182,7 @@ matrix:
- os: linux
compiler: clang++-3.7
env: TOOLSET=clang CXXSTD=03,11,14,1z
env: TOOLSET=clang CXXSTD=11,14,1z
addons:
apt:
packages:
@ -181,7 +193,7 @@ matrix:
- os: linux
compiler: clang++-3.8
env: TOOLSET=clang CXXSTD=03,11,14,1z
env: TOOLSET=clang CXXSTD=11,14,1z
addons:
apt:
packages:
@ -193,7 +205,7 @@ matrix:
- os: linux
compiler: clang++-3.9
env: TOOLSET=clang CXXSTD=03,11,14,1z
env: TOOLSET=clang CXXSTD=11,14,1z
addons:
apt:
packages:
@ -205,7 +217,7 @@ matrix:
- os: linux
compiler: clang++-4.0
env: TOOLSET=clang CXXSTD=03,11,14,1z
env: TOOLSET=clang CXXSTD=11,14,1z
addons:
apt:
packages:
@ -216,7 +228,7 @@ matrix:
- os: linux
compiler: clang++-5.0
env: TOOLSET=clang CXXSTD=03,11,14,1z VARIANT=release
env: TOOLSET=clang CXXSTD=11,14,1z
addons:
apt:
packages:
@ -227,7 +239,7 @@ matrix:
- os: linux
compiler: clang++-6.0
env: TOOLSET=clang CXXSTD=03,11,14,17,2a
env: TOOLSET=clang CXXSTD=11,14,17,2a
addons:
apt:
packages:
@ -238,7 +250,7 @@ matrix:
- os: linux
compiler: clang++-7
env: TOOLSET=clang CXXSTD=03,11,14,17,2a
env: TOOLSET=clang CXXSTD=11,14,17,2a
addons:
apt:
packages:
@ -248,19 +260,30 @@ matrix:
- llvm-toolchain-trusty-7
- os: linux
compiler: clang++-5.0
env: UBSAN=1 TOOLSET=clang CXXSTD=03,11,14,1z UBSAN_OPTIONS=print_stacktrace=1
compiler: clang++-8
env: TOOLSET=clang CXXSTD=11,14,17,2a
addons:
apt:
packages:
- clang-5.0
- clang-8
sources:
- ubuntu-toolchain-r-test
- llvm-toolchain-trusty-5.0
- llvm-toolchain-trusty-8
- os: linux
compiler: clang++-8
env: UBSAN=1 TOOLSET=clang CXXSTD=11,14,17,2a UBSAN_OPTIONS=print_stacktrace=1
addons:
apt:
packages:
- clang-8
sources:
- ubuntu-toolchain-r-test
- llvm-toolchain-trusty-8
- os: linux
compiler: clang++-libc++
env: TOOLSET=clang CXXSTD=03,11,14,1z VARIANT=release
env: TOOLSET=clang CXXSTD=11,14,1z
addons:
apt:
packages:
@ -268,7 +291,7 @@ matrix:
- os: linux
compiler: clang++-libc++
env: UBSAN=1 TOOLSET=clang CXXSTD=03,11,14,1z UBSAN_OPTIONS=print_stacktrace=1
env: UBSAN=1 TOOLSET=clang CXXSTD=11,14,1z UBSAN_OPTIONS=print_stacktrace=1
addons:
apt:
packages:
@ -276,7 +299,7 @@ matrix:
- os: osx
compiler: clang++
env: TOOLSET=clang CXXSTD=03,11,14,1z
env: TOOLSET=clang CXXSTD=11,14,1z
install:
- BOOST_BRANCH=develop && [ "$TRAVIS_BRANCH" == "master" ] && BOOST_BRANCH=master || true
@ -292,7 +315,7 @@ install:
script:
- |-
echo "using $TOOLSET : : $TRAVIS_COMPILER ;" > ~/user-config.jam
- ./b2 -j3 libs/function/test toolset=$TOOLSET cxxstd=$CXXSTD ${VARIANT:+variant=$VARIANT} ${UBSAN:+cxxflags=-fsanitize=undefined cxxflags=-fno-sanitize-recover=undefined linkflags=-fsanitize=undefined debug-symbols=on} ${LINKFLAGS:+linkflags=$LINKFLAGS}
- ./b2 -j3 libs/function/test toolset=$TOOLSET cxxstd=$CXXSTD variant=debug,release ${UBSAN:+cxxflags=-fsanitize=undefined cxxflags=-fno-sanitize-recover=undefined linkflags=-fsanitize=undefined debug-symbols=on} ${LINKFLAGS:+linkflags=$LINKFLAGS}
notifications:
email:

View File

@ -1,4 +1,4 @@
# Copyright 2016-2018 Peter Dimov
# Copyright 2016-2019 Peter Dimov
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
@ -14,31 +14,31 @@ branches:
environment:
matrix:
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
TOOLSET: msvc-9.0,msvc-10.0,msvc-11.0,msvc-12.0
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
TOOLSET: msvc-14.0
TOOLSET: msvc-9.0,msvc-10.0,msvc-11.0
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
TOOLSET: msvc-12.0,msvc-14.0
ADDRMD: 32,64
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
TOOLSET: msvc-14.1
CXXSTD: 14,17
ADDRMD: 32,64
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
ADDPATH: C:\cygwin\bin;
TOOLSET: gcc
CXXSTD: 03,11,14,1z
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
CXXSTD: 11,14,1z
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
ADDPATH: C:\cygwin64\bin;
TOOLSET: gcc
CXXSTD: 03,11,14,1z
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
CXXSTD: 11,14,1z
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
ADDPATH: C:\mingw\bin;
TOOLSET: gcc
CXXSTD: 03,11,14,1z
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
CXXSTD: 11,14,1z
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
ADDPATH: C:\mingw-w64\x86_64-6.3.0-posix-seh-rt_v5-rev1\mingw64\bin;
TOOLSET: gcc
CXXSTD: 03,11,14,1z
CXXSTD: 11,14,1z
install:
- set BOOST_BRANCH=develop

View File

@ -10,6 +10,364 @@
// William Kempf, Jesse Jones and Karl Nelson were all very helpful in the
// design of this library.
#include <boost/function/detail/config.hpp>
#if !BOOST_FUNCTION_ENABLE_CXX03
#ifndef BOOST_FUNCTION_HPP_INCLUDED
#define BOOST_FUNCTION_HPP_INCLUDED
#include <boost/ref.hpp>
#include <boost/function_equal.hpp>
#include <functional>
#include <type_traits>
namespace boost
{
#define BOOST_FUNCTION_TARGET_FIX(x)
using std::bad_function_call;
template<class S> class function: public std::function<S>
{
public:
function() = default;
function(function const&) = default;
function(function&&) = default;
using std::function<S>::function;
template<class T> function( boost::reference_wrapper<T> rt ): std::function<S>( std::ref( rt.get() ) )
{
}
function& operator=( function const& r ) = default;
function& operator=( function&& r ) = default;
template<class S2> function& operator=( function<S2> const& r )
{
std::function<S>::operator=( static_cast< std::function<S2> const& >( r ) );
return *this;
}
template<class S2> function& operator=( function<S2>&& r )
{
std::function<S>::operator=( static_cast< std::function<S2>&& >( r ) );
return *this;
}
template<class F, class E = typename std::enable_if< !std::is_integral<F>::value && !std::is_same<F, function>::value >::type > function& operator=( F f )
{
std::function<S>::operator=( std::move( f ) );
return *this;
}
function& operator=( std::nullptr_t f )
{
std::function<S>::operator=( f );
return *this;
}
template<class T> function& operator=( boost::reference_wrapper<T> rt )
{
std::function<S>::operator=( std::ref( rt.get() ) );
return *this;
}
bool empty() const noexcept
{
return ! *this;
}
void clear()
{
*this = nullptr;
}
template<class F, class A> void assign( F f, A )
{
this->operator=( std::move( f ) );
}
template<class F> F * target() noexcept
{
if( F * p = std::function<S>::template target<F>() )
{
return p;
}
if( std::reference_wrapper<F> * p = std::function<S>::template target< std::reference_wrapper<F> >() )
{
return std::addressof( p->get() );
}
return nullptr;
}
template<class F> F const * target() const noexcept
{
if( F const * p = std::function<S>::template target<F>() )
{
return p;
}
if( std::reference_wrapper<F> const * p = std::function<S>::template target< std::reference_wrapper<F> >() )
{
return std::addressof( p->get() );
}
return nullptr;
}
template<class F> bool contains( F const& f ) const noexcept
{
if( F const * fp = this->template target<F>() )
{
return function_equal( *fp, f );
}
else
{
return false;
}
}
};
template<class S, class F, class E = typename std::enable_if< !std::is_integral<F>::value && !std::is_same<F, std::nullptr_t>::value>::type> inline bool operator==( function<S> const & g, F f )
{
return g.contains( f );
}
template<class S, class F, class E = typename std::enable_if< !std::is_integral<F>::value && !std::is_same<F, std::nullptr_t>::value>::type> inline bool operator!=( function<S> const & g, F f )
{
return !g.contains( f );
}
template<class S, class F> inline bool operator==( function<S> const & g, boost::reference_wrapper<F> rf )
{
return g.template target<F>() == std::addressof( rf.get() );
}
template<class S, class F> inline bool operator!=( function<S> const & g, boost::reference_wrapper<F> rf )
{
return g.template target<F>() != std::addressof( rf.get() );
}
template<class S, class F, class E = typename std::enable_if< !std::is_integral<F>::value && !std::is_same<F, std::nullptr_t>::value>::type> inline bool operator==( F f, function<S> const & g )
{
return g.contains( f );
}
template<class S, class F, class E = typename std::enable_if< !std::is_integral<F>::value && !std::is_same<F, std::nullptr_t>::value>::type> inline bool operator!=( F f, function<S> const & g )
{
return !g.contains( f );
}
template<class S, class F> inline bool operator==( boost::reference_wrapper<F> rf, function<S> const & g )
{
return g.template target<F>() == std::addressof( rf.get() );
}
template<class S, class F> inline bool operator!=( boost::reference_wrapper<F> rf, function<S> const & g )
{
return g.template target<F>() != std::addressof( rf.get() );
}
namespace detail
{
template<class T1, class T2> struct is_similar
{
BOOST_STATIC_CONSTANT( bool, value = false );
};
template<template<class...> class L, class... T1, class... T2> struct is_similar< L<T1...>, L<T2...> >
{
BOOST_STATIC_CONSTANT( bool, value = true );
};
} // namespace detail
#define BOOST_FUNCTION_N_COMMON \
\
using base_type::base_type;\
\
template<class F, class E = typename std::enable_if< !std::is_integral<F>::value && !detail::is_similar<F, this_type>::value >::type > this_type& operator=( F f )\
{\
base_type::operator=( std::move( f ) );\
return *this;\
}\
\
this_type& operator=( std::nullptr_t f )\
{\
base_type::operator=( f );\
return *this;\
}\
\
template<class S2> this_type& operator=( boost::function<S2> const& r )\
{\
base_type::operator=( r );\
return *this;\
}\
\
template<class S2> this_type& operator=( boost::function<S2>&& r )\
{\
base_type::operator=( std::move( r ) );\
return *this;\
}
template<typename R> class function0: public function<R()>
{
private:
typedef function0 this_type;
typedef function<R()> base_type;
public:
BOOST_FUNCTION_N_COMMON
};
template<typename R, typename T1> class function1: public function<R(T1)>
{
private:
typedef function1 this_type;
typedef function<R(T1)> base_type;
public:
BOOST_FUNCTION_N_COMMON
};
template<typename R, typename T1, typename T2> class function2: public function<R(T1, T2)>
{
private:
typedef function2 this_type;
typedef function<R(T1, T2)> base_type;
public:
BOOST_FUNCTION_N_COMMON
};
template<typename R, typename T1, typename T2, typename T3> class function3: public function<R(T1, T2, T3)>
{
private:
typedef function3 this_type;
typedef function<R(T1, T2, T3)> base_type;
public:
BOOST_FUNCTION_N_COMMON
};
template<typename R, typename T1, typename T2, typename T3, typename T4> class function4: public function<R(T1, T2, T3, T4)>
{
private:
typedef function4 this_type;
typedef function<R(T1, T2, T3, T4)> base_type;
public:
BOOST_FUNCTION_N_COMMON
};
template<typename R, typename T1, typename T2, typename T3, typename T4, typename T5> class function5: public function<R(T1, T2, T3, T4, T5)>
{
private:
typedef function5 this_type;
typedef function<R(T1, T2, T3, T4, T5)> base_type;
public:
BOOST_FUNCTION_N_COMMON
};
template<typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> class function6: public function<R(T1, T2, T3, T4, T5, T6)>
{
private:
typedef function6 this_type;
typedef function<R(T1, T2, T3, T4, T5, T6)> base_type;
public:
BOOST_FUNCTION_N_COMMON
};
template<typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> class function7: public function<R(T1, T2, T3, T4, T5, T6, T7)>
{
private:
typedef function7 this_type;
typedef function<R(T1, T2, T3, T4, T5, T6, T7)> base_type;
public:
BOOST_FUNCTION_N_COMMON
};
template<typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> class function8: public function<R(T1, T2, T3, T4, T5, T6, T7, T8)>
{
private:
typedef function8 this_type;
typedef function<R(T1, T2, T3, T4, T5, T6, T7, T8)> base_type;
public:
BOOST_FUNCTION_N_COMMON
};
template<typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9> class function9: public function<R(T1, T2, T3, T4, T5, T6, T7, T8, T9)>
{
private:
typedef function9 this_type;
typedef function<R(T1, T2, T3, T4, T5, T6, T7, T8, T9)> base_type;
public:
BOOST_FUNCTION_N_COMMON
};
template<typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10> class function10: public function<R(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)>
{
private:
typedef function10 this_type;
typedef function<R(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)> base_type;
public:
BOOST_FUNCTION_N_COMMON
};
template<typename R, typename... A> class function30: public function<R(A...)>
{
private:
typedef function30 this_type;
typedef function<R(A...)> base_type;
public:
BOOST_FUNCTION_N_COMMON
};
} // namespace boost
#endif // #ifndef BOOST_FUNCTION_HPP_INCLUDED
#else
#ifndef BOOST_FUNCTION_MAX_ARGS
# define BOOST_FUNCTION_MAX_ARGS 10
#endif // BOOST_FUNCTION_MAX_ARGS
@ -72,3 +430,5 @@
#endif
#endif // !defined(BOOST_FUNCTION_MAX_ARGS_DEFINED) || (BOOST_FUNCTION_MAX_ARGS_DEFINED != BOOST_FUNCTION_MAX_ARGS)
#endif

View File

@ -0,0 +1,12 @@
// Copyright 2019 Peter Dimov
// 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
#ifndef BOOST_FUNCTION_DETAIL_CONFIG_HPP_INCLUDED
#define BOOST_FUNCTION_DETAIL_CONFIG_HPP_INCLUDED
#if !defined(BOOST_FUNCTION_ENABLE_CXX03)
# define BOOST_FUNCTION_ENABLE_CXX03 0
#endif
#endif // #ifndef BOOST_FUNCTION_DETAIL_CONFIG_HPP_INCLUDED

View File

@ -7,6 +7,10 @@
// For more information, see http://www.boost.org
#include <boost/function/detail/config.hpp>
#if BOOST_FUNCTION_ENABLE_CXX03
#if BOOST_FUNCTION_NUM_ARGS == 0
# undef BOOST_FUNCTION_MAX_ARGS_DEFINED
# define BOOST_FUNCTION_MAX_ARGS_DEFINED 0
@ -367,3 +371,5 @@
#else
# error Cannot handle Boost.Function objects that accept more than 50 arguments!
#endif
#endif

View File

@ -396,16 +396,12 @@ namespace boost {
functor_manager_operation_type op)
{
typedef typename get_function_tag<functor_type>::type tag_type;
switch (op) {
case get_functor_type_tag:
if (op == get_functor_type_tag) {
out_buffer.members.type.type = &boost::typeindex::type_id<functor_type>().type_info();
out_buffer.members.type.const_qualified = false;
out_buffer.members.type.volatile_qualified = false;
return;
default:
} else {
manager(in_buffer, out_buffer, op, tag_type());
return;
}
}
};
@ -510,16 +506,12 @@ namespace boost {
functor_manager_operation_type op)
{
typedef typename get_function_tag<functor_type>::type tag_type;
switch (op) {
case get_functor_type_tag:
if (op == get_functor_type_tag) {
out_buffer.members.type.type = &boost::typeindex::type_id<functor_type>().type_info();
out_buffer.members.type.const_qualified = false;
out_buffer.members.type.volatile_qualified = false;
return;
default:
} else {
manager(in_buffer, out_buffer, op, tag_type());
return;
}
}
};

View File

@ -9,6 +9,7 @@
#ifndef BOOST_FUNCTION_FWD_HPP
#define BOOST_FUNCTION_FWD_HPP
#include <boost/config.hpp>
#include <boost/function/detail/config.hpp>
#if defined(__sgi) && defined(_COMPILER_VERSION) && _COMPILER_VERSION <= 730 && !defined(BOOST_STRICT_CONFIG)
// Work around a compiler bug.
@ -24,9 +25,22 @@ namespace boost { namespace python { namespace objects {
# define BOOST_FUNCTION_NO_FUNCTION_TYPE_SYNTAX
#endif
#if !BOOST_FUNCTION_ENABLE_CXX03
# include <functional>
#endif
namespace boost {
#if BOOST_FUNCTION_ENABLE_CXX03
class bad_function_call;
#else
using std::bad_function_call;
#endif
#if !defined(BOOST_FUNCTION_NO_FUNCTION_TYPE_SYNTAX)
// Preferred syntax
template<typename Signature> class function;

View File

@ -47,8 +47,8 @@ lib mixed_cxxstd : mixed_cxxstd.cpp : <link>shared:<define>MIXED_CXXSTD_DYN_LINK
run test_mixed_cxxstd.cpp mixed_cxxstd : : : <link>shared : mixed_cxxstd_shared ;
run test_mixed_cxxstd.cpp mixed_cxxstd : : : <link>static : mixed_cxxstd_static ;
run test_mixed_cxxstd.cpp mixed_cxxstd/<cxxstd>98 : : : <link>shared : mixed_cxxstd_shared_98 ;
run test_mixed_cxxstd.cpp mixed_cxxstd/<cxxstd>98 : : : <link>static : mixed_cxxstd_static_98 ;
#run test_mixed_cxxstd.cpp mixed_cxxstd/<cxxstd>98 : : : <link>shared : mixed_cxxstd_shared_98 ;
#run test_mixed_cxxstd.cpp mixed_cxxstd/<cxxstd>98 : : : <link>static : mixed_cxxstd_static_98 ;
run test_mixed_cxxstd.cpp mixed_cxxstd/<cxxstd>0x : : : <link>shared : mixed_cxxstd_shared_0x ;
run test_mixed_cxxstd.cpp mixed_cxxstd/<cxxstd>0x : : : <link>static : mixed_cxxstd_static_0x ;
@ -63,8 +63,8 @@ lib return_function : return_function.cpp : <link>shared:<define>RETURN_FUNCTION
run test_return_function.cpp return_function : : : <link>shared : return_function_shared ;
run test_return_function.cpp return_function : : : <link>static : return_function_static ;
run test_return_function.cpp return_function/<cxxstd>98 : : : <link>shared : return_function_shared_98 ;
run test_return_function.cpp return_function/<cxxstd>98 : : : <link>static : return_function_static_98 ;
#run test_return_function.cpp return_function/<cxxstd>98 : : : <link>shared : return_function_shared_98 ;
#run test_return_function.cpp return_function/<cxxstd>98 : : : <link>static : return_function_static_98 ;
run test_return_function.cpp return_function/<cxxstd>0x : : : <link>shared : return_function_shared_0x ;
run test_return_function.cpp return_function/<cxxstd>0x : : : <link>static : return_function_static_0x ;

View File

@ -79,8 +79,10 @@ int main()
function2<int, int, int> f;
f.assign( plus_int<disable_small_object_optimization>(), counting_allocator<int>() );
f.clear();
#if BOOST_FUNCTION_ENABLE_CXX03
BOOST_TEST_EQ( alloc_count, 1 );
BOOST_TEST_EQ( dealloc_count, 1 );
#endif
alloc_count = 0;
dealloc_count = 0;
f.assign( plus_int<enable_small_object_optimization>(), counting_allocator<int>() );
@ -106,8 +108,10 @@ int main()
dealloc_count = 0;
fv.assign( DoNothing<disable_small_object_optimization>(), counting_allocator<int>() );
fv.clear();
#if BOOST_FUNCTION_ENABLE_CXX03
BOOST_TEST_EQ( alloc_count, 1 );
BOOST_TEST_EQ( dealloc_count, 1 );
#endif
alloc_count = 0;
dealloc_count = 0;
fv.assign( DoNothing<enable_small_object_optimization>(), counting_allocator<int>() );

View File

@ -96,7 +96,7 @@ static void target_test()
BOOST_CHECK(!f.target<int (*)()>());
BOOST_CHECK(f.target<const Seventeen>());
BOOST_CHECK(f.target<const Seventeen>() == &const_seventeen);
BOOST_CHECK(f.target<const volatile Seventeen>());
// BOOST_CHECK(f.target<const volatile Seventeen>());
BOOST_CHECK(!f.target<Seventeen>());
BOOST_CHECK(!f.target<volatile Seventeen>());
}

View File

@ -9,6 +9,7 @@
#include <boost/function.hpp>
#include <boost/core/lightweight_test.hpp>
#include <boost/config/workaround.hpp>
#include <functional>
#include <string>
#include <utility>
@ -653,14 +654,14 @@ static void test_empty_ref()
f2();
BOOST_ERROR("Exception didn't throw for reference to empty function.");
}
catch(std::runtime_error const&) {}
catch(boost::bad_function_call const&) {}
f1 = dummy;
try {
f2();
}
catch(std::runtime_error const&) {
catch(boost::bad_function_call const&) {
BOOST_ERROR("Error calling referenced function.");
}
}