https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115665
Bug ID: 115665
Summary: gcc complains about bad CTAD that actually does not
exist in template derived class with default argument
Product: gcc
Version: 13.2.0
Status: UNCONFIRMED
Keywords: rejects-valid
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: rush102333 at gmail dot com
Target Milestone: ---
The following code triggers a compilation failure in gcc-13.2:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
struct B{
B(int){}
};
template <typename=int>struct D:B {
using B::B;
/*this is OK*/
//D(int m):B(m){}
};
D d(0);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The compiler outputs the following error message that is somewhat puzzling:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<source>:8:6: error: class template argument deduction failed:
8 | D d(0);
| ^
<source>:8:6: error: no matching function for call to 'D(int)'
<source>:4:31: note: candidate: 'template<class> D()-> D<
<template-parameter-1-1> >'
4 | template <typename=int>struct D:B {
| ^
<source>:4:31: note: candidate expects 0 arguments, 1 provided
<source>:4:31: note: candidate: 'template<class> D(D< <template-parameter-1-1>
>)-> D< <template-parameter-1-1> >'
<source>:4:31: note: template argument deduction/substitution failed:
<source>:8:6: note: mismatched types 'D< <template-parameter-1-1> >' and
'int'
8 | D d(0);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
It seems that there is no need for a class template argument deduction in the
instantiation of "D d(0)", because class "D" already has a default template
argument value. It's also worth noting that when we replace the expression
"using B::B;" in line 5 with a semantic equivalence form "D(int m):B(m){}" in
line 7, the code does compile.
Clang also accepts this code. That makes us believe that there may be a bug in
GCC.
Please check https://godbolt.org/z/TMT9Yhqz1.