diff --git a/.travis.yml b/.travis.yml index 838e8ed..0b78cb4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,175 +1,301 @@ -# Copyright 2016 Peter Dimov -# Copyright 2017, 2018 James E. King III +# Copyright 2016, 2017, 2018 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) -# -# Generic Travis CI build script for boostorg repositories -# See: https://github.com/jeking3/boost-ci -# -# Instructions for customizing this script for your library: -# -# 1. Customize the compilers and language levels you want in the 'jobs'. -# 2. If you have more than include/, src/, test/, example/, examples/, or -# tools/ directories, modify your Travis CI project and add the environment -# variable DEPINST. For example if your build uses code in "bench/" and -# "fog/" directories, then set DEPINST to the following: -# --include bench --include fog -# 3. If you want to enable Coverity Scan, you need to provide the environment -# variables COVERITY_SCAN_TOKEN and COVERITY_SCAN_NOTIFICATION_EMAIL in -# your github settings. -# 4. Enable pull request builds in your boostorg/ account. -# -# That's it - the scripts will do everything else for you. - -sudo: false -dist: trusty language: cpp -env: - global: - # see: http://www.boost.org/build/doc/html/bbv2/overview/invocation.html#bbv2.overview.invocation.properties - # to use the default for a given environment, comment it out; recommend you build debug and release however.. - # - B2_ADDRESS_MODEL=address-model=64,32 - # - B2_LINK=link=shared,static - # - B2_THREADING=threading=multi,single - - B2_VARIANT=variant=release,debug +sudo: false -install: - - git clone https://github.com/jeking3/boost-ci.git boost-ci - - cp -pr boost-ci/ci boost-ci/.codecov.yml . - - source ci/travis/install.sh - -addons: - apt: - packages: - - binutils-gold - - gdb - - libc6-dbg - branches: only: - - develop - master - -script: - - cd $BOOST_ROOT/libs/$SELF - - ci/travis/build.sh + - develop + - /feature\/.*/ -# -# Default toolsets in Ubuntu -# -# trusty xenial bionic -# 14.04 16.04 18.04 -# ------ ------ ------ -# clang 3.4 3.8 6.0 -# gcc 4.8.2 5.3.1 7.3.0 -# +env: + matrix: + - BOGUS_JOB=true -anchors: - clang-34: &clang-34 { apt: { packages: [ "clang-3.4" ], sources: [ "llvm-toolchain-trusty-3.4" ] } } - clang-38: &clang-38 { apt: { packages: [ "clang-3.8", - "libstdc++-6-dev" ], sources: [ "llvm-toolchain-trusty-3.8", - "ubuntu-toolchain-r-test" ] } } - clang-4: &clang-4 { apt: { packages: [ "clang-4.0", - "libstdc++-6-dev" ], sources: [ "llvm-toolchain-trusty-4.0", - "ubuntu-toolchain-r-test" ] } } - clang-5: &clang-5 { apt: { packages: [ "clang-5.0", - "libstdc++-7-dev" ], sources: [ "llvm-toolchain-trusty-5.0", - "ubuntu-toolchain-r-test" ] } } - clang-6: &clang-6 { apt: { packages: [ "clang-6.0", - "libc++-dev", - "libstdc++-8-dev", - "valgrind" ], sources: [ "llvm-toolchain-trusty-6.0", - "ubuntu-toolchain-r-test" ] } } - gcc-44: &gcc-44 { apt: { packages: [ "g++-4.4" ], sources: [ "ubuntu-toolchain-r-test" ] } } - gcc-46: &gcc-46 { apt: { packages: [ "g++-4.6" ], sources: [ "ubuntu-toolchain-r-test" ] } } - gcc-48: &gcc-48 { apt: { packages: [ "g++-4.8" ], sources: [ "ubuntu-toolchain-r-test" ] } } - gcc-5: &gcc-5 { apt: { packages: [ "g++-5" ], sources: [ "ubuntu-toolchain-r-test" ] } } - gcc-6: &gcc-6 { apt: { packages: [ "g++-6" ], sources: [ "ubuntu-toolchain-r-test" ] } } - gcc-7: &gcc-7 { apt: { packages: [ "g++-7" ], sources: [ "ubuntu-toolchain-r-test" ] } } - gcc-8: &gcc-8 { apt: { packages: [ "g++-8" ], sources: [ "ubuntu-toolchain-r-test" ] } } +matrix: -jobs: - allow_failures: - - env: - - COPY="all the environment settings from your job" + exclude: + - env: BOGUS_JOB=true include: - # libstdc++ - - { os: "linux", env: [ "TOOLSET=gcc-4.4", "CXXSTD=98,0x" ], addons: *gcc-44 } - - { os: "linux", env: [ "TOOLSET=gcc-4.6", "CXXSTD=03,0x" ], addons: *gcc-46 } - - { os: "linux", env: [ "TOOLSET=gcc-4.8", "CXXSTD=03,11" ], addons: *gcc-48 } - - { os: "linux", env: [ "TOOLSET=gcc-5", "CXXSTD=03,11" ], addons: *gcc-5 } - - { os: "linux", env: [ "TOOLSET=gcc-6", "CXXSTD=03,11,14" ], addons: *gcc-6 } - - { os: "linux", env: [ "TOOLSET=gcc-7", "CXXSTD=03,11,14,17" ], addons: *gcc-7 } - - { os: "linux", env: [ "TOOLSET=gcc-8", "CXXSTD=03,11,14,17,2a" ], addons: *gcc-8 } - - { os: "linux", env: [ "TOOLSET=clang-3.4", "CXXSTD=03,11" ], addons: *clang-34 } - - { os: "linux", env: [ "TOOLSET=clang-3.8", "CXXSTD=03,11,14" ], addons: *clang-38 } - - { os: "linux", env: [ "TOOLSET=clang-4.0", "CXXSTD=03,11,14" ], addons: *clang-4 } - - { os: "linux", env: [ "TOOLSET=clang-5.0", "CXXSTD=03,11,14,17" ], addons: *clang-5 } - - { os: "linux", env: [ "TOOLSET=clang-6.0", "CXXSTD=03,11,14,17,2a" ], addons: *clang-6 } - # libc++ - - { os: "linux", env: [ "TOOLSET=clang-6.0", "CXXSTD=03,11,14,17,2a", - "CXXFLAGS=-stdlib=libc++" ], addons: *clang-6 } - # the rvm environment on osx is taking over basic commands like "cd" and breaking things! - # - { os: "osx" , env: [ "COMMENT=libc++", - # "TOOLSET=clang", "CXXSTD=03,11,14" ] } + - os: linux + compiler: g++ + env: TOOLSET=gcc CXXSTD=03,11 VARIANT=debug,release - os: linux - env: - - COMMENT=codecov.io - - TOOLSET=gcc-7 - - DEFINES="define=BOOST_NO_STRESS_TEST=1" - addons: *gcc-7 - script: - - pushd /tmp && git clone https://github.com/linux-test-project/lcov.git && export PATH=/tmp/lcov/bin:$PATH && which lcov && lcov --version && popd - - cd $BOOST_ROOT/libs/$SELF - - ci/travis/codecov.sh + compiler: g++-4.4 + env: TOOLSET=gcc CXXSTD=98,0x + addons: + apt: + packages: + - g++-4.4 + sources: + - ubuntu-toolchain-r-test - os: linux - env: - - COMMENT=cppcheck - script: - - cd $BOOST_ROOT/libs/$SELF - - ci/travis/cppcheck.sh + compiler: g++-4.6 + env: TOOLSET=gcc CXXSTD=03,0x + addons: + apt: + packages: + - g++-4.6 + sources: + - ubuntu-toolchain-r-test - os: linux - env: - - COMMENT=ubsan - - B2_VARIANT=variant=debug - - TOOLSET=gcc-8 - - CXXSTD=03,11,14,17,2a - - DEFINES="define=BOOST_NO_STRESS_TEST=1" - - CXXFLAGS="cxxflags=-fno-omit-frame-pointer cxxflags=-fsanitize=undefined cxxflags=-fno-sanitize-recover=undefined" - - LINKFLAGS="linkflags=-fsanitize=undefined linkflags=-fno-sanitize-recover=undefined linkflags=-fuse-ld=gold" - - UBSAN_OPTIONS=print_stacktrace=1 - addons: *gcc-8 + compiler: g++-4.7 + env: TOOLSET=gcc CXXSTD=03,11 + addons: + apt: + packages: + - g++-4.7 + sources: + - ubuntu-toolchain-r-test - os: linux - env: - - COMMENT=valgrind - - TOOLSET=clang-6.0 - - CXXSTD=03,11,14,17,2a - - DEFINES="define=BOOST_NO_STRESS_TEST=1" - - B2_VARIANT=variant=debug - - TESTFLAGS=testing.launcher=valgrind - - VALGRIND_OPTS=--error-exitcode=1 - addons: *clang-6 - - #################### Jobs to run on pushes to master, develop ################### - - # Coverity Scan + compiler: g++-4.8 + env: TOOLSET=gcc CXXSTD=03,11 + addons: + apt: + packages: + - g++-4.8 + sources: + - ubuntu-toolchain-r-test - os: linux - if: (env(COVERITY_SCAN_NOTIFICATION_EMAIL) IS present) AND (branch IN (develop, master)) AND (type IN (cron, push)) - env: - - COMMENT="Coverity Scan" - - TOOLSET=gcc-7 - addons: *gcc-7 - script: - - cd $BOOST_ROOT/libs/$SELF - - ci/travis/coverity.sh + compiler: g++-4.9 + env: TOOLSET=gcc CXXSTD=03,11 + addons: + apt: + packages: + - g++-4.9 + sources: + - ubuntu-toolchain-r-test + + - os: linux + compiler: g++-5 + env: TOOLSET=gcc CXXSTD=03,11,14,1z + addons: + apt: + packages: + - g++-5 + sources: + - ubuntu-toolchain-r-test + + - os: linux + compiler: g++-6 + env: TOOLSET=gcc CXXSTD=03,11,14,1z + addons: + apt: + packages: + - g++-6 + sources: + - ubuntu-toolchain-r-test + + - os: linux + compiler: g++-7 + env: TOOLSET=gcc CXXSTD=03,11,14,17 VARIANT=release + addons: + apt: + packages: + - g++-7 + sources: + - ubuntu-toolchain-r-test + + - os: linux + compiler: g++-8 + env: TOOLSET=gcc CXXSTD=03,11,14,17,2a + addons: + apt: + packages: + - g++-8 + 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 + addons: + apt: + packages: + - g++-7 + sources: + - ubuntu-toolchain-r-test + + - os: linux + compiler: clang++ + env: TOOLSET=clang CXXSTD=03,11 VARIANT=debug,release + + - os: linux + compiler: /usr/bin/clang++ + env: TOOLSET=clang CXXSTD=03,11 + addons: + apt: + packages: + - clang-3.3 + + - os: linux + compiler: /usr/bin/clang++ + env: TOOLSET=clang CXXSTD=03,11 + addons: + apt: + packages: + - clang-3.4 + + - os: linux + compiler: clang++-3.5 + env: TOOLSET=clang CXXSTD=03,11,14,1z + addons: + apt: + packages: + - clang-3.5 + - libstdc++-4.9-dev + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-precise-3.5 + + - os: linux + compiler: clang++-3.6 + env: TOOLSET=clang CXXSTD=03,11,14,1z + addons: + apt: + packages: + - clang-3.6 + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-precise-3.6 + + - os: linux + compiler: clang++-3.7 + env: TOOLSET=clang CXXSTD=03,11,14,1z + addons: + apt: + packages: + - clang-3.7 + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-precise-3.7 + + - os: linux + compiler: clang++-3.8 + env: TOOLSET=clang CXXSTD=03,11,14,1z + addons: + apt: + packages: + - clang-3.8 + - libstdc++-4.9-dev + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-precise-3.8 + + - os: linux + compiler: clang++-3.9 + env: TOOLSET=clang CXXSTD=03,11,14,1z + addons: + apt: + packages: + - clang-3.9 + - libstdc++-4.9-dev + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-precise-3.9 + + - os: linux + compiler: clang++-4.0 + env: TOOLSET=clang CXXSTD=03,11,14,1z + addons: + apt: + packages: + - clang-4.0 + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-trusty-4.0 + + - os: linux + compiler: clang++-5.0 + env: TOOLSET=clang CXXSTD=03,11,14,1z VARIANT=release + addons: + apt: + packages: + - clang-5.0 + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-trusty-5.0 + + - os: linux + compiler: clang++-6.0 + env: TOOLSET=clang CXXSTD=03,11,14,17,2a + addons: + apt: + packages: + - clang-6.0 + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-trusty-6.0 + + - os: linux + compiler: clang++-7 + env: TOOLSET=clang CXXSTD=03,11,14,17,2a + addons: + apt: + packages: + - clang-7 + sources: + - ubuntu-toolchain-r-test + - 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 + addons: + apt: + packages: + - clang-5.0 + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-trusty-5.0 + + - os: linux + compiler: clang++-libc++ + env: TOOLSET=clang CXXSTD=03,11,14,1z VARIANT=release + addons: + apt: + packages: + - libc++-dev + + - os: linux + compiler: clang++-libc++ + env: UBSAN=1 TOOLSET=clang CXXSTD=03,11,14,1z UBSAN_OPTIONS=print_stacktrace=1 + addons: + apt: + packages: + - libc++-dev + + - os: osx + compiler: clang++ + env: TOOLSET=clang CXXSTD=03,11,14,1z + +install: + - BOOST_BRANCH=develop && [ "$TRAVIS_BRANCH" == "master" ] && BOOST_BRANCH=master || true + - cd .. + - git clone -b $BOOST_BRANCH https://github.com/boostorg/boost.git boost-root + - cd boost-root + - git submodule update --init tools/build + - git submodule update --init libs/config + - git submodule update --init tools/boostdep + - cp -r $TRAVIS_BUILD_DIR/* libs/function + - python tools/boostdep/depinst/depinst.py function + - ./bootstrap.sh + - ./b2 headers + +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} notifications: email: - false + on_success: always diff --git a/include/boost/function.hpp b/include/boost/function.hpp index cd1382e..ef907e0 100644 --- a/include/boost/function.hpp +++ b/include/boost/function.hpp @@ -29,11 +29,8 @@ // in anything that may be included by function_template.hpp doesn't break #include -#ifndef BOOST_FUNCTION_NO_VARIADIC -# include -# undef BOOST_FUNCTION_NUM_ARGS // Older Visual Age C++ version do not handle the file iteration well -#elif BOOST_WORKAROUND(__IBMCPP__, >= 500) && BOOST_WORKAROUND(__IBMCPP__, < 800) +#if BOOST_WORKAROUND(__IBMCPP__, >= 500) && BOOST_WORKAROUND(__IBMCPP__, < 800) # if BOOST_FUNCTION_MAX_ARGS >= 0 # include # endif diff --git a/include/boost/function/detail/maybe_include.hpp b/include/boost/function/detail/maybe_include.hpp index df7eb7a..ec88905 100644 --- a/include/boost/function/detail/maybe_include.hpp +++ b/include/boost/function/detail/maybe_include.hpp @@ -7,18 +7,7 @@ // For more information, see http://www.boost.org -#include // for BOOST_FUNCTION_NO_VARIADIC - -#ifndef BOOST_FUNCTION_NO_VARIADIC -# undef BOOST_FUNCTION_NUM_ARGS -# define BOOST_FUNCTION_NUM_ARGS 50 -# undef BOOST_FUNCTION_MAX_ARGS_DEFINED -# define BOOST_FUNCTION_MAX_ARGS_DEFINED 50 -# ifndef BOOST_FUNCTION_VARIADIC_INCLUDED -# define BOOST_FUNCTION_VARIADIC_INCLUDED -# include -# endif -#elif BOOST_FUNCTION_NUM_ARGS == 0 +#if BOOST_FUNCTION_NUM_ARGS == 0 # undef BOOST_FUNCTION_MAX_ARGS_DEFINED # define BOOST_FUNCTION_MAX_ARGS_DEFINED 0 # ifndef BOOST_FUNCTION_0 diff --git a/include/boost/function/function_base.hpp b/include/boost/function/function_base.hpp index d4c9c27..4db31c4 100644 --- a/include/boost/function/function_base.hpp +++ b/include/boost/function/function_base.hpp @@ -101,7 +101,7 @@ namespace boost { } obj_ref; }; - union function_buffer + union BOOST_SYMBOL_VISIBLE function_buffer { // Type-specific union members mutable function_buffer_members members; diff --git a/include/boost/function/function_fwd.hpp b/include/boost/function/function_fwd.hpp index b31ec14..e79b504 100644 --- a/include/boost/function/function_fwd.hpp +++ b/include/boost/function/function_fwd.hpp @@ -24,12 +24,6 @@ namespace boost { namespace python { namespace objects { # define BOOST_FUNCTION_NO_FUNCTION_TYPE_SYNTAX #endif -#if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_NO_CXX11_TEMPLATE_ALIASES) -# define BOOST_FUNCTION_NO_VARIADIC -#else -# include // for functionN aliases generation below -#endif - namespace boost { class bad_function_call; @@ -44,15 +38,6 @@ namespace boost { } #endif // have partial specialization -#ifndef BOOST_FUNCTION_NO_VARIADIC - template class function_n; -# define BOOST_FUNCTION_N_ALIASES(z, N, d) \ - template \ - using function##N = function_n; - - BOOST_PP_REPEAT(51, BOOST_FUNCTION_N_ALIASES, ~) -# undef BOOST_FUNCTION_N_ALIASES -#else // Portable syntax template class function0; template class function1; @@ -79,7 +64,6 @@ namespace boost { typename T5, typename T6, typename T7, typename T8, typename T9, typename T10> class function10; -#endif } #endif diff --git a/include/boost/function/function_template.hpp b/include/boost/function/function_template.hpp index e90d393..56f6bb4 100644 --- a/include/boost/function/function_template.hpp +++ b/include/boost/function/function_template.hpp @@ -18,39 +18,6 @@ # pragma warning( disable : 4127 ) // "conditional expression is constant" #endif -#ifndef BOOST_FUNCTION_NO_VARIADIC - -#define BOOST_FUNCTION_TEMPLATE_PARMS typename... T -#define BOOST_FUNCTION_TEMPLATE_ARGS T... -#define BOOST_FUNCTION_PARMS T... a -#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES -# define BOOST_FUNCTION_ARGS a... -#else -# define BOOST_FUNCTION_ARGS static_cast(a)... -#endif - -// Always have commas (zero args case is handled with variadics too) -#define BOOST_FUNCTION_COMMA , - -// Class names used in this version of the code -#define BOOST_FUNCTION_FUNCTION function_n -#define BOOST_FUNCTION_FUNCTION_INVOKER function_invoker -#define BOOST_FUNCTION_VOID_FUNCTION_INVOKER void_function_invoker -#define BOOST_FUNCTION_FUNCTION_OBJ_INVOKER function_obj_invoker -#define BOOST_FUNCTION_VOID_FUNCTION_OBJ_INVOKER void_function_obj_invoker -#define BOOST_FUNCTION_FUNCTION_REF_INVOKER function_ref_invoker -#define BOOST_FUNCTION_VOID_FUNCTION_REF_INVOKER void_function_ref_invoker -#define BOOST_FUNCTION_MEMBER_INVOKER function_mem_invoker -#define BOOST_FUNCTION_VOID_MEMBER_INVOKER function_void_mem_invoker -#define BOOST_FUNCTION_GET_FUNCTION_INVOKER get_function_invoker -#define BOOST_FUNCTION_GET_FUNCTION_OBJ_INVOKER get_function_obj_invoker -#define BOOST_FUNCTION_GET_FUNCTION_REF_INVOKER get_function_ref_invoker -#define BOOST_FUNCTION_GET_MEMBER_INVOKER get_member_invoker -#define BOOST_FUNCTION_GET_INVOKER get_invoker -#define BOOST_FUNCTION_VTABLE basic_vtable - -#else // BOOST_FUNCTION_NO_VARIADIC - #define BOOST_FUNCTION_TEMPLATE_PARMS BOOST_PP_ENUM_PARAMS(BOOST_FUNCTION_NUM_ARGS, typename T) #define BOOST_FUNCTION_TEMPLATE_ARGS BOOST_PP_ENUM_PARAMS(BOOST_FUNCTION_NUM_ARGS, T) @@ -108,8 +75,6 @@ BOOST_JOIN(get_invoker,BOOST_FUNCTION_NUM_ARGS) #define BOOST_FUNCTION_VTABLE BOOST_JOIN(basic_vtable,BOOST_FUNCTION_NUM_ARGS) -#endif // BOOST_FUNCTION_NO_VARIADIC - #ifndef BOOST_NO_VOID_RETURNS # define BOOST_FUNCTION_VOID_RETURN_TYPE void # define BOOST_FUNCTION_RETURN(X) X @@ -687,26 +652,6 @@ namespace boost { vtable_base base; invoker_type invoker; }; - -#ifndef BOOST_FUNCTION_NO_VARIADIC - template - struct variadic_function_base - {}; - - template - struct variadic_function_base - { - typedef T argument_type; - }; - - template - struct variadic_function_base - { - typedef T0 first_argument_type; - typedef T1 second_argument_type; - }; -#endif - } // end namespace function } // end namespace detail @@ -715,9 +660,6 @@ namespace boost { BOOST_FUNCTION_TEMPLATE_PARMS > class BOOST_FUNCTION_FUNCTION : public function_base -#ifndef BOOST_FUNCTION_NO_VARIADIC - , public detail::function::variadic_function_base -#endif { public: #ifndef BOOST_NO_VOID_RETURNS @@ -740,6 +682,8 @@ namespace boost { struct clear_type {}; public: + BOOST_STATIC_CONSTANT(int, args = BOOST_FUNCTION_NUM_ARGS); + // add signature for boost::lambda template struct sig @@ -747,13 +691,6 @@ namespace boost { typedef result_type type; }; -#ifndef BOOST_FUNCTION_NO_VARIADIC - - static int const args = sizeof...(T); - static int const arity = sizeof...(T); - -#else - #if BOOST_FUNCTION_NUM_ARGS == 1 typedef T0 argument_type; #elif BOOST_FUNCTION_NUM_ARGS == 2 @@ -761,12 +698,9 @@ namespace boost { typedef T1 second_argument_type; #endif - BOOST_STATIC_CONSTANT(int, args = BOOST_FUNCTION_NUM_ARGS); BOOST_STATIC_CONSTANT(int, arity = BOOST_FUNCTION_NUM_ARGS); BOOST_FUNCTION_ARG_TYPES -#endif - typedef BOOST_FUNCTION_FUNCTION self_type; BOOST_DEFAULTED_FUNCTION(BOOST_FUNCTION_FUNCTION(), : function_base() {}) diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 7f5d297..6bd1d69 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -11,7 +11,7 @@ import testing ; run function_test.cpp ; # /usr/include/c++/4.4/bits/shared_ptr.h:146: error: cannot use typeid with -fno-rtti -run function_test.cpp : : : off gcc-4.4,0x:no : function_test_no_rtti ; +run function_test.cpp : : : off gcc-4.4.7,0x:no : function_test_no_rtti ; run function_n_test.cpp ; run allocator_test.cpp ; run stateless_test.cpp ; @@ -41,3 +41,19 @@ lib throw_bad_function_call : throw_bad_function_call.cpp : shared:shared : test_bad_function_call_shared ; run test_bad_function_call.cpp throw_bad_function_call : : : static : test_bad_function_call_static ; + +lib mixed_cxxstd : mixed_cxxstd.cpp : shared:MIXED_CXXSTD_DYN_LINK=1 ; + +run test_mixed_cxxstd.cpp mixed_cxxstd : : : shared : mixed_cxxstd_shared ; +run test_mixed_cxxstd.cpp mixed_cxxstd : : : static : mixed_cxxstd_static ; + +run test_mixed_cxxstd.cpp mixed_cxxstd/98 : : : shared : mixed_cxxstd_shared_98 ; +run test_mixed_cxxstd.cpp mixed_cxxstd/98 : : : static : mixed_cxxstd_static_98 ; + +run test_mixed_cxxstd.cpp mixed_cxxstd/0x : : : shared : mixed_cxxstd_shared_0x ; +run test_mixed_cxxstd.cpp mixed_cxxstd/0x : : : static : mixed_cxxstd_static_0x ; + +local check14 = [ check-target-builds mixed_cxxstd/14 : : no ] ; + +run test_mixed_cxxstd.cpp mixed_cxxstd/14 : : : shared $(check14) : mixed_cxxstd_shared_14 ; +run test_mixed_cxxstd.cpp mixed_cxxstd/14 : : : static $(check14) : mixed_cxxstd_static_14 ; diff --git a/test/mixed_cxxstd.cpp b/test/mixed_cxxstd.cpp new file mode 100644 index 0000000..417037a --- /dev/null +++ b/test/mixed_cxxstd.cpp @@ -0,0 +1,42 @@ + +// Copyright 2018 Peter Dimov. +// Distributed under the Boost Software License, Version 1.0. + +#include +#include + +#if defined(MIXED_CXXSTD_DYN_LINK) +# define EXPORT BOOST_SYMBOL_EXPORT +#else +# define EXPORT +#endif + +EXPORT void call_fn_1( boost::function const & fn ) +{ + fn(); +} + +EXPORT void call_fn_2( boost::function const & fn ) +{ + fn( 1 ); +} + +EXPORT void call_fn_3( boost::function const & fn ) +{ + fn( 1, 2 ); +} + +EXPORT void call_fn_4( boost::function0 const & fn ) +{ + fn(); +} + +EXPORT void call_fn_5( boost::function1 const & fn ) +{ + fn( 1 ); +} + +EXPORT void call_fn_6( boost::function2 const & fn ) +{ + fn( 1, 2 ); +} diff --git a/test/test_mixed_cxxstd.cpp b/test/test_mixed_cxxstd.cpp new file mode 100644 index 0000000..6622ab3 --- /dev/null +++ b/test/test_mixed_cxxstd.cpp @@ -0,0 +1,48 @@ + +// Copyright 2018 Peter Dimov. +// Distributed under the Boost Software License, Version 1.0. + +#include +#include + +// + +void call_fn_1( boost::function const & fn ); +void call_fn_2( boost::function const & fn ); +void call_fn_3( boost::function const & fn ); + +void call_fn_4( boost::function0 const & fn ); +void call_fn_5( boost::function1 const & fn ); +void call_fn_6( boost::function2 const & fn ); + +// + +static int v; + +void f0() +{ + v = -1; +} + +void f1( int x ) +{ + v = x; +} + +void f2( int x, int y ) +{ + v = x + y; +} + +int main() +{ + v = 0; call_fn_1( f0 ); BOOST_TEST_EQ( v, -1 ); + v = 0; call_fn_2( f1 ); BOOST_TEST_EQ( v, 1 ); + v = 0; call_fn_3( f2 ); BOOST_TEST_EQ( v, 3 ); + + v = 0; call_fn_4( f0 ); BOOST_TEST_EQ( v, -1 ); + v = 0; call_fn_5( f1 ); BOOST_TEST_EQ( v, 1 ); + v = 0; call_fn_6( f2 ); BOOST_TEST_EQ( v, 3 ); + + return boost::report_errors(); +}