diff mbox

Fix PR69824, crash in C frontend

Message ID 56DA1EEF.7010300@redhat.com
State New
Headers show

Commit Message

Bernd Schmidt March 4, 2016, 11:49 p.m. UTC
This is a crash encountered with an implicit declaration inside an 
argument list. In the PR, Jakub identified a place where we change the 
DECL_CONTEXT for such decls, and I think I agree with him that this 
seems wrong. The following patch ensures they aren't placed on the list 
in the first place.

Bootstrapped and tested on x86_64-linux, ok?


Bernd

Comments

Joseph Myers March 5, 2016, 12:08 a.m. UTC | #1
On Sat, 5 Mar 2016, Bernd Schmidt wrote:

> This is a crash encountered with an implicit declaration inside an argument
> list. In the PR, Jakub identified a place where we change the DECL_CONTEXT for
> such decls, and I think I agree with him that this seems wrong. The following
> patch ensures they aren't placed on the list in the first place.
> 
> Bootstrapped and tested on x86_64-linux, ok?

OK.
Jeff Law March 5, 2016, 5:23 a.m. UTC | #2
On 03/04/2016 05:08 PM, Joseph Myers wrote:
> On Sat, 5 Mar 2016, Bernd Schmidt wrote:
>
>> This is a crash encountered with an implicit declaration inside an argument
>> list. In the PR, Jakub identified a place where we change the DECL_CONTEXT for
>> such decls, and I think I agree with him that this seems wrong. The following
>> patch ensures they aren't placed on the list in the first place.
>>
>> Bootstrapped and tested on x86_64-linux, ok?
>
> OK.
I went ahead and committed this to the trunk and removed the the gcc-6 
regression marker in the BZ.  Bernd's call if/when to backport to the 
existing release branches.

jeff
diff mbox

Patch

c/
	PR c/69824
	* c-decl.c (get_parm_info): Don't queue implicit function declarations
	for later.

testsuite/
	PR c/69824
	* gcc.dg/pr69824.c: New test.

Index: gcc/c/c-decl.c
===================================================================
--- gcc/c/c-decl.c	(revision 233451)
+++ gcc/c/c-decl.c	(working copy)
@@ -7050,25 +7050,28 @@  get_parm_info (bool ellipsis, tree expr)
 	  vec_safe_push (tags, tag);
 	  break;
 
+	case FUNCTION_DECL:
+	  /*  FUNCTION_DECLs appear when there is an implicit function
+	      declaration in the parameter list.  */
+	  gcc_assert (b->nested);
+	  goto set_shadowed;
+
 	case CONST_DECL:
 	case TYPE_DECL:
-	case FUNCTION_DECL:
 	  /* CONST_DECLs appear here when we have an embedded enum,
 	     and TYPE_DECLs appear here when we have an embedded struct
 	     or union.  No warnings for this - we already warned about the
-	     type itself.  FUNCTION_DECLs appear when there is an implicit
-	     function declaration in the parameter list.  */
+	     type itself.  */
 
 	  /* When we reinsert this decl in the function body, we need
 	     to reconstruct whether it was marked as nested.  */
-	  gcc_assert (TREE_CODE (decl) == FUNCTION_DECL
-		      ? b->nested
-		      : !b->nested);
+	  gcc_assert (!b->nested);
 	  DECL_CHAIN (decl) = others;
 	  others = decl;
 	  /* fall through */
 
 	case ERROR_MARK:
+	set_shadowed:
 	  /* error_mark_node appears here when we have an undeclared
 	     variable.  Just throw it away.  */
 	  if (b->id)
Index: gcc/testsuite/gcc.dg/pr69824.c
===================================================================
--- gcc/testsuite/gcc.dg/pr69824.c	(revision 0)
+++ gcc/testsuite/gcc.dg/pr69824.c	(working copy)
@@ -0,0 +1,4 @@ 
+/* { dg-do compile } */
+/* { dg-options "-w" } */
+int bar() { return foo(); }
+void baz(int c[foo()]) { return; }