From 7db3f97ba80e231e895f78f689f6b32aae5eabf0 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 26 May 2023 09:23:02 -0400 Subject: [PATCH] Adding CXX 20 to CI (#2005) * Adding CXX 20 to CI * side-stepping new CXX 20 guard. * Going another way * Saving. * Explicit. * Saving... --------- Co-authored-by: Daniel Lemire --- .github/workflows/ubuntu22-cxx20.yml | 33 ++++++++++++++ .github/workflows/vs17-ci-cxx20.yml | 44 +++++++++++++++++++ cmake/developer-options.cmake | 3 +- tests/dom/basictests.cpp | 1 - tests/minify_tests.cpp | 1 - .../ondemand/ondemand_json_pointer_tests.cpp | 6 +-- tests/ondemand/ondemand_misc_tests.cpp | 12 ++--- tests/ondemand/ondemand_readme_examples.cpp | 2 +- tests/ondemand/ondemand_tostring_tests.cpp | 1 - 9 files changed, 89 insertions(+), 14 deletions(-) create mode 100644 .github/workflows/ubuntu22-cxx20.yml create mode 100644 .github/workflows/vs17-ci-cxx20.yml diff --git a/.github/workflows/ubuntu22-cxx20.yml b/.github/workflows/ubuntu22-cxx20.yml new file mode 100644 index 000000000..7b0c77b96 --- /dev/null +++ b/.github/workflows/ubuntu22-cxx20.yml @@ -0,0 +1,33 @@ +name: Ubuntu 22.04 CI (GCC 12, CXX 20) + +on: [push, pull_request] + +jobs: + ubuntu-build: + if: >- + ! contains(toJSON(github.event.commits.*.message), '[skip ci]') && + ! contains(toJSON(github.event.commits.*.message), '[skip github]') + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v2 + - uses: actions/cache@v2 + with: + path: dependencies/.cache + key: ${{ hashFiles('dependencies/CMakeLists.txt') }} + - name: Use cmake + run: | + mkdir builddebug && + cd builddebug && + CXX=g++-12 cmake -DSIMDJSON_CXX_STANDARD=20 -DCMAKE_BUILD_TYPE=Debug -DSIMDJSON_GOOGLE_BENCHMARKS=OFF -DSIMDJSON_DEVELOPER_MODE=ON -DBUILD_SHARED_LIBS=OFF .. && + cmake --build . && + ctest -j --output-on-failure -LE explicitonly && + cd .. && + mkdir build && + cd build && + CXX=g++-12 cmake -DSIMDJSON_CXX_STANDARD=20 -DSIMDJSON_GOOGLE_BENCHMARKS=ON -DSIMDJSON_DEVELOPER_MODE=ON -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX:PATH=destination .. && + cmake --build . && + ctest -j --output-on-failure -LE explicitonly && + cmake --install . && + echo -e '#include \nint main(int argc,char**argv) {simdjson::dom::parser parser;simdjson::dom::element tweets = parser.load(argv[1]); }' > tmp.cpp && c++ -Idestination/include -Ldestination/lib -std=c++17 -Wl,-rpath,destination/lib -o linkandrun tmp.cpp -lsimdjson && ./linkandrun jsonexamples/twitter.json && + cd ../tests/installation_tests/find && + mkdir build && cd build && cmake -DCMAKE_INSTALL_PREFIX:PATH=../../../build/destination .. && cmake --build . diff --git a/.github/workflows/vs17-ci-cxx20.yml b/.github/workflows/vs17-ci-cxx20.yml new file mode 100644 index 000000000..70614cdaa --- /dev/null +++ b/.github/workflows/vs17-ci-cxx20.yml @@ -0,0 +1,44 @@ +name: VS17-CI CXX20 + +on: [push, pull_request] + +jobs: + ci: + if: >- + ! contains(toJSON(github.event.commits.*.message), '[skip ci]') && + ! contains(toJSON(github.event.commits.*.message), '[skip github]') + name: windows-vs17 + runs-on: windows-latest + strategy: + fail-fast: false + matrix: + include: + - {gen: Visual Studio 17 2022, arch: Win32, shared: ON} + - {gen: Visual Studio 17 2022, arch: Win32, shared: OFF} + - {gen: Visual Studio 17 2022, arch: x64, shared: ON} + - {gen: Visual Studio 17 2022, arch: x64, shared: OFF} + steps: + - name: checkout + uses: actions/checkout@v2 + - name: Configure + run: | + cmake -DSIMDJSON_CXX_STANDARD=20 -G "${{matrix.gen}}" -A ${{matrix.arch}} -DSIMDJSON_DEVELOPER_MODE=ON -DSIMDJSON_COMPETITION=OFF -DBUILD_SHARED_LIBS=${{matrix.shared}} -B build + - name: Build Debug + run: cmake --build build --config Debug --verbose + - name: Build Release + run: cmake --build build --config Release --verbose + - name: Run Release tests + run: | + cd build + ctest -C Release -LE explicitonly --output-on-failure + - name: Run Debug tests + run: | + cd build + ctest -C Debug -LE explicitonly --output-on-failure + - name: Install + run: | + cmake --install build --config Release + - name: Test Installation + run: | + cmake -G "${{matrix.gen}}" -A ${{matrix.arch}} -B build_install_test tests/installation_tests/find + cmake --build build_install_test --config Release \ No newline at end of file diff --git a/cmake/developer-options.cmake b/cmake/developer-options.cmake index b678d352c..0db8e5adf 100644 --- a/cmake/developer-options.cmake +++ b/cmake/developer-options.cmake @@ -110,7 +110,8 @@ endif() # We compile tools, tests, etc. with C++ 17. Override yourself if you need on a # target. -set(CMAKE_CXX_STANDARD 17) +set(SIMDJSON_CXX_STANDARD 17 CACHE STRING "the C++ standard to use for simdjson") +set(CMAKE_CXX_STANDARD ${SIMDJSON_CXX_STANDARD}) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_MACOSX_RPATH OFF) diff --git a/tests/dom/basictests.cpp b/tests/dom/basictests.cpp index 859be52c7..8da62bacc 100644 --- a/tests/dom/basictests.cpp +++ b/tests/dom/basictests.cpp @@ -9,7 +9,6 @@ #include #include #include -#include #include #include "simdjson.h" diff --git a/tests/minify_tests.cpp b/tests/minify_tests.cpp index 438175acd..fa2b0e660 100644 --- a/tests/minify_tests.cpp +++ b/tests/minify_tests.cpp @@ -1,5 +1,4 @@ #include -#include #include #include #include diff --git a/tests/ondemand/ondemand_json_pointer_tests.cpp b/tests/ondemand/ondemand_json_pointer_tests.cpp index bf0b93d32..94e5cd280 100644 --- a/tests/ondemand/ondemand_json_pointer_tests.cpp +++ b/tests/ondemand/ondemand_json_pointer_tests.cpp @@ -195,7 +195,7 @@ namespace json_pointer_tests { ASSERT_SUCCESS(parser.iterate(cars_json).get(cars)); for (int i = 0; i < 3; i++) { double x; - std::string json_pointer = "/" + std::to_string(i) + "/tire_pressure/1"; + std::string json_pointer = std::string("/") + std::to_string(i) + std::string("/tire_pressure/1"); ASSERT_SUCCESS(cars.at_pointer(json_pointer).get(x)); measured.push_back(x); } @@ -315,7 +315,7 @@ namespace json_pointer_tests { std::vector content; for (int i = 0; i < 3; i++) { ondemand::object obj; - std::string json_pointer = "/" + std::to_string(i); + std::string json_pointer = std::string("/") + std::to_string(i); // Each successive at_pointer call invalidates // previously parsed values, strings, objects and array. ASSERT_SUCCESS(cars.at_pointer(json_pointer).get(obj)); @@ -360,7 +360,7 @@ namespace json_pointer_tests { ondemand::document cars = parser.iterate(cars_json); std::vector content; for (int i = 0; i < 3; i++) { - std::string json_pointer = "/" + std::to_string(i); + std::string json_pointer = std::string("/") + std::to_string(i); // Each successive at_pointer call invalidates // previously parsed values, strings, objects and array. ondemand::object obj(cars.at_pointer(json_pointer).get_object()); diff --git a/tests/ondemand/ondemand_misc_tests.cpp b/tests/ondemand/ondemand_misc_tests.cpp index 5ed838508..224eca736 100644 --- a/tests/ondemand/ondemand_misc_tests.cpp +++ b/tests/ondemand/ondemand_misc_tests.cpp @@ -133,7 +133,7 @@ namespace misc_tests { ASSERT_SUCCESS(parser.iterate(json).get(doc)); std::string_view view; ASSERT_SUCCESS( doc.get_string().get(view)); - ASSERT_EQUAL(view, u8"wow:\uFFFF"); + ASSERT_EQUAL(view, "wow:\xef\xbf\xbf"); TEST_SUCCEED(); } @@ -536,9 +536,9 @@ namespace misc_tests { return true; } simdjson_warn_unused bool test_raw_json_token(string_view json, string_view expected_token, int expected_start_index = 0) { - string title = "'"; + string title("'"); title.append(json.data(), json.length()); - title += "'"; + title += std::string("'"); padded_string json_padded = json; SUBTEST(title, test_ondemand_doc(json_padded, [&](auto doc) { string_view token; @@ -552,11 +552,11 @@ namespace misc_tests { // Test values auto json_in_hash = string(R"({"a":)"); json_in_hash.append(json.data(), json.length()); - json_in_hash += "}"; + json_in_hash += std::string("}"); json_padded = json_in_hash; - title = "'"; + title = std::string("'"); title.append(json_in_hash.data(), json_in_hash.length()); - title += "'"; + title += std::string("'"); SUBTEST(title, test_ondemand_doc(json_padded, [&](auto doc) { string_view token; ASSERT_SUCCESS( doc["a"].raw_json_token().get(token) ); diff --git a/tests/ondemand/ondemand_readme_examples.cpp b/tests/ondemand/ondemand_readme_examples.cpp index 1e891ed4a..8885ccd5b 100644 --- a/tests/ondemand/ondemand_readme_examples.cpp +++ b/tests/ondemand/ondemand_readme_examples.cpp @@ -768,7 +768,7 @@ bool json_pointer_multiple() { ASSERT_SUCCESS(cars.count_elements().get(size)); double expected[] = {39.9, 31, 30}; for (size_t i = 0; i < size; i++) { - std::string json_pointer = "/" + std::to_string(i) + "/tire_pressure/1"; + std::string json_pointer = std::string("/") + std::to_string(i) + std::string("/tire_pressure/1"); double x; ASSERT_SUCCESS(cars.at_pointer(json_pointer).get(x)); ASSERT_EQUAL(x,expected[i]); diff --git a/tests/ondemand/ondemand_tostring_tests.cpp b/tests/ondemand/ondemand_tostring_tests.cpp index cec52df3c..88816f326 100644 --- a/tests/ondemand/ondemand_tostring_tests.cpp +++ b/tests/ondemand/ondemand_tostring_tests.cpp @@ -1,5 +1,4 @@ #include -#include #include #include #include