From 0f6b79fe1f6b8f4bafffa9f7ed730061bb252c24 Mon Sep 17 00:00:00 2001 From: jzmaddock Date: Wed, 26 Jun 2019 09:37:13 +0100 Subject: [PATCH 1/5] Add gcc-9, clang-8, xcode-10 to test matrix. --- .travis.yml | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 7b9e9655..5b38f3bc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -124,6 +124,17 @@ 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 @@ -250,9 +261,24 @@ matrix: - 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 From 089e3749fdfc06a18f9677fcdda65addbe322e90 Mon Sep 17 00:00:00 2001 From: jzmaddock Date: Thu, 27 Jun 2019 08:34:47 +0100 Subject: [PATCH 2/5] Correct usage of std::memory_order in test case. Otherwise it fails in C++20. --- test/boost_no_cxx11_hdr_atomic.ipp | 126 +++++++++++++++-------------- 1 file changed, 66 insertions(+), 60 deletions(-) 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; + } } From 10c5df0159e9bd04f58c1def0263a54362a8e506 Mon Sep 17 00:00:00 2001 From: jzmaddock Date: Thu, 27 Jun 2019 12:48:00 +0100 Subject: [PATCH 3/5] Update char8_t tests and print out C++20 feature macros. --- test/boost_no_unicode_literals.ipp | 2 +- test/config_info.cpp | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/test/boost_no_unicode_literals.ipp b/test/boost_no_unicode_literals.ipp index 84721c52..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_type +#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..37fd1359 100644 --- a/test/config_info.cpp +++ b/test/config_info.cpp @@ -1273,6 +1273,16 @@ 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); From baf3a25a65f5a6d344137e298d88af5f4d917b66 Mon Sep 17 00:00:00 2001 From: jzmaddock Date: Thu, 27 Jun 2019 18:14:33 +0100 Subject: [PATCH 4/5] Update config_info.cpp. --- test/config_info.cpp | 23 ++++------------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/test/config_info.cpp b/test/config_info.cpp index 37fd1359..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,6 +1248,10 @@ 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() From 8d58766c7b097ecdf99d414cc08feec313741332 Mon Sep 17 00:00:00 2001 From: jzmaddock Date: Fri, 28 Jun 2019 08:32:47 +0100 Subject: [PATCH 5/5] gcc: exclude attribute definition for gcc in C++03 mode. Even though __has_attribute reports true for gcc-9. --- include/boost/config/detail/suffix.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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