https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66184
Bug ID: 66184 Summary: Rejection of partial specialization of a variable template in a non-global namespace Product: gcc Version: 6.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: Casey at Carter dot net Target Milestone: --- Created attachment 35558 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=35558&action=edit testcase.cpp Both 5.1.0 on Wandbox and 6.0 r223061 reject this program: namespace foo { template <class, class> constexpr bool same = false; template <> constexpr bool same<void,void> = true; template <class T> constexpr bool same<T,T> = true; static_assert(same<int*,int*>, ""); static_assert(!same<int,int*>, ""); } int main() {} with error message: bug2.cpp:4:35: error: specialization of ‘template<class, class> constexpr const bool foo::same< <template-parameter-1-1>, <template-parameter-1-2> >’ in different namespace [-fpermissive] template <class T> constexpr bool same<T,T> = true; ^ bug2.cpp:2:40: error: from definition of ‘template<class, class> constexpr const bool foo::same< <template-parameter-1-1>, <template-parameter-1-2> >’ [-fpermissive] template <class, class> constexpr bool same = false; ^ The full specialization of same<void,void> is accepted regardless of namespace. Both versions compile the program correctly if "same" is in the global namespace.