)]}'
{
  "commit": "6740f0cc3bd1530e4aeefe856d9cfe5c0ba2098a",
  "tree": "479be063e13d06ad978b4c29772debda946c2d49",
  "parents": [
    "edd45eb06bfc4683922c6877589004632e6e6d29"
  ],
  "author": {
    "name": "Simon Marchi",
    "email": "simon.marchi@efficios.com",
    "time": "Tue Feb 18 17:29:23 2020 -0500"
  },
  "committer": {
    "name": "Simon Marchi",
    "email": "simon.marchi@efficios.com",
    "time": "Tue Feb 18 17:32:57 2020 -0500"
  },
  "message": "gdb: allow duplicate enumerators in flag enums\n\nI have come across some uses cases where it would be desirable to treat\nan enum that has duplicate values as a \"flag enum\".  For example, this\none here [1]:\n\n    enum membarrier_cmd {\n            MEMBARRIER_CMD_QUERY                                \u003d 0,\n            MEMBARRIER_CMD_GLOBAL                               \u003d (1 \u003c\u003c 0),\n            MEMBARRIER_CMD_GLOBAL_EXPEDITED                     \u003d (1 \u003c\u003c 1),\n            MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED            \u003d (1 \u003c\u003c 2),\n            MEMBARRIER_CMD_PRIVATE_EXPEDITED                    \u003d (1 \u003c\u003c 3),\n            MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED           \u003d (1 \u003c\u003c 4),\n            MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE          \u003d (1 \u003c\u003c 5),\n            MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE \u003d (1 \u003c\u003c 6),\n\n            /* Alias for header backward compatibility. */\n            MEMBARRIER_CMD_SHARED \u003d MEMBARRIER_CMD_GLOBAL,\n    };\n\nThe last enumerator is kept for backwards compatibility.  Without this\npatch, this enumeration wouldn\u0027t be considered a flag enum, because two\nenumerators collide.   With this patch, it would be considered a flag\nenum, and the value 3 would be printed as:\n\n  MEMBARRIER_CMD_GLOBAL | MEMBARRIER_CMD_GLOBAL_EXPEDITED\n\nAlthough if people prefer, we could display both MEMBARRIER_CMD_GLOBAL\nand MEMBARRIER_CMD_SHARED in the result.  It wouldn\u0027t be wrong, and\ncould perhaps be useful in case a bit may have multiple meanings\n(depending on some other bit value).\n\n[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/uapi/linux/membarrier.h?id\u003d0bf999f9c5e74c7ecf9dafb527146601e5c848b9#n125\n\ngdb/ChangeLog:\n\n\t* dwarf2/read.c (update_enumeration_type_from_children): Allow\n\tflag enums to contain duplicate enumerators.\n\t* valprint.c (generic_val_print_enum_1): Update comment.\n\ngdb/testsuite/ChangeLog:\n\n\t* gdb.base/printcmds.c (enum flag_enum): Add FE_TWO_LEGACY\n\tenumerator.\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "ca9f36474535fe1cbe6d27d3304d64497b1bc121",
      "old_mode": 33188,
      "old_path": "gdb/ChangeLog",
      "new_id": "6ea59592fac194329f6a67dfc8249db559f49d22",
      "new_mode": 33188,
      "new_path": "gdb/ChangeLog"
    },
    {
      "type": "modify",
      "old_id": "5a77b62b5a053ee73357e6c43c896453f4fdc419",
      "old_mode": 33188,
      "old_path": "gdb/dwarf2/read.c",
      "new_id": "ee220ab70b33f371a206b4ee841026f26c9ea4e3",
      "new_mode": 33188,
      "new_path": "gdb/dwarf2/read.c"
    },
    {
      "type": "modify",
      "old_id": "5aaf5feecdfee0e421bc3efafdb026d2c1c46d2e",
      "old_mode": 33188,
      "old_path": "gdb/testsuite/ChangeLog",
      "new_id": "4f63dde12a906c937631710acafd091e228a50a3",
      "new_mode": 33188,
      "new_path": "gdb/testsuite/ChangeLog"
    },
    {
      "type": "modify",
      "old_id": "acb3cb3ad25ea4802a5bdd2b4e2550ebbdcd2e49",
      "old_mode": 33188,
      "old_path": "gdb/testsuite/gdb.base/printcmds.c",
      "new_id": "ed1e26b12a9c8d3c925c8a334ca574bf1b7d02b3",
      "new_mode": 33188,
      "new_path": "gdb/testsuite/gdb.base/printcmds.c"
    },
    {
      "type": "modify",
      "old_id": "77b9a4993d79306b5fa5ba1367f4ee24445fc3b7",
      "old_mode": 33188,
      "old_path": "gdb/valprint.c",
      "new_id": "888c9cdb577820b124e58298ddc2978bdd5d0924",
      "new_mode": 33188,
      "new_path": "gdb/valprint.c"
    }
  ]
}
