[Bug c/85054] New: gcc8 fail to identify template redeclaration - problem in string header
mib.bugzilla at gmail dot com
gcc-bugzilla@gcc.gnu.org
Fri Mar 23 13:55:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85054
Bug ID: 85054
Summary: gcc8 fail to identify template redeclaration - problem
in string header
Product: gcc
Version: 8.0.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: mib.bugzilla at gmail dot com
Target Milestone: ---
The Intel compiler and clang compiler finds an error in gcc8 string header [now
fixed] which gcc didn't find. I opened a bug report at llvm and Richard Smith
provided this analysis of the issue:
This is CWG issue 1980 (wg21.link/cwg1980, which is still open at the time of
writing).
Further reduced and cleaned up:
template<typename ... > using void_t = void;
template<typename, typename> struct X;
template<typename T> struct X<T, void_t<typename T::type>> {};
template<typename T> struct X<T, void> {};
Same question as applied to function template overloads:
template<typename T> void f(X<T, void_t<typename T::type>>) {}
template<typename T> void f(X<T, void>) {}
[temp.alias]p2 says:
"When a template-id refers to the specialization of an alias template, it is
equivalent to the associated type obtained by substitution of its
template-arguments for the template-parameters in the type-id of the alias
template."
Now, "equivalent" here means equivalent in the [temp.over.link] sense -- in
particular, it is intended that you can redeclare function templates with and
without manually expanding alias templates that they name. Which means the two
function templates, and the two partial specializations, are equivalent (but,
oddly, not functionally-equivalent).
Since they're equivalent, they're redeclarations, at least in today's standard
wording.
https://bugs.llvm.org/show_bug.cgi?id=36869
--Melanie Blower (I work for Intel on the Intel C++ compiler)
More information about the Gcc-bugs
mailing list