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

    <tr>
        <th>Summary</th>
        <td>
            [C++20][Modules] Weird behavior on std::tuple_element & co. reexport
        </td>
    </tr>

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

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

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

<pre>
    With the following code,
```cpp
module;

#include <utility>

export module test;

export namespace exported {

using ::std::tuple_element;
using ::std::tuple_size;
using ::std::integral_constant;

}
```
```cpp
#include <cstdint>

import test;

struct Foo {
    template<std::size_t i>
    int get() { return 0; }
};

template<>
struct exported::tuple_size<Foo> : exported::integral_constant<std::size_t, 1> {};

template<>
struct exported::tuple_element<0, Foo> { using type = int; };

void foo() {
 auto [a] = Foo{};
}
```
Clang produces the following diagnostic:
```
consumer.cpp:17:10: error: type 'Foo' decomposes into 0 elements, but 1 name was provided
   17 |     auto [a] = Foo{};
      | ^
1 error generated.
```
as if it doesn't see `tuple_size` specialization. Note that the diagnostic goes away if I add
```cpp
namespace std {

export using ::std::tuple_element;
export using ::std::tuple_size;

}
```
to the module file. I'm not sure if this code is actually UB-free according to standard but the current Clang behavior is definitely very confusing.

CE: https://godbolt.org/z/rKxYjrn11
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJycVU2L4zgQ_TXKpeggS3E8OfiQjw4My-5lWYY9NYpUdjTIkpHK6Un_-kW2u9NfzCwDITFRVem9V6_KKiXbesSalTtWHhZqoHOI9UH5v8_KYEyLUzDX-pulM9AZoQnOhUfrW9DBIBN7xrdszaeP7nvGt10wg0Mmd_mIb5mQ1ms3GAQm9wNZZ-nK5P10ij_6EAmmHCBM9JI4H3nVYeqVRpj-QAOsmkOGlJEwuWVym8hMDzT0Dh_QYYd-rvaTuGSf8CdB1hO2UbkHHXwi5W_wWHV4zf2jDm-J60TG5vSZuO1Gdm8YJ4qDJjiGMFMEACDseqcImdy_oMqgHwjsVC1HWU_QIjHxhYlNzoaINEQPnMkdzFirw8tVr6pORea7nzX-KNH-GAKT91mgd1GfaPQeKhN7KMbsave7MF46uue53DOcagdT5-jaZ6UPMMo8kX6-5xKsgSaEmz5ZNzVQAFbuFCsPY2au-RrghxbvnfIt9DGYQWN6NxHGqtaHRFZn2G8TszRDh3GZvSG3RZW_-KhljCHmhwm_qDIIUYFBHbo-JEyZUAAOswApsz8NBMU4G_CoUkZ0sQbN5IaiAlbtsy1-SXEMGqNZmfUvJjzQoseoCM3yHRGVwDZgCUzA5JmoCBIisDV_ZZY1h9SjtsrZJ0U2-CX8FQiBzopG0W5SQRswgXpU11z3KyhjPo7SbQckejX-84b4v1vg1-G3ZfBp9ymM4Odl1ViHS_jKRNWBDwRpiJg50NmmcTuCTaA0Dcq5K_yzu2siIiitQzSjXwPkaTEqmrGdubQeYkRPMPnshGd1sSHmQgYb6y2hu8IF4xV08M3IZDmh3d9nD52J-pQZiSMTxzaYU3C0DLFl4vjExDH-8ePf79EXxcLU0mzkRi2wLqpVIfnqy3q1ONcrxbkutF6pasWrtW5MKflGKizXjW5ktbC14KLkkq-FXFWr1bKpCrkpTyeuZbWRomArjp2ybuncpct3L2xKA9aF5IKXC6dO6NL4vhHC4yOMp0yI_PqJdU66Ow1tYivubKJ0K0OW3Pii2jOxY2InOCsPrNz9OfYjZYd_Q5vVfNYtePjcEMDEGnRYQsTJFYshuvqdepbOw2mpQ8fEMYOYf-76GL6jJiaOI_TExHHmdqnFfwEAAP__o_s_ow">