https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98340
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |jakub at gcc dot gnu.org
--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
This boils down to:
template <typename T>
struct delete_ptr_hash
{
};
template <typename T>
struct hash_table
{
};
template <typename T>
struct uintset
{
T values[1];
struct traits : delete_ptr_hash <uintset>
{
};
struct hash : hash_table <traits>
{
int foo ();
};
hash h;
};
template <typename T>
int
uintset<T>::hash::foo ()
{
return sizeof (uintset::values);
}
uintset<int> s;
int x = s.h.foo ();
This is rejected by g++ up to 4.5.x, icc 13 and clang (all versions) and
accepted by gcc 4.6 and later and icc 16 and later.