[C++ Patch] PR 58980

Paolo Carlini paolo.carlini@oracle.com
Tue Jan 21 12:47:00 GMT 2014


Hi,

in this relatively serious ICE on invalid regression (we don't emit any 
sensible diagnostic before ICE-ing) the problem is that is_ancestor 
simply asserts that the second argument can be only a NAMESPACE_DECL or 
a CLASS_TYPE_P, whereas in the erroneous input at issue it's a 
TYPENAME_TYPE. Thus the idea of not calling is_ancestor at all in this 
case + adjusting the two error_at calls to use %qT instead of %qD 
(dump_type can handle a NAMESPACE_DECL whereas dump_type can't handle a 
TYPENAME_TYPE).

Tested x86_64-linux.

Thanks,
Paolo.

//////////////////////////////
-------------- next part --------------
/cp
2014-01-21  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/58980
	* parser.c (cp_parser_enum_specifier): Handle TYPENAME_TYPE as
	nested_name_specifier.

/testsuite
2014-01-21  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/58980
	* g++.dg/parse/enum11.C: New.
-------------- next part --------------
Index: cp/parser.c
===================================================================
--- cp/parser.c	(revision 206875)
+++ cp/parser.c	(working copy)
@@ -15471,16 +15471,19 @@ cp_parser_enum_specifier (cp_parser* parser)
 
 	  /* If that scope does not contain the scope in which the
 	     class was originally declared, the program is invalid.  */
-	  if (prev_scope && !is_ancestor (prev_scope, nested_name_specifier))
+	  if (prev_scope
+	      && (TREE_CODE (nested_name_specifier) == TYPENAME_TYPE
+		  || !is_ancestor (prev_scope, nested_name_specifier)))
 	    {
 	      if (at_namespace_scope_p ())
 		error_at (type_start_token->location,
 			  "declaration of %qD in namespace %qD which does not "
-			  "enclose %qD",
+			  "enclose %qT",
 			  type, prev_scope, nested_name_specifier);
 	      else
 		error_at (type_start_token->location,
-			  "declaration of %qD in %qD which does not enclose %qD",
+			  "declaration of %qD in %qD which does not "
+			  "enclose %qT",
 			  type, prev_scope, nested_name_specifier);
 	      type = error_mark_node;
 	    }
Index: testsuite/g++.dg/parse/enum11.C
===================================================================
--- testsuite/g++.dg/parse/enum11.C	(revision 0)
+++ testsuite/g++.dg/parse/enum11.C	(working copy)
@@ -0,0 +1,6 @@
+// PR c++/58980
+
+template<typename> struct A
+{ 
+  enum A::B::C {};   // { dg-error "does not enclose" }
+};


More information about the Gcc-patches mailing list