<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/65039>65039</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Cannot use pointer to member function of derived class as non-type template parameter
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
LevivrIMC
</td>
</tr>
</table>
<pre>
The minimal example that reproduces the error:
```c++
struct Base {
void fn();
};
struct Derived : Base {};
template<auto>
void template_value();
int main() {
constexpr void (Derived::*mem_ptr)() = &Derived::fn;
template_value<mem_ptr>();
}
```
Gives the following error:
```
<source>:12:5: error: no matching function for call to 'template_value'
12 | template_value<mem_ptr>();
| ^~~~~~~~~~~~~~~~~~~~~~~
<source>:8:6: note: candidate template ignored: invalid explicitly-specified argument for 1st template parameter
8 | void template_value();
| ^
1 error generated.
Compiler returned: 1
```
([compiler explorer link](https://godbolt.org/z/f89GY7ohh))
However, this looks like perfectly valid code. Using a similar `mem_ptr` is a different compile-time context works fine:
```c++
struct Base {
constexpr void fn() {}
};
struct Derived : Base {};
consteval int call_fn() {
constexpr void (Derived::*mem_ptr)() = &Derived::fn;
Derived d;
(d.*mem_ptr)();
return 0;
}
int main() {
return call_fn();
}
```
([compiler explorer link](https://godbolt.org/z/5dnK69j8P))
Using clang 18.0.0
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVc1u6zYTfRp6M7AhkZZMLbRw7Ph-H9oCXbSLrgKaHFm8oUiBpJSkiz57oR_HsWP0FkgFQZbHnJkzZ2aORQj6ZBFLkj2QbL8QXaydL3_GXvf-_7_sFken3srfaoRGW90IA_gqmtYgxFpE8Nh6pzqJAWKNgN47T9iWJHuSnJ95Mt2S0IfhHq0h-k5GeBABgWxmI_ROK6gsoZzQgrDZTDb7y_tH7z163aMCwraXSJ8OR2xaIyISthNddIQ9TvYx2fnHp16YDm8Tj09tIzRCz6g-oJXOhoivrZ9wE8pnQAMDbEvotsHmqY1-iDk7sz0Qml-dq-x7wls4bHeOwB7vkHLN7_T1m-7nZlTOGPei7em2LdcOhO2C67zEIQfbppSwbTYwevYC66ARUdZDqKqzMmpnoXIepDAGogNCN7c8buaCAFIKZLOD4fr31Y3HRz-SPf5197qLnhO2zSfMQ8O3IIVVWomI78lBn6zzI_mgbS-MVoCvrdFSR_O2DC1KXWlUIPypa9DGsdQ0xEuEVnjRYER_ActHsD8eqUth00s2D2M60Q0ntOhFRLWa7DvXtNqgB4-x83aCnd5vJOUke5Bnh6Em59GD0faZZHtCeR1jG8bJPBB6ODl1dCaunD8ReviT0EPFi29_bFxdjwNbfFyC_7kX7NETuoNY6wDGuecARj8jtOgrlNG8wUSmdApX8HsYxkVA0I02wgPJk3O38wR0AAFKVxX6geEZ9DLqBoe1ivga4cX55wCVtvgFRQG4XdPq4yK_L9HXJGZK0QsDg1gMa_FUfdaLz1j-C8kAeAeprqyEcrW6E_Hq0DRWkNzRlX8Wv9nxqtYfitPXRzRT9qe8-M5__Tyi08RJI-wJUr5KVslClUwVrBALLNO8YJSmnGeLusyzNS9UlqwrSeWRb1SaFJtKKi4KyhPGF7qkCWUJpzxN6XqdrtayoEwmaZYXVDFRkXWCjdBmZUzfDPgWOoQOyzxLWLEw4ogmnP9TfTkcWh67UyDrxOgQw8Ut6miw3AlrXYQuILRO24h-0NUGmyP6i-a6CtTcamlECCACWGeX8a3FO-q06LwpbwjVse6OK-kaQg8Dhvlj2Xr3HWUk9DDWEQg9jKX8HQAA__9f22n7">