[Bug c++/85054] gcc8 fail to identify template redeclaration - problem in string header

redi at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Fri Mar 23 15:32:00 GMT 2018


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85054

Jonathan Wakely <redi at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2018-03-23
     Ever confirmed|0                           |1

--- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Confirmed. The problem was in <functional>, which was included by <string>, and
if GCC had caught it I wouldn't have committed the bug.

G++ does diagnose it if you try to use it:

struct Y { using type = int; };
X<Y, void> x;

I was initially surprised that the X<T, void_t<typename T::type>> partial
specialization isn't more specialized than the X<T, void> one, but it's not.
Given that, GCC should diagnose it.


FWIW the reduced example isn't very realistic, the real case used a default
argument:

template<typename ... > using void_t = void;
template<typename, typename = void> struct X;
template<typename T> struct X<T, void_t<typename T::type>> {};
template<typename T> struct X<T, void> {};

I expected the second partial specialization to be more specialized than the
first, and for it to be valid, just like the fixed code:

template<typename ... > using void_t = void;
template<typename, typename = void> struct X {};
template<typename T> struct X<T, void_t<typename T::type>> {};

Now when T::type is not valid we use the primary template to generate the
specialization X<T, void>, but when T::type is valid the partial specialization
is more specialized than the primary template.


More information about the Gcc-bugs mailing list