https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90338
Bug ID: 90338
Summary: member function pointer non-type template parameter
compile fail while matching
Product: gcc
Version: 9.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: patrick.a.moran at gmail dot com
Target Milestone: ---
Created attachment 46280
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=46280&action=edit
A reproduction of the issue described
The code in question compiled in 8.3.0, but fails in 9.1.0.
We have two template functions that each take one type template parameter and
one non-type template parameter. The first template function's non-type
template parameter is of a member function type, and the second template
function's non-type template parameter is it's type template parameter. (I
think this is clearer in the reproduction).
If you then call the first template function actually giving it a pointer to a
member function that exactly matches, but the class whose member function it is
is non-literal, you get a compile-failure (error below).
> repro.cpp:13:22: error: ‘B’ is not a valid type for a template non-type
> parameter because it is not literal
> 13 | match<B, &B::func>();
> | ^
> repro.cpp:1:8: note: ‘B’ is not literal because:
> 1 | struct B {
> | ^
> repro.cpp:1:8: note: ‘B’ is not an aggregate, does not have a trivial
> default constructor, and has no ‘constexpr’ constructor that is not a copy or
> move constructor
It appears that when it considers
template <class Any, Any Value>
void match();
as a match, it errors out based on the fact that you _couldn't_ pass your class
type as a non-type template parameter (even though you're making no attempt to
do so). If you make the class trivial so that this error doesn't happen, you
can see that it does choose the correct match().