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

    <tr>
        <th>Summary</th>
        <td>
            [Clang] [C++20] regression in Clang 16
        </td>
    </tr>

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

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

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

<pre>
    Hi, I believe I encountered a regression with Clang 16 and Boost: https://godbolt.org/z/nzePcnGjj
Clang 15 with `--std=c++20` compiles this code fine, Clang 16 with `--std=c++17` works fine too but Clang 16 with `--std=c++20` reports ambiguous symbol in a place where I can't see any ambiguity:
```
/opt/compiler-explorer/libs/boost_1_81_0/boost/beast/ssl/ssl_stream.hpp:679:5: note: candidate function [with AsyncStream = boost::beast::basic_stream<boost::asio::ip::tcp>, TeardownHandler = boost::beast::websocket::stream<boost::beast::ssl_stream<boost::beast::basic_stream<boost::asio::ip::tcp>>>::read_some_op<boost::beast::websocket::stream<boost::beast::ssl_stream<boost::beast::basic_stream<boost::asio::ip::tcp>>>::read_op<(lambda at <source>:19:29), boost::beast::basic_flat_buffer<std::allocator<char>>>, boost::asio::mutable_buffer>]
    async_teardown(
 ^
/opt/compiler-explorer/libs/boost_1_81_0/boost/beast/ssl/ssl_stream.hpp:702:1: note: candidate function [with AsyncStream = boost::beast::basic_stream<boost::asio::ip::tcp>, TeardownHandler = boost::beast::websocket::stream<boost::beast::ssl_stream<boost::beast::basic_stream<boost::asio::ip::tcp>>>::read_some_op<boost::beast::websocket::stream<boost::beast::ssl_stream<boost::beast::basic_stream<boost::asio::ip::tcp>>>::read_op<(lambda at <source>:19:29), boost::beast::basic_flat_buffer<std::allocator<char>>>, boost::asio::mutable_buffer>]
async_teardown(
^
```
in [source code](https://github.com/boostorg/beast/blob/boost-1.81.0/include/boost/beast/ssl/ssl_stream.hpp#L676) looks like this:
```
    676     template<class AsyncStream, BOOST_BEAST_ASYNC_TPARAM1 TeardownHandler>
    677     friend
    678 void
    679     async_teardown(
    680 boost::beast::role_type role,
    681         ssl_stream<AsyncStream>& stream,
    682         TeardownHandler&& handler);

    701 void
    702 async_teardown(
    703     boost::beast::role_type role,
    704     ssl_stream<AsyncStream>& stream,
    705 TeardownHandler&& handler = net::default_completion_token_t<beast::executor_type<AsyncStream>>{})
 706 {
    707     // Just forward it to the underlying ssl::stream
 708     using boost::beast::websocket::async_teardown;
    709 async_teardown(role, *stream.p_,
    710 std::forward<TeardownHandler>(handler));
    711 }
```
So the first one is declaration but Clang treats it as implementation?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsV01v2zgT_jX0ZRCDIm3JOvjgj_htX-xui00uexIocWyzoUmBpOK6v35BSbbltMl2CyzQQwMhFCnO8JmPZ8YU3qudQZyT6ZJM1yPRhL1182eFJoxKK0_zd4qwFbyHErXCZ4T3gKayjQnoUIIAhzuH3itr4KjCHlZamB0kKQgjYWmtD4QvYB9C7QlfELYhbLOzsrQ6jK3bEbb5QtjGfMGPlfnfp0-Ergld9EqmnUqS0rs7HyTh64qwJWFLRklKobKHWmn0EPbKQ2UlwlYZjHgvKF5RkGRRwdG6J9_KQLAWyib8o2B3ssPauuBBHEq1a2zjwZ8OpdWgDAiotagQjnt00V2VMIRlATwiCHPqZVQ4RXe01pKU9k83ZRtbB8I2vX3uDj_X2jp0hG20Kj1hmzI6tkiKWVLQ8zSOKNrRe939L3xwKA7jfV0TvkiznPDFNAbE2IBxrISRSoqAsG1MFWIYyXTZGr_wJ1M9tPJA-BrKPpiEL7pzulfhVdUfQ_hqsEl4Zbs3VXdjqGrC72N8HlE4aY_mnTBSo3tD_xFLb6sn7KffOmiw-2ryq1t-AHD_xBWHQhbeHrCw9atH_IyYW7iEzbQ4lFKACED4ytvGVdhtTGJusJzEZ_VmsLdahKJstlt0UUekRwtFa1uJYONitRfuiuJW3xXyoQmi1HjRdU-m644DAAAi5l8R-kwhbNZ_ItP7_5ooGWXRI7-I8osoPzlRXiHJlSO3vUW1WdtZ03bMqIjNXrRnFfZNOa7s4cyYrlGfSVNqW56_3CXjWTKO1FKm0o3E7yUZ47-lWUpYDtraJw9aPWHbyF9ri7EkpFkaBwh4qLWIxFxVWng_pGB04vLDh4fHYnm_eHgsFg9__bEqHj8u_lz8nrzkU3TlQHvWat86hUYO12fwbNXNSg5vlai4ZUZfyQ1nNRbhVCPEN8JWQ6EEzn832T60L-ZJCv5s7FCaXaRf2snSKLQ_z3LCl72XL-IZTV6YmVH2lokZ5e1Z_9rMjE5-0MSMTt82rS2Q5lxQJG5Fo0MRG4TGWLSLYJ_QFCEWhytW_IxVE6xr8X6Nhd-TbEmydfRbByWjKcS1AbAudzoGwf8bH2Br3VE4CSpAsBD2CI2R6PRJmV20_abonfXOWjWNj3u-q2i-CBC_AZV_Hb8-GkBYf_S4Lm59nFC41KreBsJX32AOmw0SapBTnZYEosu-ReWHzhtb5XwAaxCUB4mVFk60jfX6QzwCDD56UHhQMYgHNKHdRfhmJOdc5jwXI5wnaZZOaMJ4PtrPBSKbSEmlnJWYlZwnMykyMZmkjGLJ-UjNGWWcsmSS5JTyfDxNk21epjjFXG4nNCcTigeh9Fjr50O8qIyU9w3OU5pN8pEWJWrfXpoYM3iE9iNhLN6h3DzK3JXNzpMJ1coHf9USVNDtbau1j0zXsR6vLneL6Xp4oVLmch8ZNU7P3yjT8YB-uKud_YRVrLwtrPgzqIX9dwAAAP__SV1D0A">