)]}'
{
  "commit": "cb66c855559bb175013cc076f9533ac4985fe702",
  "tree": "e4a616161f2132871501adf600c1cb08f492b3d0",
  "parents": [
    "f82485388963286763f8c8a9261ac227627f6a18"
  ],
  "author": {
    "name": "Andrew V. Teylu",
    "email": "andrew.teylu@vector.com",
    "time": "Fri Mar 06 10:08:22 2026 +0000"
  },
  "committer": {
    "name": "Andrew V. Teylu",
    "email": "andrew.teylu@vector.com",
    "time": "Fri Mar 06 10:38:47 2026 +0000"
  },
  "message": "Preserve parentheses around Fn trait bounds in pretty printer\n\nThe AST pretty printer was dropping parentheses around `Fn` trait\nbounds in `dyn`/`impl` types when additional `+` bounds were present.\nFor example:\n\n    dyn (FnMut(\u0026mut T) -\u003e \u0026mut dyn ResourceLimiter) + Send + Sync\n\nwas pretty-printed as:\n\n    dyn FnMut(\u0026mut T) -\u003e \u0026mut dyn ResourceLimiter + Send + Sync\n\nWithout parens, `+ Send + Sync` binds to the inner `dyn ResourceLimiter`\ninstead of the outer type, producing invalid Rust.\n\nThe parser already tracks parentheses via `PolyTraitRef.parens`, but\n`print_poly_trait_ref` never checked this field. This adds `popen()`\nand `pclose()` calls when `parens \u003d\u003d Parens::Yes`.\n\nSigned-off-by: Andrew V. Teylu \u003candrew.teylu@vector.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "1ca0715606181b9884b884265bb1b430d93f615f",
      "old_mode": 33188,
      "old_path": "compiler/rustc_ast_pretty/src/pprust/state.rs",
      "new_id": "c85d6f454321e355490d029dcdb1975d950c84f8",
      "new_mode": 33188,
      "new_path": "compiler/rustc_ast_pretty/src/pprust/state.rs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "98e75308abfe8f7892537ca673f811bd59194e74",
      "new_mode": 33188,
      "new_path": "tests/pretty/paren-trait-bound.rs"
    }
  ]
}
