From: jason Date: Fri, 4 Mar 2016 16:07:20 +0000 (+0000) Subject: PR c++/70067 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=76cffa04ff0c2d126de3958480f0d77ef1cdf27c;p=thirdparty%2Fgcc.git PR c++/70067 * tree.c (strip_typedefs): Handle TYPENAME_TYPE lookup finding the same type. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@233973 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5f6d69a4622a..0f23bd770b71 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 0b7b1443b609..aaf9a4f2188a 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 000000000000..e5e59b1efd37 --- /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;