https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121297
Bug ID: 121297
Summary: Gcc fails to compile code where scalar types for
non-type template parameters have virtual functions
Product: gcc
Version: 16.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: familiebaumanns at gmail dot com
Target Milestone: ---
Gcc fails to compile if the type of a non-type template parameter has virtual
functions (see: https://godbolt.org/z/rGdExEb7h):
```c++
class Foo{
virtual void Bar(){
}
};
template<Foo foo>
void XXX(){
}
int main(){
constexpr static auto foo = Foo();
XXX<foo>();
return 0;
}
```
Error message:
```
<source>: In function 'int main()':
<source>:13:13: error: no matching function for call to 'XXX<foo>()'
13 | XXX<foo>();
| ~~~~~~~~^~
<source>:13:13: note: there is 1 candidate
<source>:7:6: note: candidate 1: 'template<Foo foo> void XXX()'
7 | void XXX(){
| ^~~
<source>:7:6: note: template argument deduction/substitution failed:
<source>:13:13: error: '((& Foo::_ZTV3Foo) + 16)' is not a valid template
argument for 'int (**)(...)' because it is not the address of a variable
13 | XXX<foo>();
| ~~~~~~~~^~
Compiler returned: 1
```
See stackoverflow:
https://stackoverflow.com/questions/79717935/are-virtual-functions-allowed-for-scalar-types-used-as-non-type-template-argum/79718208#79718208