[C++ Patch] PR 70635 ([4.9/5/6 Regression] ICE on (and rejects) valid code...)

Paolo Carlini paolo.carlini@oracle.com
Tue Apr 12 13:25:00 GMT 2016


Hi,

in this regression we have an infinite recursion affecting the 
same_type_p call at parser.c:25125 which I added in the patch for 
c++/38313. The issue is that for, eg, the testcase at issue, we are 
passing a TYPENAME_TYPE to same_type_p. I think we can simply handle the 
problem by checking first that we have a CLASS_TYPE_P as TREE_TYPE 
(type_decl). Tested x86_64-linux.

Thanks,
Paolo.

/////////////////////////////
-------------- next part --------------
/cp
2016-04-12  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/70635
	* parser.c (cp_parser_constructor_declarator_p): Only use same_type_p
	for true CLASS_TYPE_P (TREE_TYPE (type_decl)).

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

	PR c++/70635
	* g++.dg/parse/pr70635.C: New.
-------------- next part --------------
Index: cp/parser.c
===================================================================
--- cp/parser.c	(revision 234874)
+++ cp/parser.c	(working copy)
@@ -25118,8 +25122,9 @@ cp_parser_constructor_declarator_p (cp_parser *par
       constructor_p = (!cp_parser_error_occurred (parser)
 		       && (outside_class_specifier_p
 			   || type_decl == error_mark_node
-			   || same_type_p (current_class_type,
-					   TREE_TYPE (type_decl))));
+			   || (CLASS_TYPE_P (TREE_TYPE (type_decl))
+			       && same_type_p (current_class_type,
+					       TREE_TYPE (type_decl)))));
 
       /* If we're still considering a constructor, we have to see a `(',
 	 to begin the parameter-declaration-clause, followed by either a
Index: testsuite/g++.dg/parse/pr70635.C
===================================================================
--- testsuite/g++.dg/parse/pr70635.C	(revision 0)
+++ testsuite/g++.dg/parse/pr70635.C	(working copy)
@@ -0,0 +1,23 @@
+// 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;
+  type Foo ();
+};
+
+template < typename T > 
+typename A < T >::B::type
+A < T >::B::Foo ()
+{
+  return 0;
+}


More information about the Gcc-patches mailing list