From: Jason Merrill Date: Fri, 4 Mar 2016 16:07:20 +0000 (-0500) Subject: re PR c++/70067 (internal compiler error: in strip_typedefs, at cp/tree.c:1466) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b54eff8bb1131e7bbd1e03633460be120f11ec99;p=gcc.git re PR c++/70067 (internal compiler error: in strip_typedefs, at cp/tree.c:1466) PR c++/70067 * tree.c (strip_typedefs): Handle TYPENAME_TYPE lookup finding the same type. From-SVN: r233973 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5f6d69a4622..0f23bd770b7 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2016-03-04 Jason Merrill + + PR c++/70067 + * tree.c (strip_typedefs): Handle TYPENAME_TYPE lookup finding the + same type. + 2016-03-03 Jason Merrill * method.c (synthesized_method_walk): operator= can also be constexpr. diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 0b7b1443b60..aaf9a4f2188 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -1437,6 +1437,9 @@ strip_typedefs (tree t, bool *remove_attributes) result = make_typename_type (strip_typedefs (TYPE_CONTEXT (t), remove_attributes), fullname, typename_type, tf_none); + /* Handle 'typedef typename A::N N;' */ + if (typedef_variant_p (result)) + result = TYPE_MAIN_VARIANT (DECL_ORIGINAL_TYPE (TYPE_NAME (result))); } break; case DECLTYPE_TYPE: diff --git a/gcc/testsuite/g++.dg/template/typename21.C b/gcc/testsuite/g++.dg/template/typename21.C new file mode 100644 index 00000000000..e5e59b1efd3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typename21.C @@ -0,0 +1,11 @@ +// PR c++/70067 +// { dg-do compile { target c++98 } } + +template struct A; +template struct B { struct N { }; }; +template struct D: B { + typedef typename D::N N; + A *a; +}; + +D d;