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

    <tr>
        <th>Summary</th>
        <td>
            MSVC permits type aliases in elaborated-type-specifier
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    As far as I can understand (draft of) C++ standard, [elaborated-type-specifier](https://eel.is/c++draft/dcl.type.elab#nt:elaborated-type-specifier) prohibits usage of type aliases:
> If the [identifier](https://eel.is/c++draft/lex.name#nt:identifier) or [simple-template-id](https://eel.is/c++draft/temp.names#nt:simple-template-id) resolves to a [typedef-name](https://eel.is/c++draft/dcl.typedef#nt:typedef-name) ([[dcl.typedef]](https://eel.is/c++draft/dcl.typedef), [[temp.names]](https://eel.is/c++draft/temp.names)), the [elaborated-type-specifier](https://eel.is/c++draft/dcl.type.elab#nt:elaborated-type-specifier) is ill-formed[.](https://eel.is/c++draft/dcl.type.elab#5.sentence-3)

So the following code is ill-formed:
```cpp
struct X {};
struct Y {
    using Z = X;
    friend struct Z;
    friend class Z;
    struct Z;
    class Z;
    enum Z;
};
```

However, MSVC accepts it 🤷‍♂️. Compiler explorer example: ([link](https://godbolt.org/z/vjWd1cn6K))

Context: Boost 1.68 has the following code, which cannot be compiled using `clang-cl`
```cpp
#if defined(BOOST_MSVC)
/*===========================================================================*/
#define BOOST_BIMAP_MAP_VIEW_BASE_FRIEND(TYPE,TAG,BIMAP)                      \
    typedef ::boost::bimaps::detail::map_view_base<                           \
        TYPE<TAG,BIMAP>,TAG,BIMAP > friend_map_view_base;                     \
    friend class friend_map_view_base;
/*===========================================================================*/
#else
/*===========================================================================*/
#define BOOST_BIMAP_MAP_VIEW_BASE_FRIEND(TYPE,TAG,BIMAP)                      \
    friend class ::boost::bimaps::detail::map_view_base<                      \
        TYPE<TAG,BIMAP>,TAG,BIMAP >;
/*===========================================================================*/
#endif
```

Upstream bug-report to MSVC team: https://developercommunity.visualstudio.com/t/elaborated-type-specifier-permits-type-a/10388512
Related issue: #29595

---

I suppose supporting ridiculous code with different tags is unacceptable even in MSVC-compatible mode:
```cpp
    friend class Z;
    struct Z;
    class Z;
    enum Z;
```

However... Is it okay for MSVC-compatible mode to support syntax, which _seems_ valid:
```cpp
struct X {};
struct Y {
    using Z = X;
    friend struct Z;
};
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzkV91u2zgTfRr6ZiBBJi3HuvCF5Z_vMxbdFkm3fzcGJY5sthQpkJST7NMvKCmNnTpdtLtFga3hxDJFzZyZOeM55M7JvUackzQn6WrEW38wdn69deX1tvGjwoj7-cJBxS1wB1souYZWC7TOcy2A0JmwvPJgKkIzWBKaE5pDd5NbQegSSJqj4oWx3KOI_H2DkWuwlJVES9IVobOD940jbEHohtANooqlI3RT9sY6-4RuRKni8HQcrBHKtCds8bxlmkFjzUEW0jtoHd8jmArCJuBKcoedx2RFkgVha9hW4A8YwEqB2n8zOoV3seY1PgA7sUIzMDZYdrJuFEYe60Zxj5EU3-IhPNa5cA8-LtijGVh0Rh3RgTfAg9sQs8Aq6uB9R8IFVg8ez0zRLJS_I05-ujddfbeXbCBMQP0Y7rcZPM1TNpgcSvuTeCgdSKWiytgaBUnz-J-4S2OH2qMuMWIhup7B3f8b0wVaGaXMrdR7KI3AJ94_c36a9O-yafoV521bengH5ConVyvC8rP19916twIA0Lrg4AMQtoJ3n_eGO5WVqAUMj324dK9U3Lknty7uv7QRdVufLJ1C_RzUaVb-b27xGAqxhBc3b5bAyxIb70B6IJuEZBuymJD8iqwpmSVktgoXWUZmlKw3JJ-R2SaGpakbqdAC3jXK2O6Ch-YjbDE0gZL606W67o0ojPKxsXtCN38Sujl-fCvGpZ7-NvDzBOvSaI93gVCQG-M8jOPpDA7cXShsCOj2IMtD-E3WxkOBUPY4xVCeUF7F9T4q1WNSvig8oUxWILCSGgWhs_zly5vXu5CrR3QhlAVhq__4m3aRPmSlTwn0-ci3LxavduHvzXb9dpcvbta7zfV2_Xso-ev3r9aELl8v_kfostsZ-v7ii6TLRy4PP3wQ2MIWRSj5cClr3pOILQR6LlV_XfNmd5R4uyu4Q8KWl3186Si8OpDsDCR7ghrCKOybdPfEVf73Ts66-xkrvzKfUDn8leP_8f10xsB_uam-t59-ddJrIauvjOc_Guct8hqKdh9ZbIz1Qbl2o9ojr8MsPJ-oAo-oTIO2NHXdaunv46N0LVfOt0KauDR1kIFBUz2nyqIGbS2965c5oZtxwmazdEx7UNcYBLUA6Vw7zHhGszRLT5FHUXT6dQuubRrjsP-0PkxgK4UsW2Va14uxW-kPIGRVoUXtwfO9CwKt1b0q4YVCwCNqkLpLQRQmOvcyrNdh6D-v336UvvqKporjGLadkjKf-D1Uxl4EHeo55ATcvfb87lG77Bxi7XZw5Er-THV6UUaOxJyJjGV8hPPxdDZldJKxbHSYX5XjjE3oOBnj1bRgIpnSZJpOSjYpq-nkCkdyThPKkmmSjVOWsiwWlGdlMmVJOR6XBZ2SSYI1lypW6lgHcTjquDafMjq-GileoHLdoZxSjbcDESkNZ3Q7D89ERbt3ZJIo6bx7tOKlVzjvumfg-NmZN_Dq2a4YtVbNn6hX6Q9tMbRUcDJ8RI01H7EMTdZBCweXDvpfAQAA___F8ne8">