https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117052
Bug ID: 117052
Summary: GCC accepts declaring an instantiation of member
template in the wrong scope
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: thiago at kde dot org
Target Milestone: ---
This should not compile:
struct Base { template <typename T> static void f(); };
struct Derived : public Base {};
template <> void Derived::f<int>() {}
Clang rejects it. MSVC incorrectly accepts it too. See
https://conformance.godbolt.org/z/TEornTf5o.
GCC correctly rejects it if the function is either non-static or non-template.
error: template-id 'f<int>' for 'void Derived::f()' does not match any template
declaration
Found this by accident, trying to understand why some variables and types that
should have been in Derived's scope weren't being found in the definition of
the function.