Commit 36363ebb by Jakub Jelinek Committed by Jakub Jelinek

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
parent 1e69d24e
2012-01-05 Jakub Jelinek <jakub@redhat.com> 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 PR middle-end/44777
* profile.c (branch_prob): Split bbs that have exit edge * profile.c (branch_prob): Split bbs that have exit edge
and need a fake entry edge too. and need a fake entry edge too.
/* Expands front end tree to back end RTL for GCC /* Expands front end tree to back end RTL for GCC
Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997,
1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 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. This file is part of GCC.
...@@ -1253,11 +1253,11 @@ check_operand_nalternatives (tree outputs, tree inputs) ...@@ -1253,11 +1253,11 @@ check_operand_nalternatives (tree outputs, tree inputs)
static bool static bool
check_unique_operand_names (tree outputs, tree inputs, tree labels) 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)) 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) if (! i_name)
continue; continue;
...@@ -1268,7 +1268,7 @@ check_unique_operand_names (tree outputs, tree inputs, tree labels) ...@@ -1268,7 +1268,7 @@ check_unique_operand_names (tree outputs, tree inputs, tree labels)
for (i = inputs; i ; i = TREE_CHAIN (i)) 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) if (! i_name)
continue; continue;
...@@ -1282,7 +1282,7 @@ check_unique_operand_names (tree outputs, tree inputs, tree labels) ...@@ -1282,7 +1282,7 @@ check_unique_operand_names (tree outputs, tree inputs, tree labels)
for (i = labels; i ; i = TREE_CHAIN (i)) for (i = labels; i ; i = TREE_CHAIN (i))
{ {
tree i_name = TREE_PURPOSE (i); i_name = TREE_PURPOSE (i);
if (! i_name) if (! i_name)
continue; continue;
...@@ -1297,8 +1297,7 @@ check_unique_operand_names (tree outputs, tree inputs, tree labels) ...@@ -1297,8 +1297,7 @@ check_unique_operand_names (tree outputs, tree inputs, tree labels)
return true; return true;
failure: failure:
error ("duplicate asm operand name %qs", error ("duplicate asm operand name %qs", TREE_STRING_POINTER (i_name));
TREE_STRING_POINTER (TREE_PURPOSE (TREE_PURPOSE (i))));
return false; return false;
} }
......
2012-01-05 Jakub Jelinek <jakub@redhat.com> 2012-01-05 Jakub Jelinek <jakub@redhat.com>
PR middle-end/51768
* c-c++-common/pr51768.c: New test.
PR middle-end/44777 PR middle-end/44777
* gcc.dg/tree-prof/pr44777.c: New test. * gcc.dg/tree-prof/pr44777.c: New test.
......
/* 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" } */
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment