fix: GCC 16 / C++20 build failure with u8 string literals (#1685)
* fix: GCC 16 / C++20 build failure with u8 string literals (#1684)
In C++20, the `u8""` string literal prefix was changed to evaluate to `const char8_t[]` instead of `const char[]`. This caused compilation errors when these literals were implicitly converted to `std::string` or passed to functions expecting `const char*`.
This commit adds `reinterpret_cast<const char*>` around the `u8` string literals in the test suite to resolve the build errors while maintaining the intended UTF-8 semantics.
Additionally, this adds C++20 to the GitHub Actions CMake test matrix to ensure we don't regress on newer standards.
Fixes #1684
* style: run clang-format
diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml
index 2b2666d..a4d8465 100644
--- a/.github/workflows/cmake.yml
+++ b/.github/workflows/cmake.yml
@@ -12,7 +12,7 @@
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
- cxx_standard: [11, 17]
+ cxx_standard: [11, 17, 20]
steps:
- name: checkout project
diff --git a/src/test_lib_json/main.cpp b/src/test_lib_json/main.cpp
index 501aba1..08731f6 100644
--- a/src/test_lib_json/main.cpp
+++ b/src/test_lib_json/main.cpp
@@ -1993,7 +1993,8 @@
JSONTEST_FIXTURE_LOCAL(ValueTest, WideString) {
// https://github.com/open-source-parsers/jsoncpp/issues/756
- const std::string uni = u8"\u5f0f\uff0c\u8fdb"; // "式,进"
+ const std::string uni =
+ reinterpret_cast<const char*>(u8"\u5f0f\uff0c\u8fdb"); // "式,进"
std::string styled;
{
Json::Value v;
@@ -3109,9 +3110,9 @@
}
JSONTEST_FIXTURE_LOCAL(ReaderTest, parseChineseWithOneError) {
- checkParse(R"({ "pr)"
- u8"\u4f50\u85e4" // 佐藤
- R"(erty" :: "value" })",
+ checkParse(reinterpret_cast<const char*>(R"({ "pr)"
+ u8"\u4f50\u85e4" // 佐藤
+ R"(erty" :: "value" })"),
{{18, 19, "Syntax error: value, object or array expected."}},
"* Line 1, Column 19\n Syntax error: value, object or array "
"expected.\n");
@@ -3223,7 +3224,8 @@
bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
JSONTEST_ASSERT(ok);
JSONTEST_ASSERT(errs.empty());
- JSONTEST_ASSERT_EQUAL(u8"\u8A2a", root[0].asString()); // "訪"
+ JSONTEST_ASSERT_EQUAL(reinterpret_cast<const char*>(u8"\u8A2a"),
+ root[0].asString()); // "訪"
}
{
char const doc[] = R"([ "\uD801" ])";