diff --git a/.travis.yml b/.travis.yml index da64807c..5b38f3bc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,6 +6,8 @@ language: cpp sudo: false +dist : xenial + branches: only: - master @@ -26,6 +28,7 @@ matrix: env: TOOLSET=gcc COMPILER=g++ CXXSTD=03,11 - os: linux + dist: trusty compiler: g++-4.4 env: TOOLSET=gcc COMPILER=g++-4.4 CXXSTD=98,0x addons: @@ -36,6 +39,7 @@ matrix: - ubuntu-toolchain-r-test - os: linux + dist: trusty compiler: g++-4.6 env: TOOLSET=gcc COMPILER=g++-4.6 CXXSTD=03,0x addons: @@ -46,6 +50,7 @@ matrix: - ubuntu-toolchain-r-test - os: linux + dist: trusty env: TOOLSET=gcc COMPILER=g++-4.7 CXXSTD=03,11 addons: apt: @@ -55,6 +60,7 @@ matrix: - ubuntu-toolchain-r-test - os: linux + dist: trusty env: TOOLSET=gcc COMPILER=g++-4.8 CXXSTD=03,11 addons: apt: @@ -64,6 +70,7 @@ matrix: - ubuntu-toolchain-r-test - os: linux + dist: trusty env: TOOLSET=gcc COMPILER=g++-4.9 CXXSTD=03,11 addons: apt: @@ -117,10 +124,22 @@ matrix: sources: - ubuntu-toolchain-r-test + - os: linux + dist: trusty + compiler: g++-9 + env: TOOLSET=gcc COMPILER=g++-9 CXXSTD=03,11,14,17,2a + addons: + apt: + packages: + - g++-9 + sources: + - ubuntu-toolchain-r-test + - os: linux env: TOOLSET=clang COMPILER=clang++ CXXSTD=03,11 - os: linux + dist: trusty env: TOOLSET=clang COMPILER=clang++-3.5 CXXSTD=03,11,14,1z addons: apt: @@ -131,6 +150,7 @@ matrix: - llvm-toolchain-precise-3.5 - os: linux + dist: trusty env: TOOLSET=clang COMPILER=clang++-3.6 CXXSTD=03,11,14,1z addons: apt: @@ -141,6 +161,7 @@ matrix: - llvm-toolchain-precise-3.6 - os: linux + dist: trusty env: TOOLSET=clang COMPILER=clang++-3.7 CXXSTD=03,11,14,1z addons: apt: @@ -151,6 +172,7 @@ matrix: - llvm-toolchain-precise-3.7 - os: linux + dist: trusty env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=03,11,14,1z addons: apt: @@ -161,6 +183,7 @@ matrix: - llvm-toolchain-precise-3.8 - os: linux + dist: trusty env: TOOLSET=clang COMPILER=clang++-3.9 CXXSTD=03,11,14,1z addons: apt: @@ -179,7 +202,7 @@ matrix: - clang-4.0 sources: - ubuntu-toolchain-r-test - - llvm-toolchain-trusty-4.0 + - llvm-toolchain-xenial-4.0 - os: linux compiler: clang++-5.0 @@ -190,11 +213,11 @@ matrix: - clang-5.0 sources: - ubuntu-toolchain-r-test - - llvm-toolchain-trusty-5.0 + - llvm-toolchain-xenial-5.0 - os: linux compiler: clang++-libc++ - env: TOOLSET=clang COMPILER=clang++-libc++ CXXSTD=03,11,14,1z + env: TOOLSET=clang COMPILER="clang++-5.0 -stdlib=libc++" CXXSTD=03,11,14 addons: apt: packages: @@ -202,7 +225,7 @@ matrix: - clang-5.0 sources: - ubuntu-toolchain-r-test - - llvm-toolchain-trusty-5.0 + - llvm-toolchain-xenial-5.0 - os: linux compiler: clang++-6.0 @@ -213,7 +236,7 @@ matrix: - clang-6.0 sources: - ubuntu-toolchain-r-test - - llvm-toolchain-trusty-6.0 + - llvm-toolchain-xenial-6.0 - os: linux compiler: clang++-libc++ @@ -225,11 +248,37 @@ matrix: - libc++-dev sources: - ubuntu-toolchain-r-test - - llvm-toolchain-trusty-6.0 + - llvm-toolchain-xenial-6.0 + + - os: linux + compiler: clang++-7 + env: TOOLSET=clang COMPILER=clang++-7 CXXSTD=03,11,14,1z + addons: + apt: + packages: + - clang-7 + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-xenial-7 + + - os: linux + compiler: clang++-8 + env: TOOLSET=clang COMPILER=clang++-8 CXXSTD=03,11,14,17,2a + addons: + apt: + packages: + - clang-8 + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-xenial-8 + + - os: osx + env: TOOLSET=clang COMPILER=clang++ CXXSTD=03,11,14,17,2a + osx_image: xcode10.2 - os: osx env: TOOLSET=clang COMPILER=clang++ CXXSTD=03,11,14,1z - osx_image: xcode9.1 + osx_image: xcode9.4 - os: osx env: TOOLSET=clang COMPILER=clang++ CXXSTD=03,11,14,1z @@ -271,9 +320,7 @@ script: - if [ $TEST_INTEL ]; then source ~/.bashrc; fi - |- echo "using $TOOLSET : : $COMPILER : $EXTRA_FLAGS $EXTRA_FLAGS ;" > ~/user-config.jam - - IFS=',' - - for CXXLOCAL in $CXXSTD; do (cd libs/config/test && ../../../b2 config_info_travis_install toolset=$TOOLSET cxxstd=$CXXLOCAL $CXXSTD_DIALECT && echo With Standard Version $CXXLOCAL && ./config_info_travis && rm ./config_info_travis) done - - unset IFS + - ./b2 libs/config/test//print_config_info toolset=$TOOLSET cxxstd=$CXXSTD $CXXSTD_DIALECT - ./b2 -j3 libs/config/test toolset=$TOOLSET cxxstd=$CXXSTD $CXXSTD_DIALECT notifications: diff --git a/appveyor.bat b/appveyor.bat deleted file mode 100644 index fb6d5279..00000000 --- a/appveyor.bat +++ /dev/null @@ -1,12 +0,0 @@ -IF NOT DEFINED CXXSTD ( -ECHO %ARGS:"=% -..\..\..\b2 config_info_travis_install %ARGS:"=% -config_info_travis -del config_info_travis.exe -) -IF DEFINED CXXSTD FOR %%A IN (%CXXSTD%) DO ( -ECHO %ARGS:"=% -..\..\..\b2 -a -d2 config_info_travis_install %ARGS:"=% cxxstd=%%A -config_info_travis -del config_info_travis.exe -) \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml index a6fdbc9c..445ac97e 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -22,6 +22,10 @@ environment: ARGS: --toolset=msvc-14.1 address-model=32 - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 ARGS: --toolset=msvc-14.1 address-model=64 cxxflags=-std:c++latest cxxflags=-permissive- + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 + ARGS: --toolset=clang-win address-model=64 + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 + ARGS: --toolset=clang-win address-model=32 - ARGS: --toolset=msvc-9.0 address-model=32 - ARGS: --toolset=msvc-10.0 address-model=32 - ARGS: --toolset=msvc-11.0 address-model=32 @@ -65,5 +69,5 @@ build: off test_script: - cd libs\config\test - - ..\appveyor.bat + - ..\..\..\b2 print_config_info %ARGS% cxxstd=%CXXSTD% - ..\..\..\b2 -j3 %ARGS% cxxstd=%CXXSTD% diff --git a/checks/architecture/Jamroot.jam b/checks/architecture/Jamroot.jam index 03f59534..0d3b5e7b 100644 --- a/checks/architecture/Jamroot.jam +++ b/checks/architecture/Jamroot.jam @@ -22,3 +22,4 @@ obj power : power.cpp ; obj riscv : riscv.cpp ; obj sparc : sparc.cpp ; obj x86 : x86.cpp ; +obj s390x : s390x.cpp ; diff --git a/checks/architecture/s390x.cpp b/checks/architecture/s390x.cpp new file mode 100644 index 00000000..a3630706 --- /dev/null +++ b/checks/architecture/s390x.cpp @@ -0,0 +1,11 @@ +// s390x.cpp +// +// Copyright (c) 2012 Steven Watanabe +// +// Distributed under 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) + +#if !defined(__s390x__) +#error "Not S390x" +#endif diff --git a/include/boost/config/auto_link.hpp b/include/boost/config/auto_link.hpp index d0079d9b..e74f3c10 100644 --- a/include/boost/config/auto_link.hpp +++ b/include/boost/config/auto_link.hpp @@ -99,7 +99,8 @@ BOOST_LIB_VERSION: The Boost version, in the form x_y, for Boost version x.y. #if defined(BOOST_MSVC) \ || defined(__BORLANDC__) \ || (defined(__MWERKS__) && defined(_WIN32) && (__MWERKS__ >= 0x3000)) \ - || (defined(__ICL) && defined(_MSC_EXTENSIONS) && (_MSC_VER >= 1200)) + || (defined(__ICL) && defined(_MSC_EXTENSIONS) && (_MSC_VER >= 1200)) \ + || (defined(BOOST_CLANG) && defined(BOOST_WINDOWS) && defined(_MSC_VER) && (__clang_major__ >= 4)) #ifndef BOOST_VERSION_HPP # include @@ -203,6 +204,11 @@ BOOST_LIB_VERSION: The Boost version, in the form x_y, for Boost version x.y. // Metrowerks CodeWarrior 9.x # define BOOST_LIB_TOOLSET "cw9" +# elif defined(BOOST_CLANG) && defined(BOOST_WINDOWS) && defined(_MSC_VER) && (__clang_major__ >= 4) + + // Clang on Windows +# define BOOST_LIB_TOOLSET "clangw" BOOST_STRINGIZE(__clang_major__) + # endif #endif // BOOST_LIB_TOOLSET diff --git a/include/boost/config/detail/suffix.hpp b/include/boost/config/detail/suffix.hpp index 2550239c..86f6081e 100644 --- a/include/boost/config/detail/suffix.hpp +++ b/include/boost/config/detail/suffix.hpp @@ -999,7 +999,7 @@ namespace std{ using ::type_info; } #if __has_cpp_attribute(nodiscard) # define BOOST_ATTRIBUTE_NODISCARD [[nodiscard]] #endif -#if __has_cpp_attribute(no_unique_address) +#if __has_cpp_attribute(no_unique_address) && !(defined(__GNUC__) && (__cplusplus < 201100)) # define BOOST_ATTRIBUTE_NO_UNIQUE_ADDRESS [[no_unique_address]] #endif #endif diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 41aadf1b..cfc42ade 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -8,6 +8,7 @@ # the template defined in options_v2.jam. # +import feature ; import testing ; project @@ -114,7 +115,26 @@ obj has_clang_implicit_fallthrough : cmd_line_check.cpp : explicit has_clang_implicit_fallthrough ; +exe config_info_printer : config_info.cpp ; +explicit config_info_printer ; + +actions print-run +{ + echo With Standard Version $(STANDARD:E=default) + echo ===================================================================== + $(>) +} + +rule print-run ( target : sources * : properties * ) +{ + STANDARD on $(target) = [ feature.get-values : $(properties) ] ; +} + +notfile print_config_info : @print-run : config_info_printer ; +explicit print_config_info ; + +# Backwards compatibility: exe config_info_travis : config_info.cpp ; install config_info_travis_install : config_info_travis : . ; explicit config_info_travis_install ; -explicit config_info_travis ; + diff --git a/test/boost_no_cxx11_hdr_atomic.ipp b/test/boost_no_cxx11_hdr_atomic.ipp index 171dcc3d..ceabb650 100644 --- a/test/boost_no_cxx11_hdr_atomic.ipp +++ b/test/boost_no_cxx11_hdr_atomic.ipp @@ -21,72 +21,78 @@ namespace boost_no_cxx11_hdr_atomic { -int test() -{ - std::memory_order m = static_cast(std::memory_order_relaxed | std::memory_order_consume | std::memory_order_acquire | std::memory_order_release - | std::memory_order_acq_rel | std::memory_order_seq_cst); - (void)m; + void consume(std::memory_order) + {} - std::atomic a1; - std::atomic a2; - std::atomic a3; - a1.is_lock_free(); - a1.store(1); - a1.load(); - a1.exchange(2); - int v; - a1.compare_exchange_weak(v, 2, std::memory_order_relaxed, std::memory_order_relaxed); - a1.compare_exchange_strong(v, 2, std::memory_order_relaxed, std::memory_order_relaxed); - a1.fetch_add(2); - a1.fetch_sub(3); - a1.fetch_and(3); - a1.fetch_or(1); - a1.fetch_xor(1); - a1++; - ++a1; - a1--; - --a1; - a1 += 2; - a1 -= 2; - a1 &= 1; - a1 |= 2; - a1 ^= 3; + int test() + { + consume(std::memory_order_relaxed); + consume(std::memory_order_consume); + consume(std::memory_order_acquire); + consume(std::memory_order_release); + consume(std::memory_order_acq_rel); + consume(std::memory_order_seq_cst); - a2 = 0u; + std::atomic a1; + std::atomic a2; + std::atomic a3; + a1.is_lock_free(); + a1.store(1); + a1.load(); + a1.exchange(2); + int v; + a1.compare_exchange_weak(v, 2, std::memory_order_relaxed, std::memory_order_relaxed); + a1.compare_exchange_strong(v, 2, std::memory_order_relaxed, std::memory_order_relaxed); + a1.fetch_add(2); + a1.fetch_sub(3); + a1.fetch_and(3); + a1.fetch_or(1); + a1.fetch_xor(1); + a1++; + ++a1; + a1--; + --a1; + a1 += 2; + a1 -= 2; + a1 &= 1; + a1 |= 2; + a1 ^= 3; - a3.store(&v); - a3.fetch_add(1); - a3.fetch_sub(1); - ++a3; - --a3; - a3++; - a3--; - a3 += 1; - a3 -= 1; + a2 = 0u; - std::atomic_is_lock_free(&a1); - // This produces linker errors on Mingw32 for some reason, probably not required anyway for most uses?? - //std::atomic_init(&a1, 2); - std::atomic_store(&a1, 3); - std::atomic_store_explicit(&a1, 3, std::memory_order_relaxed); - std::atomic_load(&a1); - std::atomic_load_explicit(&a1, std::memory_order_relaxed); - std::atomic_exchange(&a1, 3); - std::atomic_compare_exchange_weak(&a1, &v, 2); - std::atomic_compare_exchange_strong(&a1, &v, 2); - std::atomic_compare_exchange_weak_explicit(&a1, &v, 2, std::memory_order_relaxed, std::memory_order_relaxed); - std::atomic_compare_exchange_strong_explicit(&a1, &v, 2, std::memory_order_relaxed, std::memory_order_relaxed); + a3.store(&v); + a3.fetch_add(1); + a3.fetch_sub(1); + ++a3; + --a3; + a3++; + a3--; + a3 += 1; + a3 -= 1; - std::atomic_flag f = ATOMIC_FLAG_INIT; - f.test_and_set(std::memory_order_relaxed); - f.test_and_set(); - f.clear(std::memory_order_relaxed); - f.clear(); + std::atomic_is_lock_free(&a1); + // This produces linker errors on Mingw32 for some reason, probably not required anyway for most uses?? + //std::atomic_init(&a1, 2); + std::atomic_store(&a1, 3); + std::atomic_store_explicit(&a1, 3, std::memory_order_relaxed); + std::atomic_load(&a1); + std::atomic_load_explicit(&a1, std::memory_order_relaxed); + std::atomic_exchange(&a1, 3); + std::atomic_compare_exchange_weak(&a1, &v, 2); + std::atomic_compare_exchange_strong(&a1, &v, 2); + std::atomic_compare_exchange_weak_explicit(&a1, &v, 2, std::memory_order_relaxed, std::memory_order_relaxed); + std::atomic_compare_exchange_strong_explicit(&a1, &v, 2, std::memory_order_relaxed, std::memory_order_relaxed); - std::atomic_thread_fence(std::memory_order_relaxed); - std::atomic_signal_fence(std::memory_order_relaxed); + std::atomic_flag f = ATOMIC_FLAG_INIT; + f.test_and_set(std::memory_order_relaxed); + f.test_and_set(); + f.clear(std::memory_order_relaxed); + f.clear(); - return 0; -} + std::atomic_thread_fence(std::memory_order_relaxed); + std::atomic_signal_fence(std::memory_order_relaxed); + + return 0; + } } diff --git a/test/boost_no_unicode_literals.ipp b/test/boost_no_unicode_literals.ipp index bbf865ec..0faf9b7d 100644 --- a/test/boost_no_unicode_literals.ipp +++ b/test/boost_no_unicode_literals.ipp @@ -17,7 +17,7 @@ void quiet_warning(const CharT*){} int test() { -#ifdef _­_­cpp_­char8_­t +#if defined(__cpp_char8_type) || defined(__cpp_char8_t) // The change to char8_t in C++20 is a breaking change to the std: const char8_t* c8 = u8""; #else diff --git a/test/config_info.cpp b/test/config_info.cpp index bb3ef249..f5ec470d 100644 --- a/test/config_info.cpp +++ b/test/config_info.cpp @@ -1231,25 +1231,6 @@ void print_boost_macros() PRINT_MACRO(BOOST_NO_USING_TEMPLATE); PRINT_MACRO(BOOST_NO_VOID_RETURNS); - - - - - - - - - - - - - - - - - - - // END GENERATED BLOCK PRINT_MACRO(BOOST_INTEL); @@ -1267,12 +1248,26 @@ void print_boost_macros() PRINT_MACRO(BOOST_FALLTHROUGH); PRINT_MACRO(BOOST_MAY_ALIAS); PRINT_MACRO(BOOST_NO_MAY_ALIAS); + PRINT_MACRO(BOOST_ATTRIBUTE_NO_UNIQUE_ADDRESS); + PRINT_MACRO(BOOST_ATTRIBUTE_UNUSED); + PRINT_MACRO(BOOST_UNLIKELY); + PRINT_MACRO(BOOST_NORETURN); } void print_sd6_macros() { // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0096r5.html + // C++20: + PRINT_MACRO(__cpp_aggregate_paren_init); + PRINT_MACRO(__cpp_char8_t); + PRINT_MACRO(__cpp_char8_type); + PRINT_MACRO(__cpp_conditional_explicit); + PRINT_MACRO(__cpp_coroutines); + PRINT_MACRO(__cpp_impl_destroying_delete); + PRINT_MACRO(__cpp_impl_three_way_comparison); + PRINT_MACRO(__cpp_nontype_template_parameter_class); + // C++17: PRINT_MACRO(__cpp_hex_float); PRINT_MACRO(__cpp_inline_variables);