diff mbox

[C++] PR 60384

Message ID 5329D18A.2070305@oracle.com
State New
Headers show

Commit Message

Paolo Carlini March 19, 2014, 5:19 p.m. UTC
Hi,

in this minor regression we ICE during error recovery, when 
push_class_level_binding_1 (called by
finish_member_declaration via pushdecl_class_level) gets a 
TEMPLATE_ID_EXPR as the name argument. It's a regression because, since 
r199779, invalid declarations get more often through (with TREE_TYPE an 
error_mark_node, like TREE_TYPE (x) in the case at issue). Thus the 
additional check I'm suggesting. Tested x86_64-linux.

Thanks,
Paolo.

//////////////////////
/cp
2014-03-19  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/60384
	* name-lookup.c (push_class_level_binding_1): Check identifier_p
	on the name argument.

/testsuite
2014-03-19  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/60384
	* g++.dg/cpp1y/pr60384.C: New.

Comments

Jason Merrill March 21, 2014, 3:20 p.m. UTC | #1
Let's assert errorcount|sorrycount before returning in the !identifier 
case.  OK with that change.

Jason
diff mbox

Patch

Index: cp/name-lookup.c
===================================================================
--- cp/name-lookup.c	(revision 208682)
+++ cp/name-lookup.c	(working copy)
@@ -3112,7 +3112,9 @@  push_class_level_binding_1 (tree name, tree x)
   if (!class_binding_level)
     return true;
 
-  if (name == error_mark_node)
+  if (name == error_mark_node
+      /* Can happen for an erroneous declaration (c++/60384).  */
+      || !identifier_p (name))
     return false;
 
   /* Check for invalid member names.  But don't worry about a default
Index: testsuite/g++.dg/cpp1y/pr60384.C
===================================================================
--- testsuite/g++.dg/cpp1y/pr60384.C	(revision 0)
+++ testsuite/g++.dg/cpp1y/pr60384.C	(working copy)
@@ -0,0 +1,9 @@ 
+// PR c++/60384
+// { dg-do compile { target c++1y } }
+
+template<typename> int foo();
+
+struct A
+{
+  typedef auto foo<>();  // { dg-error "typedef declared 'auto'" }
+};