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

            Bug ID: 114884
           Summary: GCC rejects valid deduction using deduction guide
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jlame646 at gmail dot com
  Target Milestone: ---

The following valid program afaik is rejected by gcc but accepted by clang and
msvc: https://godbolt.org/z/85sjenzrn

```
#include <cassert>
#include <iostream>
#include <array>
#include <vector>
#include <concepts>
#include <type_traits>

template<typename C>
class Vec
{
    C elems;
public:

    Vec(const std::initializer_list<C>& init)
    {

    }

};
template<typename T> Vec(const std::initializer_list<T>& vec) ->
Vec<std::array<T, vec.size()>>;
template<typename C>
Vec(C) -> Vec<C>;

int main()
{
    Vec v0({1, 4, 7});
}
```

GCC says

```
<source>:20:93: error: template argument 2 is invalid
   20 | template<typename T> Vec(const std::initializer_list<T>& vec) ->
Vec<std::array<T, vec.size()>>;
      |                                                                        
                    ^
<source>:20:94: error: template argument 2 is invalid
   20 | template<typename T> Vec(const std::initializer_list<T>& vec) ->
Vec<std::array<T, vec.size()>>;
      |                                                                        
                     ^~
<source>:20:94: error: template argument 2 is invalid
<source>:20:94: error: template argument 2 is invalid
<source>:20:70: error: invalid template-id
   20 | template<typename T> Vec(const std::initializer_list<T>& vec) ->
Vec<std::array<T, vec.size()>>;
      |                                                                     
^~~
<source>:20:75: error: template argument 1 is invalid
   20 | template<typename T> Vec(const std::initializer_list<T>& vec) ->
Vec<std::array<T, vec.size()>>;
      |                                                                        
  ^~~~~
<source>:20:75: error: template argument 1 is invalid
<source>:20:75: error: template argument 1 is invalid
<source>:20:75: error: template argument 1 is invalid
<source>:20:66: error: invalid template-id
   20 | template<typename T> Vec(const std::initializer_list<T>& vec) ->
Vec<std::array<T, vec.size()>>;
      |                                                                  ^~~
<source>:20:96: error: missing template arguments before ';' token
   20 | template<typename T> Vec(const std::initializer_list<T>& vec) ->
Vec<std::array<T, vec.size()>>;
      |                                                                        
                       ^
<source>:20:96: error: expected '>' before ';' token
<source>:20:96: error: trailing return type 'Vec<...auto...>' of deduction
guide is not a specialization of 'Vec<C>'
<source>: In function 'int main()':
<source>:26:9: error: 'Vec<...auto...> v0' has incomplete type
   26 |     Vec v0({1, 4, 7});
      |         ^~
Compiler returned: 1
```

Reply via email to