)]}'
{
  "commit": "ab60910e01eaa8bcf993cdb59a95f882b3859fd1",
  "tree": "836029e7523ea2d6d08a67f0e255c00e6990c435",
  "parents": [
    "fa985b5f1e3db76e5f52dec41c2100cb354c771a"
  ],
  "author": {
    "name": "A. Jiang",
    "email": "de34@live.cn",
    "time": "Tue May 13 04:49:25 2025 +0800"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Mon May 12 16:49:25 2025 -0400"
  },
  "message": "[libc++][format] Discard contents since null-terminator in character arrays in formatting (#116571)\n\nCurrently, built-in `char`/`wchar_t` arrays are assumed to be\nnull-terminated sequence with the terminator being the last element in\nformatting. This doesn\u0027t conform to [format.arg]/6.9.\n\n\u003e otherwise, if `decay_t\u003cTD\u003e` is `char_type*` or `const char_type*`,\n\u003e initializes value with `static_cast\u003cconst char_type*\u003e(v)`;\n\nThe standard wording specifies that character arrays are decayed to\npointers. When the null terminator is not the last element or there\u0027s no\nnull terminator (the latter case is UB), libc++ currently produces\ndifferent results.\n\nAlso fixes and hardens `formatter\u003cCharT[N], CharT\u003e::format` in\n`\u003c__format/formatter_string.h\u003e`. These specializations are rarely used.\n\nFixes #115935. Also checks the preconditions in this case, which fixes\n#116570.",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "dba2dfd6df0847ce3be4eae0b18680627ffa31c4",
      "old_mode": 33188,
      "old_path": "libcxx/include/__format/format_arg_store.h",
      "new_id": "87557aa4da7bb1ad58bac4cce63aabcc987e8aab",
      "new_mode": 33188,
      "new_path": "libcxx/include/__format/format_arg_store.h"
    },
    {
      "type": "modify",
      "old_id": "d71d19a4970abe140b540ed17f2d727cd1bd7fa8",
      "old_mode": 33188,
      "old_path": "libcxx/include/__format/formatter_string.h",
      "new_id": "bad6a4d2bb899c9dcf5cd654b413efd0249d90cd",
      "new_mode": 33188,
      "new_path": "libcxx/include/__format/formatter_string.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "1e9b1d93eb06f7f3142fd3e5672814b25e0ab00d",
      "new_mode": 33188,
      "new_path": "libcxx/test/libcxx/utilities/format/format.arguments/format.arg/assert.array.pass.cpp"
    },
    {
      "type": "modify",
      "old_id": "1b3ff52d22d5890fa45ab885aee7de1912c251ec",
      "old_mode": 33188,
      "old_path": "libcxx/test/std/utilities/format/format.formatter/format.formatter.spec/formatter.char_array.pass.cpp",
      "new_id": "bc056db9e254e277e2fcebefd329d4494ace4bf2",
      "new_mode": 33188,
      "new_path": "libcxx/test/std/utilities/format/format.formatter/format.formatter.spec/formatter.char_array.pass.cpp"
    },
    {
      "type": "modify",
      "old_id": "3969b341cb1463e15cc44285777e43fcee9c3fd3",
      "old_mode": 33188,
      "old_path": "libcxx/test/std/utilities/format/format.functions/format_tests.h",
      "new_id": "60abd4ac4e225828fa5b729c8bec82b5acfc2b92",
      "new_mode": 33188,
      "new_path": "libcxx/test/std/utilities/format/format.functions/format_tests.h"
    }
  ]
}
