re PR middle-end/51768 (ICE with invalid asm goto)

PR middle-end/51768
	* stmt.c (check_unique_operand_names): Don't ICE during error
	reporting if i is from labels chain.

	* c-c++-common/pr51768.c: New test.

From-SVN: r182921
This commit is contained in:
Jakub Jelinek 2012-01-05 21:18:15 +01:00 committed by Jakub Jelinek
parent 1e69d24e61
commit 36363ebb88
4 changed files with 38 additions and 7 deletions

View File

@ -1,5 +1,9 @@
2012-01-05 Jakub Jelinek <jakub@redhat.com>
PR middle-end/51768
* stmt.c (check_unique_operand_names): Don't ICE during error
reporting if i is from labels chain.
PR middle-end/44777
* profile.c (branch_prob): Split bbs that have exit edge
and need a fake entry edge too.

View File

@ -1,7 +1,7 @@
/* Expands front end tree to back end RTL for GCC
Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997,
1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
2010 Free Software Foundation, Inc.
2010, 2011, 2012 Free Software Foundation, Inc.
This file is part of GCC.
@ -1253,11 +1253,11 @@ check_operand_nalternatives (tree outputs, tree inputs)
static bool
check_unique_operand_names (tree outputs, tree inputs, tree labels)
{
tree i, j;
tree i, j, i_name = NULL_TREE;
for (i = outputs; i ; i = TREE_CHAIN (i))
{
tree i_name = TREE_PURPOSE (TREE_PURPOSE (i));
i_name = TREE_PURPOSE (TREE_PURPOSE (i));
if (! i_name)
continue;
@ -1268,7 +1268,7 @@ check_unique_operand_names (tree outputs, tree inputs, tree labels)
for (i = inputs; i ; i = TREE_CHAIN (i))
{
tree i_name = TREE_PURPOSE (TREE_PURPOSE (i));
i_name = TREE_PURPOSE (TREE_PURPOSE (i));
if (! i_name)
continue;
@ -1282,7 +1282,7 @@ check_unique_operand_names (tree outputs, tree inputs, tree labels)
for (i = labels; i ; i = TREE_CHAIN (i))
{
tree i_name = TREE_PURPOSE (i);
i_name = TREE_PURPOSE (i);
if (! i_name)
continue;
@ -1297,8 +1297,7 @@ check_unique_operand_names (tree outputs, tree inputs, tree labels)
return true;
failure:
error ("duplicate asm operand name %qs",
TREE_STRING_POINTER (TREE_PURPOSE (TREE_PURPOSE (i))));
error ("duplicate asm operand name %qs", TREE_STRING_POINTER (i_name));
return false;
}

View File

@ -1,5 +1,8 @@
2012-01-05 Jakub Jelinek <jakub@redhat.com>
PR middle-end/51768
* c-c++-common/pr51768.c: New test.
PR middle-end/44777
* gcc.dg/tree-prof/pr44777.c: New test.

View File

@ -0,0 +1,25 @@
/* PR middle-end/51768 */
/* { dg-do compile } */
/* { dg-options "" } */
void
foo (void)
{
asm goto ("" : : : : lab, lab, lab2, lab); /* { dg-error "duplicate asm operand name" } */
lab:;
lab2:;
}
void
bar (void)
{
asm goto ("" : : [lab] "i" (0) : : lab); /* { dg-error "duplicate asm operand name" } */
lab:;
}
void
baz (void)
{
int x;
asm ("" : [lab] "=r" (x) : [lab] "r" (x)); /* { dg-error "duplicate asm operand name" } */
}