In this PR, we were crashing on an invalid asm. I think let's just reject MODIFY_EXPRs as memory inputs - I'll wager those aren't meant to be supported anyway.
Bootstrapped/regtested on x86_64-linux, ok for trunk? 2015-09-04 Marek Polacek <pola...@redhat.com> PR inline-asm/67448 * gimplify.c (gimplify_asm_expr): Don't allow MODIFY_EXPR as a memory input. * gcc.dg/asm-10.c: New test. diff --git gcc/gimplify.c gcc/gimplify.c index c8f2718..b7a918b 100644 --- gcc/gimplify.c +++ gcc/gimplify.c @@ -5210,7 +5210,8 @@ gimplify_asm_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p) if (TREE_CODE (inputv) == PREDECREMENT_EXPR || TREE_CODE (inputv) == PREINCREMENT_EXPR || TREE_CODE (inputv) == POSTDECREMENT_EXPR - || TREE_CODE (inputv) == POSTINCREMENT_EXPR) + || TREE_CODE (inputv) == POSTINCREMENT_EXPR + || TREE_CODE (inputv) == MODIFY_EXPR) TREE_VALUE (link) = error_mark_node; tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p, is_gimple_lvalue, fb_lvalue | fb_mayfail); diff --git gcc/testsuite/gcc.dg/asm-10.c gcc/testsuite/gcc.dg/asm-10.c index e69de29..e6c03c6 100644 --- gcc/testsuite/gcc.dg/asm-10.c +++ gcc/testsuite/gcc.dg/asm-10.c @@ -0,0 +1,12 @@ +/* PR inline-asm/67448 */ +/* { dg-do compile } */ +/* { dg-options "" } */ + +void +f (int i) +{ + asm ("" : : "m"(i += 1)); /* { dg-error "not directly addressable" } */ + asm ("" : : "m"(i++)); /* { dg-error "not directly addressable" } */ + asm ("" : : "m"(++i)); /* { dg-error "not directly addressable" } */ + asm ("" : : "m"(i = 0)); /* { dg-error "not directly addressable" } */ +} Marek