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

    <tr>
        <th>Summary</th>
        <td>
            noexcept(typeid(x)) incorrectly evaluates to false when x is an lvalue of a polymorphic type
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            c++,
            clang:frontend
      </td>
    </tr>

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

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

<pre>
    Consider the following code:

```C++
#include <typeinfo>

struct B { virtual void mf() {} };
struct D : B {};
D d, &r = d;

int main() {
    static_assert(noexcept(typeid(d)));
    static_assert(noexcept(typeid(r)));
}
```

Clang (recent trunk, version 16 under development) produces the following errors:
```
$ clang -std=c++17 test.cc
<source>:8:25: warning: expression with side effects has no effect in an unevaluated context [-Wunevaluated-expression]
        static_assert(noexcept(typeid(d)));
                               ^
<source>:8:2: error: static assertion failed due to requirement 'noexcept(typeid(d))'
        static_assert(noexcept(typeid(d)));
        ^             ~~~~~~~~~~~~~~~~~~~
<source>:9:28: warning: expression with side effects has no effect in an unevaluated context [-Wunevaluated-expression]
    static_assert(noexcept(typeid(r)));
                           ^
<source>:9:5: error: static assertion failed due to requirement 'noexcept(typeid(r))'
    static_assert(noexcept(typeid(r)));
    ^             ~~~~~~~~~~~~~~~~~~~
2 warnings and 2 errors generated.
Compiler returned: 1
```

According to C++17 [except.spec]/6, a typeid expression is potentially-throwing only if typeid is applied to a possibly parenthesized built-in unary * operator applied to a pointer to a polymorphic class type. I.e., FWIW, the code is well-formed.

GCC accepts the code without errors.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzFVd1u2zoMfhr7Rohhy_FPLnyRn_ZgT9DLQZHpRJsieZKcJufpR9rJknZdgdMVOIZsS6Io8uMnkVvbnpu1NV614FjYA-us1vZZmR2TtoUoX0bpJkqv3zKd2jriK2rTLM-VkXpogUX5Opx7UKazUf5wr-qDG2RgKxZVK3ZULgxCs6NVLTt0Ea8jviBJVG3wt4ny1QstnMyXk-69dMPaiK9ZxEuHC2h0lUxfZQI7CGXu9h_nGT4-iKDkV-E9uIALjIWThJ66IwLcucZ3cWn5f1R1v6uS5y-jeO_rWguMOWmCBPQbgZvvhO4IzitrWFaywRBLLRxB2_6AqwhV72w7SPCv2APnrPM3_l7Z5HMmR4szHzBsGzkRmlUsgA-JlJd1-drbwUkgNvNljS8viItn4QyaoS6cegd-9PFZhT2js8Sg60AGz_bCM2MvQ6YMEwZhwFHoQQRo8ZCZAKfAomI1e7oTzG67RsXmFvu_pO6dJyoe_ox5xEkRpc5kn032CXYnlEYs7QAsWObgx6AcED_IZ_Wud9WnIkMILyFVDx9sbwViQYGo_0_yP3jxPkA6YS0-mXT3Bul_geiTyeZXVj2y1DJ-SSBsBwYckZJc8pQ99AjcIeIwOAMtBSd7J7EtpbSupZSEYVr_SjPI-QQ18T1Iopk_lpTvBJuQ3x8t5VlvA8ZWCa3Ps7B3U5KzRp-Z6q4auEz0vVZIC9oSqIPqW1zSC4fKe_DqX5RtB6XDTNFZFO6MdC2Z7Qmkda_1sYJQXZwG-nywrt_jKcDU6f1oNWFfEkjI78enL0_0pzRMpZO8eQatZ511h1_hm77_rBGnJPT-tp7ujx3CJfBJDE1Wlmk2r7NsHrdN3i7yhYiDChqat87JaTokeM8w4FhFAgK_XilPGDqhPZrZg2GnMVaGaZIDs90rgLRpPDjd7EPoxyrCH7Ht0MVhm0h7wIHWx-tvhkXoG1rEofJ-AI-dokqLOt43ZT6f15znNcw7nCsFF3Up5pLLLBeV3MZabEH7Bg9ExPmlDmFvqux8rFLoQOcoWZiWJMUmVg1POU_rLM3KrMjypE23omuhFIu8mtdVF81TwNqvE_IvsW4Xu2Z0dTvsPAq18sHfhMin2hmA0Q3cXwxIhmsO6jx8V_EIqhkR_QSmI8NE">