aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Myers <josmyers@redhat.com>2024-11-30 16:15:51 +0000
committerJoseph Myers <josmyers@redhat.com>2024-11-30 16:15:51 +0000
commitabea0dbd63ddb7e16d13806df929e1ef3b060091 (patch)
tree74811a4390c78a3b8ab9c5a16e311943b1a5ba32
parent5297795e5b9e86fd2085a8f739f43fc28fb5e522 (diff)
downloadgcc-abea0dbd63ddb7e16d13806df929e1ef3b060091.zip
gcc-abea0dbd63ddb7e16d13806df929e1ef3b060091.tar.gz
gcc-abea0dbd63ddb7e16d13806df929e1ef3b060091.tar.bz2
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 <rguenther@suse.de>
-rw-r--r--gcc/gimplify.cc3
-rw-r--r--gcc/testsuite/gcc.dg/pr100501-1.c26
-rw-r--r--gcc/testsuite/gcc.dg/pr100792-1.c10
-rw-r--r--gcc/testsuite/gcc.dg/pr48552-1.c1
-rw-r--r--gcc/testsuite/gcc.dg/pr48552-2.c1
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr98601.c1
6 files changed, 41 insertions, 1 deletions
diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc
index fb0ca23..aa99c0a 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 0000000..152caac
--- /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 0000000..52f3aaf
--- /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 4cd7c59..b3ef453 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 e22600a..003926c 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 ee9d076..a57ee35 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 } */
}