<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">