)]}'
{
  "commit": "c67034e4b4c722579ee15fddb8e4af8f04252b08",
  "tree": "8c60546891ff7b47e4c25a514b378b2015aef666",
  "parents": [
    "2c2754f3c935bfb86af21b8b1636b16a98e793f6"
  ],
  "author": {
    "name": "Jordan Bayles",
    "email": "bayles.jordan@gmail.com",
    "time": "Thu Apr 09 10:37:08 2026 -0700"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Thu Apr 09 10:37:08 2026 -0700"
  },
  "message": "Fix C++11 ABI breakage when compiled with C++17 #1668 (#1675)\n\n* ci: suppress Node 20 deprecation and missing python-version warnings\n\n- Injects `FORCE_JAVASCRIPT_ACTIONS_TO_NODE24\u003dtrue` in all workflows to\n  opt-in to Node.js 24 and suppress the deprecation warnings from\n  multiple GitHub Actions.\n- Specifies `python-version: \u00273.x\u0027` for `actions/setup-python@v5` in\n  `meson.yml` to fix the missing input warning.\n\n* Fix C++11 ABI breakage when compiled with C++17 (#1668)\n\nWhen JSONCPP_HAS_STRING_VIEW was defined, the library dropped the\n`const char*` and `const String\u0026` overloads for `operator[]`, `get`,\n`removeMember`, and `isMember`, breaking ABI compatibility for projects\nconsuming the library with C++11.\n\nThis change unconditionally declares and defines the legacy overloads\nso they are always exported, restoring compatibility.\n\n* ci: add ABI compatibility matrix workflow\n\nThis adds a new GitHub Actions workflow to verify ABI compatibility across C++ standard boundaries. It explicitly tests the scenario where JsonCpp is built with one standard (e.g., C++11) and consumed by an application built with a newer one (e.g., C++23), and vice versa.\n\nTo facilitate testing the specific `std::string_view` boundary that is conditionally compiled, a new `stringView` demo application has been added to the `example/` directory and is consumed directly by the CI matrix to ensure standard library symbols link correctly across standard versions, build types (shared/static), and operating systems.\n\n* fix: inline std::string_view methods to prevent ABI breaks\n\nThis commit completely eliminates the ABI breakage that occurs across C++ standard boundaries when using `std::string_view`.\n\nPreviously, when the library was built with C++17+, CMake would leak `JSONCPP_HAS_STRING_VIEW\u003d1` as a PUBLIC definition. A C++11 consumer would receive this definition, attempt to parse the header, and fail with compiler errors because `std::string_view` is not available in their environment.\n\nConversely, if the library was built in C++11 (without `string_view` symbols), a C++17 consumer would naturally define `JSONCPP_HAS_STRING_VIEW` based on `__cplusplus` inside `value.h`. The consumer would then call the declared `string_view` methods, resulting in linker errors because the methods weren\u0027t compiled into the library.\n\nBy moving all `std::string_view` overloads directly into `value.h` as `inline` methods that delegate to the fundamental `const char*, const char*` methods:\n1. The consumer\u0027s compiler dictates whether the overloads are visible (via `__cplusplus \u003e\u003d 201703L`).\n2. The consumer compiles the inline wrappers locally, removing any reliance on the library\u0027s exported symbols for `std::string_view`.\n3. CMake no longer needs to pollute the consumer\u0027s environment with PUBLIC compile definitions.\n\n* run clang format\n\n* finish clang format",
  "tree_diff": [
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "881c4e8e0b959b39747c8872c0100dabc5a360e8",
      "new_mode": 33188,
      "new_path": ".github/workflows/abi-compatibility.yml"
    },
    {
      "type": "modify",
      "old_id": "ebbd0b58e6a2f305d7f55024791e7bff9e80be49",
      "old_mode": 33188,
      "old_path": "example/BUILD.bazel",
      "new_id": "35813085b241412245b5801bb4b7cbe1268f64c1",
      "new_mode": 33188,
      "new_path": "example/BUILD.bazel"
    },
    {
      "type": "modify",
      "old_id": "230d1bd7bb177a6e6fd4cc3cf5e1e8b4a74c677e",
      "old_mode": 33188,
      "old_path": "example/CMakeLists.txt",
      "new_id": "0666db763a0f781c37197e5aa5edf8a58196e2cb",
      "new_mode": 33188,
      "new_path": "example/CMakeLists.txt"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "b5e33e9fdea9bf43fe2ca014ab5509aa683b1b18",
      "new_mode": 33188,
      "new_path": "example/stringView/stringView.cpp"
    },
    {
      "type": "modify",
      "old_id": "f32f456093656937a72fd1c21d0ea900044bf105",
      "old_mode": 33188,
      "old_path": "include/json/value.h",
      "new_id": "2007e6b4251dd340b917eb143e4105bee36e0639",
      "new_mode": 33188,
      "new_path": "include/json/value.h"
    },
    {
      "type": "modify",
      "old_id": "03e9335525ca6efc402f3095294437a17a62cdfa",
      "old_mode": 33188,
      "old_path": "src/lib_json/CMakeLists.txt",
      "new_id": "a0695e9eba8322d3b3cdda0de5e77de6978659ed",
      "new_mode": 33188,
      "new_path": "src/lib_json/CMakeLists.txt"
    },
    {
      "type": "modify",
      "old_id": "74f77896fa7bd3de8d862e1132a78801eccb0f27",
      "old_mode": 33188,
      "old_path": "src/lib_json/json_value.cpp",
      "new_id": "a8eb72d6b75f90665fac3248ec2724a4fa50c888",
      "new_mode": 33188,
      "new_path": "src/lib_json/json_value.cpp"
    }
  ]
}
