diff options
author | Jason Merrill <jason@redhat.com> | 2016-03-04 11:07:20 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2016-03-04 11:07:20 -0500 |
commit | b54eff8bb1131e7bbd1e03633460be120f11ec99 (patch) | |
tree | 90b5f81b23bf4594f917dc889c789a835aa555f2 | |
parent | 64b23c13dcf2e7bd771a746f6b477e07e31a045e (diff) | |
download | gcc-b54eff8bb1131e7bbd1e03633460be120f11ec99.zip gcc-b54eff8bb1131e7bbd1e03633460be120f11ec99.tar.gz gcc-b54eff8bb1131e7bbd1e03633460be120f11ec99.tar.bz2 |
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
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/tree.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/typename21.C | 11 |
3 files changed, 20 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5f6d69a..0f23bd7 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2016-03-04 Jason Merrill <jason@redhat.com> + + PR c++/70067 + * tree.c (strip_typedefs): Handle TYPENAME_TYPE lookup finding the + same type. + 2016-03-03 Jason Merrill <jason@redhat.com> * method.c (synthesized_method_walk): operator= can also be constexpr. diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 0b7b144..aaf9a4f 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 0000000..e5e59b1 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typename21.C @@ -0,0 +1,11 @@ +// PR c++/70067 +// { dg-do compile { target c++98 } } + +template <class> struct A; +template <class T> struct B { struct N { }; }; +template <class T> struct D: B<T> { + typedef typename D::N N; + A<N> *a; +}; + +D<int> d; |