http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60767
Bug ID: 60767
Summary: [ICE] [c++11] [4.8.2] use of "using" inside template
causes failure in retreive_specialization
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: zreed1 at gmail dot com
The follow code fails on g++4.8.2, but compiles successfully with clang.
=========================================================================
template <typename _T, int _N>
struct Impl;
template <typename _T>
struct Impl<_T,0>
{};
template < typename _Tag, typename _T>
typename _Tag::template impl< _T > get_impl();
template <int _N>
struct Tag
{
template <typename _T>
using impl = Impl<_T,_N>;
};
int main()
{
get_impl< Tag<0>, void >();
}
=========================================================================
test.cpp: In substitution of ‘template<class _T> using impl = Impl<_T, 0> [with
_T = 0]’:
│ ~
test.cpp:9:38: required by substitution of ‘template<class _Tag, class _T>
typename _Tag::impl<_T> get_impl() [with _Tag = Tag<0>; _T = void]’
│ ~
test.cpp:22:28: required from here
│ ~
test.cpp:16:29: internal compiler error: in retrieve_specialization, at
cp/pt.c:1021
│ ~
using impl = Impl<_T,_N>;
=========================================================================
the following similar code compiles successfuly
=========================================================================
template <typename _T, int _N>
struct Impl;
template <typename _T>
struct Impl<_T,0>
{};
template < typename _Tag, typename _T>
typename _Tag::template impl< _T >::type get_impl();
template <int _N>
struct Tag
{
template <typename _T>
struct impl
{ typedef Impl<_T,_N> type; };
};
int main()
{
get_impl< Tag<0>, void >();
}