https://gcc.gnu.org/g:abea0dbd63ddb7e16d13806df929e1ef3b060091

commit r15-5827-gabea0dbd63ddb7e16d13806df929e1ef3b060091
Author: Joseph Myers <josmy...@redhat.com>
Date:   Sat Nov 30 16:15:51 2024 +0000

    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:
---
 gcc/gimplify.cc                        |  3 ++-
 gcc/testsuite/gcc.dg/pr100501-1.c      | 26 ++++++++++++++++++++++++++
 gcc/testsuite/gcc.dg/pr100792-1.c      | 10 ++++++++++
 gcc/testsuite/gcc.dg/pr48552-1.c       |  1 +
 gcc/testsuite/gcc.dg/pr48552-2.c       |  1 +
 gcc/testsuite/gcc.dg/torture/pr98601.c |  1 +
 6 files changed, 41 insertions(+), 1 deletion(-)

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 } */
 }

Reply via email to