[Bug c++/63139] [4.8/4.9/5 Regression] Class-scope typedef overwrites typedef of previously defined class
redi at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Sep 2 15:18:00 GMT 2014
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63139
Jonathan Wakely <redi at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Last reconfirmed| |2014-09-02
Known to work| |4.7.4
Summary|Class-scope typedef |[4.8/4.9/5 Regression]
|overwrites typedef of |Class-scope typedef
|previously defined class |overwrites typedef of
| |previously defined class
Ever confirmed|0 |1
--- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Weird, somehow make_type_list_t<Ts..., X> and make_type_list_t<Ts... Y> end up
referring to the same specialization.
Reduced to remove the library header:
template<typename ...T>
struct type_list {};
template<typename ...T>
struct make_type_list
{
using type = type_list<T...>;
};
// The bug disappears if you use make_type_list directly.
template<typename ...T>
using make_type_list_t = typename make_type_list<T...>::type;
struct ContainerEndA {};
template<typename ...Ts>
struct ContainerA
{
using type = make_type_list_t<Ts..., ContainerEndA>;
};
struct ContainerEndB {};
template<typename ...Ts>
struct ContainerB
{
using type = make_type_list_t<Ts..., ContainerEndB>;
};
template<typename T, typename U>
struct is_same
{
static const bool value = false;
};
template<typename T>
struct is_same<T, T>
{
static const bool value = true;
};
int main()
{
static_assert(
is_same<ContainerB<>::type, type_list<ContainerEndB>>::value,
"This assert doesn't fail, as expected"
);
static_assert(
is_same<ContainerA<>::type, type_list<ContainerEndB>>::value,
"This assert doesn't fail but it clearly should!"
);
static_assert(
is_same<ContainerA<>::type, ContainerB<>::type>::value,
"This assert doesn't fail but it clearly should!"
);
}
More information about the Gcc-bugs
mailing list