<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/56555>56555</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [MLIR] `OpTraitList` should be reflected on the C++ side
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            mlir:core
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          teqdruid
      </td>
    </tr>
</table>

<pre>
    Currently `OpTraitList` only affects ODS with no effect on the generated C++ code. Ideally, this would be reflected on the C++ side so users can pass around a named `OpTraitList` just like any other `OpInterface`. For example, CIRCT has an `HWModuleLike` interface and we recently added an `HWMutableModuleLike` interface. The latter is logically a superset of the formers', but there's not a way to have `HWMutableModuleLike` "inherent" the methods from `HWModuleLike` so we've got to cast in a number of places.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyNUstu2zAQ_Brpsqgg0ZIVH3RoHBg14CBAaqBnUlxJTClS5SOu_75LpW4PTYsCBKR9zOzskMLKa7ePzqEJ-grZtnxazo6rcFI-UATWUJoPA_bBw9PDZ7ioMIGxgGuO6hAmhBENOh5Qwj5j93SgtxILOErkWl8ztqc25eFio5YgEBwOmvAE-Mlww3klEbyF6NF56LmBhXsP3NloJHAwfCbQn0Jfog-g1VcEbq5gidK9dR1NQDfwHikq4GAd4Hc-LxqTqP3xeX-GidMAk9o_fXm0Mmo8EVFiVTcw1SVcku7-zSouJen4hYqBC41_ARdwpg01DxQDuaDtqPrkC-3j40KLIjk5rD4M1s2UyFib9IkYUtaR2NaT7YEQF36FYEn0K_5jeMaYMglpAv2u1DOGyUoPg7Pze8uS65c0iHhHmkQzek6mKpNsj7Mg8SRy0bSRL3LZbeRus-N5UEFjlzX3j6fjc9Y8vHM5fvqve8-j090UwuKzzceMHeiM9NyiKHo7U6D16-3zYXH2hYgoVN5HJMMOzbZpmnzqatFv6k1Ti6HuBXLctduqLu_qLZeMtVWday5Q-ySZrJm1cjSut8lkRvpz1bGSsbKtmmrH7qq2ENWuF2XblrJCXg8sq0ucudJFUlJYN-auW0WJOHoqalrb_y7S-1WjwdWjxM8j3YPrAn6TLiqZrwt0q_of8tYtqQ">