)]}'
{
  "commit": "3240928bb7a6a195afde85e89af12ded1cecc63c",
  "tree": "4aa0f4b2fb397a7f2d8f964cc13d176c7f9cfff5",
  "parents": [
    "6fa1569a647745874bef3fefb46d1a1b035f8e94"
  ],
  "author": {
    "name": "Nathan Sidwell",
    "email": "nathan@acm.org",
    "time": "Fri Jan 28 07:09:38 2022 -0800"
  },
  "committer": {
    "name": "Copybara-Service",
    "email": "copybara-worker@google.com",
    "time": "Thu Feb 10 04:36:27 2022 -0800"
  },
  "message": "[demangler] Fix new/delete demangling\n\nI discovered some demangler problems:\n\na) parsing of new expressions was broken, ignoring any \u0027gs\u0027 prefix\nb) (when #a is fixed) badly formatted global new expressions\nc) formatting of new and delete failed to correctly add whitespace\n\n(a) happens as parseExpr swallows the \u0027gs\u0027 prefix but doesn\u0027t pass it\n to \u0027parseNewExpr\u0027.  It seems simpler to me to just code the new\n expression parsing directly in parseExpr, as is done for delete\n expressions.\n\n(b) global new should be rendered something like \u0027::new T\u0027 not\n \u0027::operator new T\u0027\n\n(c) is resolved by being a bit more careful with whitespace.\n\nBest shown with some examples (don\u0027t worry that these symbols are for\nimpossible instantiations, that\u0027s not the point):\n\nOld behaviour:\nbuild/bin/llvm-cxxfilt _ZN2FnIXgsnw_iEEXna_ipiLi4EEEEEvv _ZN2FnIXnwLj4E_iEEXgsnaLj4E_ipiLi4EEEEEvv _ZN2FnIXgsdlLi4EEXdaLi4EEEEvv _ZN2FnIXdlLj4EEXgsdaLj4EEEEvv\nvoid Fn\u003cnew int, new[] int(4)\u003e()   // No ::new\nvoid Fn\u003cnew (4u)int, new[] (4u)int(4)\u003e() // No ::new, poor whitespace\nvoid Fn\u003c::delete4, delete[] 4\u003e()  // missing necessary space\nvoid Fn\u003cdelete4u, ::delete[] 4u\u003e() // missing necessary space\n\nNew behaviour:\nbuild/bin/llvm-cxxfilt _ZN2FnIXgsnw_iEEXna_ipiLi4EEEEEvv _ZN2FnIXnwLj4E_iEEXgsnaLj4E_ipiLi4EEEEEvv _ZN2FnIXgsdlLi4EEXdaLi4EEEEvv _ZN2FnIXdlLj4EEXgsdaLj4EEEEvv\nvoid Fn\u003c::new int, new[] int(4)\u003e()\nvoid Fn\u003cnew(4u) int, ::new[](4u) int(4)\u003e()\nvoid Fn\u003c::delete 4, delete[] 4\u003e()\nvoid Fn\u003cdelete 4u, ::delete[] 4u\u003e()\n\nBinutils\u0027 behaviour:\nc++filt _ZN2FnIXgsnw_iEEXna_ipiLi4EEEEEvv _ZN2FnIXnwLj4E_iEEXgsnaLj4E_ipiLi4EEEEEvv _ZN2FnIXgsdlLi4EEXdaLi4EEEEvv _ZN2FnIXdlLj4EEXgsdaLj4EEEEvv\nvoid Fn\u003c::new int, new int(4)\u003e()\nvoid Fn\u003cnew (4u) int, ::new (4u) int(4)\u003e()\nvoid Fn\u003c::delete (4), delete[] (4)\u003e()\nvoid Fn\u003cdelete (4u), ::delete[] (4u)\u003e()\n\nThe new and binutils demanglings are the same modulo some whitespace and optional parens.\n\nReviewed By: ChuanqiXu\n\nDifferential Revision: https://reviews.llvm.org/D118476\n\nGitOrigin-RevId: 9d283634f7be35f229e1ebe5f908c59352fe88c2\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "d79452e42ea293128b10ed61bd6c66a7a159771f",
      "old_mode": 33188,
      "old_path": "src/demangle/ItaniumDemangle.h",
      "new_id": "8d90a10aa446d6977aa9d6ce2397f687486c7454",
      "new_mode": 33188,
      "new_path": "src/demangle/ItaniumDemangle.h"
    },
    {
      "type": "modify",
      "old_id": "78289ffcfe2d326f348c456be8c433d0d66978f0",
      "old_mode": 33188,
      "old_path": "test/test_demangle.pass.cpp",
      "new_id": "5371f4bfc99157d818adc341ba69ca1c32b2759b",
      "new_mode": 33188,
      "new_path": "test/test_demangle.pass.cpp"
    }
  ]
}
