[Bug c++/99699] New: Type deduction failure for deducing a non-type template parameter via another deducible structural type (class template specialization) non-type template parameter

davveston at gmail dot com gcc-bugzilla@gcc.gnu.org
Sun Mar 21 18:14:32 GMT 2021


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

            Bug ID: 99699
           Summary: Type deduction failure for deducing a non-type
                    template parameter via another deducible structural
                    type (class template specialization) non-type template
                    parameter
           Product: gcc
           Version: 11.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: davveston at gmail dot com
  Target Milestone: ---

The following program:

// --------------------------------------------
template<int N>    struct S {};
template<S s>      struct U {};
template<typename> struct V { V() = delete; };

template <int N, S<N> s>
struct V<U<s>> {};

V<U<S<0>{}>> v{};  // #1
// Expected:   use partial specialization #1
// GCC actual: error (rejects-valid): use of deleted function

int main() {}
// --------------------------------------------

is rejected by gcc HEAD 11.0.1 20210320 (experimental) when compiling with 'g++
prog.cc -Wall -Wextra -std=c++2b', as #1 matches to the primary template
instead of the partial specialization.

It seems to find the non-type template parameter N non-deducible; however all
arguments of the partial specialization are arguably deducible from the
'U<S<0>{}>' argument to the primary template:

- 'A' / 'P' matching 'U<S<0>{}>' / 'U<s>' deduces 's' to 'S<0>{}' and its type
to 'S<0>',
- 'A' / 'P' matching 'S<0>' to 'S<N>' deduces 'N' to '0'; 'N' is particularly
not in a non-deduced context above, as it's not used in sub-expression in the
non-type template parameter 's' of the partial specialization.

Demo: https://wandbox.org/permlink/QQQxa3BhBTMM476E


More information about the Gcc-bugs mailing list