)]}'
{
  "commit": "b7ced159dbb789c70d4c502393e06ffac8c0e23d",
  "tree": "03de9ebffb9278b42b2946915ed1755cb1255d33",
  "parents": [
    "7140cd416cecd7462a8aae488024abeee55598e4"
  ],
  "author": {
    "name": "Niclas Larsson",
    "email": "niclas@edgesystems.se",
    "time": "Thu Jun 04 19:45:38 2026 +0200"
  },
  "committer": {
    "name": "Niclas Larsson",
    "email": "niclas@edgesystems.se",
    "time": "Thu Jun 04 19:56:55 2026 +0200"
  },
  "message": "Avoid is_constructible recursion in OnceAction\n\nBoth OnceAction compatibility traits, IsDirectlyCompatible and\nIsCompatibleAfterIgnoringArguments, check std::is_constructible before\nis_callable_r.\n\nOn libc++ that order breaks. Evaluating\nis_constructible\u003cstd::tuple\u003cOnceAction\u0026\u0026\u003e, ...\u003e drives libc++\u0027s tuple\nconstructor SFINAE, which calls back into OnceAction\u0027s converting\nconstructor and re-enters the conjunction while it is still incomplete.\nGCC \u003c\u003d 8 (e.g. QNX 7.1\u0027s gcc 8.3) rejects this with:\n\n    incomplete type ... used in nested name specifier\n\nso EXPECT_CALL(m, f()).WillOnce(Return(...)) fails to compile. GCC \u003e\u003d 9\nand every Clang accept the original order; libstdc++ is unaffected.\n\nSwapping the two checks fixes it: is_callable_r is cheap and\nnon-recursive, so the conjunction short-circuits to false for the\nnon-callable tuple before is_constructible is instantiated.\n\nFixes #3947.\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "94552cea2106687a6d68298c0524c4bcb6bd1cc5",
      "old_mode": 33188,
      "old_path": "googlemock/include/gmock/gmock-actions.h",
      "new_id": "4a3904f640389b75874dcc2ea4644cf19eac6266",
      "new_mode": 33188,
      "new_path": "googlemock/include/gmock/gmock-actions.h"
    }
  ]
}
