https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110674

            Bug ID: 110674
           Summary: Structured binding fails with partial specialization
                    of `std::tuple_element` without `std::size_t` NTTP
           Product: gcc
           Version: 14.0
            Status: UNCONFIRMED
          Keywords: rejects-valid
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: johelegp at gmail dot com
                CC: johelegp at gmail dot com
  Target Milestone: ---

See GCC trunk fail: <https://compiler-explorer.com/z/zevzr89e7>.
See GCC trunk pass: <https://compiler-explorer.com/z/j65vE3os9>.
See GCC 9.5 fail: <https://compiler-explorer.com/z/35fbexaEb>.
See GCC 9.5 pass: <https://compiler-explorer.com/z/5hEPzo7nn>.

```C++
#include <tuple>
#include <type_traits>
struct t { };
struct u {
  union { t a; };
  template<int I> t& get() { return a; }
};
template<> struct std::tuple_size<u> : std::integral_constant<int, 1> { };
template<int I> struct std::tuple_element<I, u> : std::type_identity<t> { };
int main() {
  auto [a] = u{};
}
```

```output
<source>: In function 'int main()':
<source>:11:9: error: invalid use of incomplete type 'struct
std::tuple_element<0, u>'
   11 |   auto [a] = u{};
      |         ^
In file included from
/opt/compiler-explorer/gcc-trunk-20230715/include/c++/14.0.0/bits/stl_pair.h:62,
                 from
/opt/compiler-explorer/gcc-trunk-20230715/include/c++/14.0.0/tuple:38,
                 from <source>:1:
/opt/compiler-explorer/gcc-trunk-20230715/include/c++/14.0.0/bits/utility.h:80:12:
note: declaration of 'struct std::tuple_element<0, u>'
   80 |     struct tuple_element;
      |            ^~~~~~~~~~~~~
<source>:11:9: note: in initialization of structured binding variable 'a'
   11 |   auto [a] = u{};
      |         ^
Compiler returned: 1
```

Reply via email to