re PR c++/70635 (ICE on (and rejects) valid code on x86_64-linux-gnu: Segmentation...
authorPaolo Carlini <paolo.carlini@oracle.com>
Wed, 13 Apr 2016 17:11:03 +0000 (17:11 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Wed, 13 Apr 2016 17:11:03 +0000 (17:11 +0000)
/cp
2016-04-13  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/70635
* pt.c (resolve_typename_type): Fix typos in infinite recursion
avoidance mechanism.

/testsuite
2016-04-13  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/70635
* g++.dg/parse/pr70635.C: New.

From-SVN: r234953

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/pr70635.C [new file with mode: 0644]

index e7d2384..8f1ae23 100644 (file)
@@ -1,3 +1,9 @@
+2016-04-13  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/70635
+       * pt.c (resolve_typename_type): Fix typos in infinite recursion
+       avoidance mechanism.
+
 2016-04-13  Jason Merrill  <jason@redhat.com>
 
        PR c++/70634
index b75ac24..d066e55 100644 (file)
@@ -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.  */
index c806113..b16fadc 100644 (file)
@@ -1,3 +1,8 @@
+2016-04-13  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/70635
+       * g++.dg/parse/pr70635.C: New.
+
 2016-04-13  Marek Polacek  <polacek@redhat.com>
 
        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 (file)
index 0000000..0873840
--- /dev/null
@@ -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<int>;