From 9de1135bff9703e535780de7e7ed457137731dd7 Mon Sep 17 00:00:00 2001 From: Volker Reichelt Date: Mon, 22 May 2006 16:53:38 +0000 Subject: [PATCH] re PR c++/27451 (ICE with invalid asm statement) PR c++/27451 * stmt.c (expand_asm_operands): Skip asm statement with erroneous clobbers. * g++.dg/ext/asm9.C: New test. From-SVN: r113986 --- gcc/ChangeLog | 6 ++++++ gcc/stmt.c | 6 +++++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/ext/asm9.C | 7 +++++++ 4 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/ext/asm9.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bcf3002df868..1aad6d82eda3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2006-05-22 Volker Reichelt + + PR c++/27451 + * stmt.c (expand_asm_operands): Skip asm statement with erroneous + clobbers. + 2006-05-15 Roger Sayle PR rtl-optimization/22563 diff --git a/gcc/stmt.c b/gcc/stmt.c index db36c699afd1..5dd5e82d115f 100644 --- a/gcc/stmt.c +++ b/gcc/stmt.c @@ -664,7 +664,11 @@ expand_asm_operands (tree string, tree outputs, tree inputs, CLEAR_HARD_REG_SET (clobbered_regs); for (tail = clobbers; tail; tail = TREE_CHAIN (tail)) { - const char *regname = TREE_STRING_POINTER (TREE_VALUE (tail)); + const char *regname; + + if (TREE_VALUE (tail) == error_mark_node) + return; + regname = TREE_STRING_POINTER (TREE_VALUE (tail)); i = decode_reg_name (regname); if (i >= 0 || i == -4) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0ed0913452ce..fd9901b5e5f7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-05-22 Volker Reichelt + + PR c++/27451 + * g++.dg/ext/asm9.C: New test. + 2006-05-15 Roger Sayle PR middle-end/26729 diff --git a/gcc/testsuite/g++.dg/ext/asm9.C b/gcc/testsuite/g++.dg/ext/asm9.C new file mode 100644 index 000000000000..9daa01bbf5f9 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/asm9.C @@ -0,0 +1,7 @@ +// PR 27451 +// { dg-do compile } + +void foo() +{ + asm("" ::: X); // { dg-error "before" } +} -- 2.47.2