On Fri, 29 Nov 2024, Richard Biener wrote: > I think we're trying to handle errorneous cases by setting TREE_VALUE > to error_mark_node > before this, so how about the following instead?
Yes, that works, and also fixes the test in bug 100792 unlike my previous patch. Here's a full, tested patch using your version. gimplify: Handle void expression as asm input [PR100501, PR100792] As reported in bug 100501 (plus duplicates), the gimplifier ICEs for C tests involving a statement expression not returning a value as an asm input; this includes the variant bug 100792 where the statement expression ends with another asm statement. The expected diagnostic for this case (as seen for C++ input) is one coming from the gimplifier and so it seems reasonable to fix the gimplifier to handle the GENERIC generated for this case by the C front end, rather than trying to make the C front end detect it earlier. Thus the gimplifier to handle a void expression like other non-lvalues for such a memory input. Bootstrapped with no regressions for x86_64-pc-linux-gnu. OK to commit? PR c/100501 PR c/100792 gcc/ * gimplify.cc (gimplify_asm_expr): Handle void expressions for memory inputs like other non-lvalues. gcc/testsuite/ * gcc.dg/pr100501-1.c, gcc.dg/pr100792-1.c: New tests. * gcc.dg/pr48552-1.c, gcc.dg/pr48552-2.c, gcc.dg/torture/pr98601.c: Update expected errors. Co-authored-by: Richard Biener <rguent...@suse.de> diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc index fb0ca23bfb6c..aa99c0a98f73 100644 --- a/gcc/gimplify.cc +++ b/gcc/gimplify.cc @@ -7453,7 +7453,8 @@ gimplify_asm_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p) || TREE_CODE (inputv) == PREINCREMENT_EXPR || TREE_CODE (inputv) == POSTDECREMENT_EXPR || TREE_CODE (inputv) == POSTINCREMENT_EXPR - || TREE_CODE (inputv) == MODIFY_EXPR) + || TREE_CODE (inputv) == MODIFY_EXPR + || VOID_TYPE_P (TREE_TYPE (inputv))) 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 a/gcc/testsuite/gcc.dg/pr100501-1.c b/gcc/testsuite/gcc.dg/pr100501-1.c new file mode 100644 index 000000000000..152caac8b5d1 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr100501-1.c @@ -0,0 +1,26 @@ +/* Test ICE for statement expression returning no value as asm input (bug + 100501). */ +/* { dg-do compile } */ +/* { dg-options "" } */ + +int x; +int g (); + +void +f () +{ + __asm__ ("" : : "m" (({}))); /* { dg-error "memory input 0 is not directly addressable" } */ + __asm__ ("" : : "m" (({ ; }))); /* { dg-error "memory input 0 is not directly addressable" } */ + __asm__ ("" : : "m" (({ (void) 0; }))); /* { dg-error "memory input 0 is not directly addressable" } */ + __asm__ ("" : : "m" (({ f (); }))); /* { dg-error "memory input 0 is not directly addressable" } */ + __asm__ ("" : : "m" (({ f (); f (); }))); /* { dg-error "memory input 0 is not directly addressable" } */ + __asm__ ("" : : "m" (({ x = g (); f (); }))); /* { dg-error "memory input 0 is not directly addressable" } */ + __asm__ ("" : : "m" (({ if (1) g (); }))); /* { dg-error "memory input 0 is not directly addressable" } */ + __asm__ ("" : : "m" (({ if (1) g (); else g (); }))); /* { dg-error "memory input 0 is not directly addressable" } */ + __asm__ ("" : : "m" (({ test : goto test; }))); /* { dg-error "memory input 0 is not directly addressable" } */ + __asm__ ("" : : "m" (({ return; }))); /* { dg-error "memory input 0 is not directly addressable" } */ + __asm__ ("" : : "m" (({ while (1); }))); /* { dg-error "memory input 0 is not directly addressable" } */ + __asm__ ("" : : "m" (({ do {} while (1); }))); /* { dg-error "memory input 0 is not directly addressable" } */ + __asm__ ("" : : "m" (({ for (;;); }))); /* { dg-error "memory input 0 is not directly addressable" } */ + __asm__ ("" : : "m" (({ switch (x); }))); /* { dg-error "memory input 0 is not directly addressable" } */ +} diff --git a/gcc/testsuite/gcc.dg/pr100792-1.c b/gcc/testsuite/gcc.dg/pr100792-1.c new file mode 100644 index 000000000000..52f3aaf83f73 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr100792-1.c @@ -0,0 +1,10 @@ +/* Test ICE for statement expression ending with asm as asm input (bug + 100792). */ +/* { dg-do compile } */ +/* { dg-options "" } */ + +void +f () +{ + __asm__ ("" : : "m" (({ __asm__ (""); }))); /* { dg-error "memory input 0 is not directly addressable" } */ +} diff --git a/gcc/testsuite/gcc.dg/pr48552-1.c b/gcc/testsuite/gcc.dg/pr48552-1.c index 4cd7c59011ef..b3ef453cb1d5 100644 --- a/gcc/testsuite/gcc.dg/pr48552-1.c +++ b/gcc/testsuite/gcc.dg/pr48552-1.c @@ -20,6 +20,7 @@ void f3 (void *x) { __asm volatile ("" : : "m" (*x)); /* { dg-warning "dereferencing" } */ + /* { dg-error "memory input 0 is not directly addressable" "not addressable" { target *-*-* } .-1 } */ } void diff --git a/gcc/testsuite/gcc.dg/pr48552-2.c b/gcc/testsuite/gcc.dg/pr48552-2.c index e22600a24763..003926ce631a 100644 --- a/gcc/testsuite/gcc.dg/pr48552-2.c +++ b/gcc/testsuite/gcc.dg/pr48552-2.c @@ -20,6 +20,7 @@ void f3 (void *x) { __asm ("" : : "m" (*x)); /* { dg-warning "dereferencing" } */ + /* { dg-error "memory input 0 is not directly addressable" "not addressable" { target *-*-* } .-1 } */ } void diff --git a/gcc/testsuite/gcc.dg/torture/pr98601.c b/gcc/testsuite/gcc.dg/torture/pr98601.c index ee9d076c02de..a57ee35fd455 100644 --- a/gcc/testsuite/gcc.dg/torture/pr98601.c +++ b/gcc/testsuite/gcc.dg/torture/pr98601.c @@ -11,4 +11,5 @@ void bar (void *p) { asm volatile ("" : : "m" (*p)); /* { dg-warning "dereferencing 'void \\*' pointer" } */ + /* { dg-error "memory input 0 is not directly addressable" "not addressable" { target *-*-* } .-1 } */ } -- Joseph S. Myers josmy...@redhat.com