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

    <tr>
        <th>Summary</th>
        <td>
            clang: compiler error when using inner-struct inside variant
        </td>
    </tr>

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

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

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

<pre>
    https://godbolt.org/z/eoe7EPo8G

this works:
```cpp
#include <variant>

struct B {
  int value{};
};

struct A {
  struct C {};
  using Choice = std::variant<B, C>;

  Choice value{};
};

int main() { A foo{}; }

```

this does not:
```cpp
#include <variant>

struct A {
  struct B {
    int value{};
  };
  struct C {};
  using Choice = std::variant<B, C>;

  Choice value{};
};

int main() { A foo{}; }

```

```sh
<source>:10:15: error: call to implicitly-deleted default constructor of 'A::Choice' (aka 'variant<A::B, A::C>')
  Choice value{};
              ^~
/opt/compiler-explorer/gcc-12.2.0/lib/gcc/x86_64-linux-gnu/12.2.0/../../../../include/c++/12.2.0/variant:1402:7: note: explicitly defaulted function was implicitly deleted here
      variant() = default;
      ^
/opt/compiler-explorer/gcc-12.2.0/lib/gcc/x86_64-linux-gnu/12.2.0/../../../../include/c++/12.2.0/variant:1338:7: note: default constructor of 'variant<A::B, A::C>' is implicitly deleted because base class '_Enable_default_constructor<__detail::__variant::_Traits<B, C>::_S_default_ctor, variant<A::B, A::C>>' has a deleted default constructor
      private _Enable_default_constructor<
      ^
/opt/compiler-explorer/gcc-12.2.0/lib/gcc/x86_64-linux-gnu/12.2.0/../../../../include/c++/12.2.0/bits/enable_special_members.h:113:15: note: '_Enable_default_constructor' has been explicitly marked deleted here
    constexpr _Enable_default_constructor() noexcept = delete;
              ^
1 error generated.
ASM generation compiler returned: 1
<source>:10:15: error: call to implicitly-deleted default constructor of 'A::Choice' (aka 'variant<A::B, A::C>')
  Choice value{};
              ^~
/opt/compiler-explorer/gcc-12.2.0/lib/gcc/x86_64-linux-gnu/12.2.0/../../../../include/c++/12.2.0/variant:1402:7: note: explicitly defaulted function was implicitly deleted here
      variant() = default;
      ^
/opt/compiler-explorer/gcc-12.2.0/lib/gcc/x86_64-linux-gnu/12.2.0/../../../../include/c++/12.2.0/variant:1338:7: note: default constructor of 'variant<A::B, A::C>' is implicitly deleted because base class '_Enable_default_constructor<__detail::__variant::_Traits<B, C>::_S_default_ctor, variant<A::B, A::C>>' has a deleted default constructor
      private _Enable_default_constructor<
      ^
/opt/compiler-explorer/gcc-12.2.0/lib/gcc/x86_64-linux-gnu/12.2.0/../../../../include/c++/12.2.0/bits/enable_special_members.h:113:15: note: '_Enable_default_constructor' has been explicitly marked deleted here
    constexpr _Enable_default_constructor() noexcept = delete;
              ^
1 error generated.
Execution build compiler returned: 1
```

`clang++ -std=c++20 -E`: [repro.cpp.tar.gz](https://github.com/llvm/llvm-project/files/10092794/repro.cpp.tar.gz)

with `-std=libc++`, it works. but with `-std=stdlibc++` it does not.
But I do not see how a library implementation can see the difference between an inner class and a non-inner-class.

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztWEuP4jgQ_jXhYhElDhBy4MBrRnNYaaXZO3KSgnjb2JHtNPT8-i3bCQ39PqxWoxUoOE7ZVf781SOYUtVPi8ba1kTZMqLf8DqoulTCxkof8OkXfkFBvv1Tzb9HySZKlqG1DTfkpPSD1wwDsyRcVdv2EppxWYmuBhJl60emOZM2yrbXhozVXWXJikT5KkgI4dKSRyY6cLJ8E2X9yE3_Wnt5rd3L1uSFNiGd4fJA1o3ilUO0wam1g58tL9jWq4iuydqBvF2JDHpfA-a2cGRcRnQe0cJBQZB7pS6KxN2uFC7svWK5VmCIVPbfIfotqm7If59-Qm6f_kdEX4Sm6QXZ2qhOV-ABLtPENVNsCGittOtUTAhiFeHHVvCKW_E0rkGAhZrUsGedsKRSMpCkNFF7EtF8GWgIW8RnlM3ZA3NDz9T0kzxDg4LDQXPc4hdYIjefaLqN8iEU6DfVWmwrdWy5AD2GcyuUBu1Sv6rGKY1pnOCD4GUQYXuez3azyVhw2Z3HB9mh6DIvjl83fSy6ZSK68tezwmWby3SSULzljkyMb_DsngcyBxKRzn0nK8uVJCdmrugmA90NaLje-bBEHxIYf72tFww5Zn5DWrJs_pKW9wPqK1FD-Ju0lVCxzgApGTaVYMY4g7utZKWAXb_k7mpJXGSHcsu4CPZ3u2fY7vEvzbg1t8ntB34-m3N2cPBz3AF6gy5n5IPEunZoq_kjs0A-3sPvGgKl4w7ftwG7aaHiTOyOcCxBm7hxoZFmlzo0hMYnLuspLAHkdXIdmX7wfL6VQV4fJ-sPiQzZJRWcK2htn2bO3Ad1yIvTUEPJASRodFcdB_ny5x-DzCX74AiiwXZagnuDkPRenu_l-V6e7-X5Xp7_6_K8PUPV-TwvOy7qj-vzOz-yMYzlIVBLxv5QsOmZpgkZb52C42y60tBqFeMBJ7ZMx4df0XSDO3pxVOW26coYcTi3i8fhNkbVv6Fy0bJHgM5paZIUNC8m2H1leajZoT2hUYI4enQYTUMoIDZMAW7DsTdGFrB7OxvbGwU3ezi-9SyuUOsHCp2IGADSqBNmEKpppp98HYAjSNu_A5n0k2wDpOb7PcaBxLdKCfbkIgZHuUQv9eWByRpNSSXHXjr20n7dESzS2azI8qKY5aN6kdVFVrCRxXCDRXCLe2kOPg0hcGpwkXCYCxb7Ix-XhtcwFIlRp8XLfxE-dw03pvO-mRZpMR81i3k1hbyEyXQyZftqks3mdFrQelKnZTIr6mIkWAnCLDA6IkolnIg3gX0MjhFf0ITSNKXTlGbo65jNAa3k-5Sl2MuraJIAHhRF7HC4vzdGeuEhld3B4KDgxprnQWSOHySAXw7ts842Si9Y7bbMj6WqQY48gIXfwD__Lhr9">