From: Jakub Jelinek Date: Thu, 9 Feb 2012 21:35:36 +0000 (+0100) Subject: backport: re PR middle-end/51768 (ICE with invalid asm goto) X-Git-Tag: releases/gcc-4.5.4~230 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6812883fbd2d04bdc900e8b668d5c38017b11726;p=thirdparty%2Fgcc.git backport: re PR middle-end/51768 (ICE with invalid asm goto) Backported from mainline 2012-01-05 Jakub Jelinek 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: r184071 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a21fe5f49b49..b71e79facaf3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -3,6 +3,10 @@ Backported from mainline 2012-01-05 Jakub Jelinek + 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. diff --git a/gcc/stmt.c b/gcc/stmt.c index 5f9c234defd6..afa4e6961ec3 100644 --- a/gcc/stmt.c +++ b/gcc/stmt.c @@ -1232,11 +1232,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; @@ -1247,7 +1247,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; @@ -1261,7 +1261,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; @@ -1276,8 +1276,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; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1324a9c41d4a..9f0b74bd6883 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -3,6 +3,9 @@ Backported from mainline 2012-01-05 Jakub Jelinek + PR middle-end/51768 + * c-c++-common/pr51768.c: New test. + PR middle-end/44777 * gcc.dg/tree-prof/pr44777.c: New test. diff --git a/gcc/testsuite/c-c++-common/pr51768.c b/gcc/testsuite/c-c++-common/pr51768.c new file mode 100644 index 000000000000..082594ccad7a --- /dev/null +++ b/gcc/testsuite/c-c++-common/pr51768.c @@ -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" } */ +}