From 545a4139d5740a179540536774d3ed97ccde6320 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Wed, 13 Apr 2016 17:11:03 +0000 Subject: [PATCH] re PR c++/70635 (ICE on (and rejects) valid code on x86_64-linux-gnu: Segmentation fault (program cc1plus)) /cp 2016-04-13 Paolo Carlini PR c++/70635 * pt.c (resolve_typename_type): Fix typos in infinite recursion avoidance mechanism. /testsuite 2016-04-13 Paolo Carlini PR c++/70635 * g++.dg/parse/pr70635.C: New. From-SVN: r234953 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/pt.c | 4 ++-- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/parse/pr70635.C | 25 +++++++++++++++++++++++++ 4 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/parse/pr70635.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e7d23842c68..8f1ae231521 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2016-04-13 Paolo Carlini + + PR c++/70635 + * pt.c (resolve_typename_type): Fix typos in infinite recursion + avoidance mechanism. + 2016-04-13 Jason Merrill PR c++/70634 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index b75ac24e2b9..d066e559d0c 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -23595,9 +23595,9 @@ resolve_typename_type (tree type, bool only_current_p) { /* Ill-formed programs can cause infinite recursion here, so we must catch that. */ - TYPENAME_IS_RESOLVING_P (type) = 1; + TYPENAME_IS_RESOLVING_P (result) = 1; result = resolve_typename_type (result, only_current_p); - TYPENAME_IS_RESOLVING_P (type) = 0; + TYPENAME_IS_RESOLVING_P (result) = 0; } /* Qualify the resulting type. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c8061135327..b16fadcbf36 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-04-13 Paolo Carlini + + PR c++/70635 + * g++.dg/parse/pr70635.C: New. + 2016-04-13 Marek Polacek PR c++/70639 diff --git a/gcc/testsuite/g++.dg/parse/pr70635.C b/gcc/testsuite/g++.dg/parse/pr70635.C new file mode 100644 index 00000000000..0873840daf5 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/pr70635.C @@ -0,0 +1,25 @@ +// PR c++/70635 +// { dg-options "-fpermissive -w" } + +template < typename T > +struct A +{ + struct B; + typedef typename B::type type; +}; + +template < typename T > +struct A < T >::B +{ + typedef typename A < type >::type type; // { dg-error "type" } + type Foo (); +}; + +template < typename T > +typename A < T >::B::type +A < T >::B::Foo () +{ + return 0; +} + +template class A;