diff mbox series

[meta-oe,wrynose] jsoncpp: fix GCC 16 (and Clang 22) build failure with u8 string literals

Message ID 20260619184443.408195-1-joaomarcos.costa@bootlin.com
State New
Headers show
Series [meta-oe,wrynose] jsoncpp: fix GCC 16 (and Clang 22) build failure with u8 string literals | expand

Commit Message

Joao Marcos Costa June 19, 2026, 6:44 p.m. UTC
This issue is known upstream: https://github.com/open-source-parsers/jsoncpp/issues/1684

Backport the corresponding fix, which is available from v1.9.8.

It reproduces with Clang 22.1.8 (from oe-core's master) as well, not
only GCC 16.

Signed-off-by: João Marcos Costa <joaomarcos.costa@bootlin.com>
---
 ...build-failure-with-u8-string-literal.patch | 73 +++++++++++++++++++
 .../recipes-devtools/jsoncpp/jsoncpp_1.9.7.bb |  1 +
 2 files changed, 74 insertions(+)
 create mode 100644 meta-oe/recipes-devtools/jsoncpp/jsoncpp/0001-fix-GCC-16-C-20-build-failure-with-u8-string-literal.patch
diff mbox series

Patch

diff --git a/meta-oe/recipes-devtools/jsoncpp/jsoncpp/0001-fix-GCC-16-C-20-build-failure-with-u8-string-literal.patch b/meta-oe/recipes-devtools/jsoncpp/jsoncpp/0001-fix-GCC-16-C-20-build-failure-with-u8-string-literal.patch
new file mode 100644
index 0000000000..c27255653a
--- /dev/null
+++ b/meta-oe/recipes-devtools/jsoncpp/jsoncpp/0001-fix-GCC-16-C-20-build-failure-with-u8-string-literal.patch
@@ -0,0 +1,73 @@ 
+From 143dd23261bc41d929d3603d0d502b2415bebbe4 Mon Sep 17 00:00:00 2001
+From: Jordan Bayles <bayles.jordan@gmail.com>
+Date: Thu, 14 May 2026 15:57:53 -0700
+Subject: [PATCH] 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
+
+Upstream-Status: Backport [https://github.com/open-source-parsers/jsoncpp/commit/71d46ca38e90dc902e8178ba484af4f27fa11947]
+---
+ .github/workflows/cmake.yml |  1 +
+ src/test_lib_json/main.cpp  | 12 +++++++-----
+ 2 files changed, 8 insertions(+), 5 deletions(-)
+
+diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml
+index 91f387a..375fa90 100644
+--- a/.github/workflows/cmake.yml
++++ b/.github/workflows/cmake.yml
+@@ -8,6 +8,7 @@ jobs:
+       fail-fast: false
+       matrix:
+         os: [ubuntu-latest, windows-latest, macos-latest]
++        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 d6938c1..1144409 100644
+--- a/src/test_lib_json/main.cpp
++++ b/src/test_lib_json/main.cpp
+@@ -1993,7 +1993,8 @@ JSONTEST_FIXTURE_LOCAL(ValueTest, StaticString) {
+ 
+ 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, strictModeParseNumber) {
+ }
+ 
+ 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 @@ JSONTEST_FIXTURE_LOCAL(CharReaderTest, parseString) {
+     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" ])";
diff --git a/meta-oe/recipes-devtools/jsoncpp/jsoncpp_1.9.7.bb b/meta-oe/recipes-devtools/jsoncpp/jsoncpp_1.9.7.bb
index 354f4e9115..6e931f15d1 100644
--- a/meta-oe/recipes-devtools/jsoncpp/jsoncpp_1.9.7.bb
+++ b/meta-oe/recipes-devtools/jsoncpp/jsoncpp_1.9.7.bb
@@ -17,6 +17,7 @@  SRCREV = "3455302847cf1e4671f1d8f5fa953fd46a7b1404"
 SRC_URI = "git://github.com/open-source-parsers/jsoncpp;branch=master;protocol=https;tag=${PV} \
            file://0001-Fix-C-11-ABI-breakage-when-compiled-with-C-17-1668-1.patch \
            file://run-ptest \
+           file://0001-fix-GCC-16-C-20-build-failure-with-u8-string-literal.patch \
            "
 
 inherit cmake ptest