[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