From e336667b4a05b20d4c641def7130bf0c1fbd4cc2 Mon Sep 17 00:00:00 2001 From: ylavic Date: Mon, 29 Mar 2021 17:42:30 +0200 Subject: [PATCH 1/3] Handle C++17 (and C++11 with MSVC) in CI. --- .travis.yml | 43 ++++++++++++++++++++++++++++--------------- CMakeLists.txt | 19 ++++++++++++++++++- appveyor.yml | 32 +++++++++++++++++++++++++++++++- 3 files changed, 77 insertions(+), 17 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8f34664..7e7a996 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,51 +28,63 @@ env: matrix: include: # gcc - - env: CONF=release ARCH=x86 CXX11=ON + - env: CONF=release ARCH=x86 CXX11=ON CXX17=OFF compiler: gcc arch: amd64 - - env: CONF=release ARCH=x86_64 CXX11=ON + - env: CONF=release ARCH=x86_64 CXX11=ON CXX17=OFF compiler: gcc arch: amd64 - - env: CONF=debug ARCH=x86 CXX11=OFF + - env: CONF=debug ARCH=x86 CXX11=OFF CXX17=OFF compiler: gcc arch: amd64 - - env: CONF=debug ARCH=x86_64 CXX11=OFF + - env: CONF=debug ARCH=x86_64 CXX11=OFF CXX17=OFF compiler: gcc arch: amd64 - - env: CONF=release ARCH=aarch64 CXX11=ON + - env: CONF=debug ARCH=x86 CXX11=OFF CXX17=ON + compiler: gcc + arch: amd64 + - env: CONF=debug ARCH=x86_64 CXX11=OFF CXX17=ON + compiler: gcc + arch: amd64 + - env: CONF=release ARCH=aarch64 CXX11=ON CXX17=OFF compiler: gcc arch: arm64 - - env: CONF=debug ARCH=aarch64 CXX11=OFF + - env: CONF=release ARCH=aarch64 CXX11=OFF CXX17=OFF + compiler: gcc + arch: arm64 + - env: CONF=release ARCH=aarch64 CXX11=OFF CXX17=ON compiler: gcc arch: arm64 # clang - - env: CONF=debug ARCH=x86 CXX11=ON CCACHE_CPP2=yes + - env: CONF=release ARCH=x86 CXX11=ON CXX17=OFF CCACHE_CPP2=yes compiler: clang arch: amd64 - - env: CONF=debug ARCH=x86_64 CXX11=ON CCACHE_CPP2=yes + - env: CONF=release ARCH=x86_64 CXX11=ON CXX17=OFF CCACHE_CPP2=yes compiler: clang arch: amd64 - - env: CONF=debug ARCH=x86 CXX11=OFF CCACHE_CPP2=yes + - env: CONF=debug ARCH=x86 CXX11=OFF CXX17=OFF CCACHE_CPP2=yes compiler: clang arch: amd64 - - env: CONF=debug ARCH=x86_64 CXX11=OFF CCACHE_CPP2=yes + - env: CONF=debug ARCH=x86_64 CXX11=OFF CXX17=OFF CCACHE_CPP2=yes compiler: clang arch: amd64 - - env: CONF=release ARCH=x86 CXX11=ON CCACHE_CPP2=yes + - env: CONF=debug ARCH=x86 CXX11=OFF CXX17=ON CCACHE_CPP2=yes compiler: clang arch: amd64 - - env: CONF=release ARCH=x86_64 CXX11=ON CCACHE_CPP2=yes + - env: CONF=debug ARCH=x86_64 CXX11=OFF CXX17=ON CCACHE_CPP2=yes compiler: clang arch: amd64 - - env: CONF=debug ARCH=aarch64 CXX11=ON CCACHE_CPP2=yes + - env: CONF=debug ARCH=aarch64 CXX11=ON CXX17=OFF CCACHE_CPP2=yes compiler: clang arch: arm64 - - env: CONF=debug ARCH=aarch64 CXX11=OFF CCACHE_CPP2=yes + - env: CONF=debug ARCH=aarch64 CXX11=OFF CXX17=OFF CCACHE_CPP2=yes + compiler: clang + arch: arm64 + - env: CONF=debug ARCH=aarch64 CXX11=OFF CXX17=ON CCACHE_CPP2=yes compiler: clang arch: arm64 # coverage report - - env: CONF=debug ARCH=x86 CXX11=ON GCOV_FLAGS='--coverage' + - env: CONF=debug ARCH=x86 CXX11=ON CXX17=OFF GCOV_FLAGS='--coverage' compiler: gcc arch: amd64 cache: @@ -135,6 +147,7 @@ script: (cd build && cmake -DRAPIDJSON_HAS_STDSTRING=ON -DRAPIDJSON_BUILD_CXX11=$CXX11 + -DRAPIDJSON_BUILD_CXX17=$CXX17 -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_BUILD_TYPE=$CONF -DCMAKE_CXX_FLAGS="$ARCH_FLAGS $GCOV_FLAGS" diff --git a/CMakeLists.txt b/CMakeLists.txt index 3b9ac51..dcca04f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,7 +35,8 @@ option(RAPIDJSON_BUILD_TESTS "Build rapidjson perftests and unittests." ON) option(RAPIDJSON_BUILD_THIRDPARTY_GTEST "Use gtest installation in `thirdparty/gtest` by default if available" OFF) -option(RAPIDJSON_BUILD_CXX11 "Build rapidjson with C++11 (gcc/clang)" ON) +option(RAPIDJSON_BUILD_CXX11 "Build rapidjson with C++11" ON) +option(RAPIDJSON_BUILD_CXX17 "Build rapidjson with C++17" OFF) if(RAPIDJSON_BUILD_CXX11) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED TRUE) @@ -77,6 +78,8 @@ if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") endif() + elseif (RAPIDJSON_BUILD_CXX17 AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "5.0") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17") endif() if (RAPIDJSON_BUILD_ASAN) if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.8.0") @@ -105,6 +108,8 @@ elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang") set(EXTRA_CXX_FLAGS -Weffc++ -Wswitch-default -Wfloat-equal -Wconversion -Wimplicit-fallthrough) if (RAPIDJSON_BUILD_CXX11 AND CMAKE_VERSION VERSION_LESS 3.1) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + elseif (RAPIDJSON_BUILD_CXX17 AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.0") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17") endif() if (RAPIDJSON_BUILD_ASAN) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address") @@ -119,6 +124,18 @@ elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang") elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") add_definitions(-D_CRT_SECURE_NO_WARNINGS=1) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc") + # CMake >= 3.10 should handle the above CMAKE_CXX_STANDARD fine, otherwise use /std:c++XX with MSVC >= 19.10 + if (RAPIDJSON_BUILD_CXX11 AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "19.10") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++11") + elseif (RAPIDJSON_BUILD_CXX17 AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "19.14") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++17") + endif() + # Always compile with /WX + if(CMAKE_CXX_FLAGS MATCHES "/WX-") + string(REGEX REPLACE "/WX-" "/WX" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") + else() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /WX") + endif() elseif (CMAKE_CXX_COMPILER_ID MATCHES "XL") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -qarch=auto") endif() diff --git a/appveyor.yml b/appveyor.yml index 376dc19..fc48130 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -13,37 +13,67 @@ environment: - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 VS_VERSION: 10 2010 VS_PLATFORM: win32 + CXX11: OFF + CXX17: OFF - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 VS_VERSION: 10 2010 VS_PLATFORM: x64 + CXX11: OFF + CXX17: OFF - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 VS_VERSION: 11 2012 VS_PLATFORM: win32 + CXX11: OFF + CXX17: OFF - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 VS_VERSION: 11 2012 VS_PLATFORM: x64 + CXX11: OFF + CXX17: OFF - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 VS_VERSION: 12 2013 VS_PLATFORM: win32 + CXX11: OFF + CXX17: OFF - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 VS_VERSION: 12 2013 VS_PLATFORM: x64 + CXX11: OFF + CXX17: OFF - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 VS_VERSION: 14 2015 VS_PLATFORM: win32 + CXX11: OFF + CXX17: OFF - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 VS_VERSION: 14 2015 VS_PLATFORM: x64 + CXX11: OFF + CXX17: OFF - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 VS_VERSION: 15 2017 VS_PLATFORM: win32 + CXX11: OFF + CXX17: OFF - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 VS_VERSION: 15 2017 VS_PLATFORM: x64 + CXX11: OFF + CXX17: OFF + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 + VS_VERSION: 15 2017 + VS_PLATFORM: x64 + CXX11: ON + CXX17: OFF + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 + VS_VERSION: 15 2017 + VS_PLATFORM: x64 + CXX11: OFF + CXX17: ON before_build: - git submodule update --init --recursive -- cmake -H. -BBuild/VS -G "Visual Studio %VS_VERSION%" -DCMAKE_GENERATOR_PLATFORM=%VS_PLATFORM% -DCMAKE_VERBOSE_MAKEFILE=ON -DBUILD_SHARED_LIBS=true -Wno-dev +- cmake -H. -BBuild/VS -G "Visual Studio %VS_VERSION%" -DCMAKE_GENERATOR_PLATFORM=%VS_PLATFORM% -DCMAKE_VERBOSE_MAKEFILE=ON -DBUILD_SHARED_LIBS=true -DRAPIDJSON_BUILD_CXX11=%CXX11% -DRAPIDJSON_BUILD_CXX17=%CXX17% -Wno-dev build: project: Build\VS\RapidJSON.sln From 6bed9b266f248de5d973e16bc27fdc13e68ad15d Mon Sep 17 00:00:00 2001 From: ylavic Date: Tue, 30 Mar 2021 13:47:04 +0200 Subject: [PATCH 2/3] Don't define StdAllocator from C++17. --- include/rapidjson/allocators.h | 2 ++ test/unittest/allocatorstest.cpp | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/include/rapidjson/allocators.h b/include/rapidjson/allocators.h index 2871542..711ac30 100644 --- a/include/rapidjson/allocators.h +++ b/include/rapidjson/allocators.h @@ -581,6 +581,7 @@ private: BaseAllocator baseAllocator_; }; +#if !RAPIDJSON_HAS_CXX17 // std::allocator deprecated in C++17 template class StdAllocator : public std::allocator @@ -628,6 +629,7 @@ private: BaseAllocator baseAllocator_; }; +#endif #ifdef __GNUC__ RAPIDJSON_DIAG_POP diff --git a/test/unittest/allocatorstest.cpp b/test/unittest/allocatorstest.cpp index 76e34b5..ec1b2ce 100644 --- a/test/unittest/allocatorstest.cpp +++ b/test/unittest/allocatorstest.cpp @@ -83,8 +83,12 @@ private: template void TestStdAllocator(const Allocator& a) { +#if RAPIDJSON_HAS_CXX17 + typedef StdAllocator BoolAllocator; +#else typedef StdAllocator VoidAllocator; typedef typename VoidAllocator::template rebind::other BoolAllocator; +#endif BoolAllocator ba(a), ba2(a); EXPECT_TRUE(ba == ba2); EXPECT_FALSE(ba!= ba2); From a8bd931766b9fc069731b9e86df60ff377991195 Mon Sep 17 00:00:00 2001 From: ylavic Date: Tue, 30 Mar 2021 15:58:17 +0200 Subject: [PATCH 3/3] Tests for C++17 with VS 2019. --- appveyor.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index fc48130..2e591ee 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -70,6 +70,11 @@ environment: VS_PLATFORM: x64 CXX11: OFF CXX17: ON + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019 + VS_VERSION: 16 2019 + VS_PLATFORM: x64 + CXX11: OFF + CXX17: ON before_build: - git submodule update --init --recursive