re PR c/48552 (ICE with void type expressions in asm inputs/outputs)
authorJakub Jelinek <jakub@redhat.com>
Tue, 12 Apr 2011 06:27:23 +0000 (08:27 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 12 Apr 2011 06:27:23 +0000 (08:27 +0200)
PR c/48552
* c-typeck.c (build_asm_expr): Error out on attempts to use
void type outputs or inputs for constraints that allow reg or
don't allow memory.

* gcc.dg/pr48552-1.c: New test.
* gcc.dg/pr48552-2.c: New test.

From-SVN: r172298

gcc/ChangeLog
gcc/c-typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr48552-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr48552-2.c [new file with mode: 0644]

index bf897c9b80e8ac0c75f1836e7db8b850c0ef4b67..3fe9cdb6214c092bd3459b799dfe03abc9012693 100644 (file)
@@ -1,3 +1,10 @@
+2011-04-12  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c/48552
+       * c-typeck.c (build_asm_expr): Error out on attempts to use
+       void type outputs or inputs for constraints that allow reg or
+       don't allow memory.
+
 2011-04-11  Chung-Lin Tang  <cltang@codesourcery.com>
            Richard Earnshaw  <rearnsha@arm.com>
 
index 049a8af8330821d599981cab84dcc0a6e77ee854..c386f56c775eab982bfe08ff6d960fd5a3d77604 100644 (file)
@@ -8502,6 +8502,13 @@ build_asm_expr (location_t loc, tree string, tree outputs, tree inputs,
             mark it addressable.  */
          if (!allows_reg && !c_mark_addressable (output))
            output = error_mark_node;
+         if (!(!allows_reg && allows_mem)
+             && output != error_mark_node
+             && VOID_TYPE_P (TREE_TYPE (output)))
+           {
+             error_at (loc, "invalid use of void expression");
+             output = error_mark_node;
+           }
        }
       else
        output = error_mark_node;
@@ -8528,7 +8535,12 @@ build_asm_expr (location_t loc, tree string, tree outputs, tree inputs,
              STRIP_NOPS (input);
              if (!c_mark_addressable (input))
                input = error_mark_node;
-         }
+           }
+         else if (input != error_mark_node && VOID_TYPE_P (TREE_TYPE (input)))
+           {
+             error_at (loc, "invalid use of void expression");
+             input = error_mark_node;
+           }
        }
       else
        input = error_mark_node;
index c5efa1b5e63fd0c152197cb27745e648a54d6656..6d657590c522911aef600f10984b3a13ef6b401e 100644 (file)
@@ -1,3 +1,9 @@
+2011-04-12  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c/48552
+       * gcc.dg/pr48552-1.c: New test.
+       * gcc.dg/pr48552-2.c: New test.
+
 2011-04-11  Jason Merrill  <jason@redhat.com>
 
        * g++.dg/cpp0x/sfinae12.C: New.
diff --git a/gcc/testsuite/gcc.dg/pr48552-1.c b/gcc/testsuite/gcc.dg/pr48552-1.c
new file mode 100644 (file)
index 0000000..5590549
--- /dev/null
@@ -0,0 +1,53 @@
+/* PR c/48552 */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+struct S;
+
+void
+f1 (void *x)
+{
+  __asm volatile ("" : : "r" (*x));    /* { dg-warning "dereferencing" } */
+}                                      /* { dg-error "invalid use of void expression" "" { target *-*-* } 10 } */
+
+void
+f2 (void *x)
+{
+  __asm volatile ("" : "=r" (*x));     /* { dg-warning "dereferencing" } */
+}                                      /* { dg-error "invalid use of void expression" "" { target *-*-* } 16 } */
+                                       /* { dg-error "invalid lvalue in asm output 0" "" { target *-*-* } 16 } */
+void
+f3 (void *x)
+{
+  __asm volatile ("" : : "m" (*x));    /* { dg-warning "dereferencing" } */
+}
+
+void
+f4 (void *x)
+{
+  __asm volatile ("" : "=m" (*x));     /* { dg-warning "dereferencing" } */
+}
+
+void
+f5 (void *x)
+{
+  __asm volatile ("" : : "g" (*x));    /* { dg-warning "dereferencing" } */
+}                                      /* { dg-error "invalid use of void expression" "" { target *-*-* } 34 } */
+
+void
+f6 (void *x)
+{
+  __asm volatile ("" : "=g" (*x));     /* { dg-warning "dereferencing" } */
+}                                      /* { dg-error "invalid use of void expression" "" { target *-*-* } 40 } */
+                                       /* { dg-error "invalid lvalue in asm output 0" "" { target *-*-* } 40 } */
+void
+f7 (struct S *x)
+{
+  __asm volatile ("" : : "r" (*x));    /* { dg-error "dereferencing pointer to incomplete type" } */
+}
+
+void
+f8 (struct S *x)
+{
+  __asm volatile ("" : "=r" (*x));     /* { dg-error "dereferencing pointer to incomplete type" } */
+}                                      /* { dg-error "invalid lvalue in asm output 0" "" { target *-*-* } 52 } */
diff --git a/gcc/testsuite/gcc.dg/pr48552-2.c b/gcc/testsuite/gcc.dg/pr48552-2.c
new file mode 100644 (file)
index 0000000..4408279
--- /dev/null
@@ -0,0 +1,53 @@
+/* PR c/48552 */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+struct S;
+
+void
+f1 (void *x)
+{
+  __asm ("" : : "r" (*x));     /* { dg-warning "dereferencing" } */
+}                              /* { dg-error "invalid use of void expression" "" { target *-*-* } 10 } */
+
+void
+f2 (void *x)
+{
+  __asm ("" : "=r" (*x));      /* { dg-warning "dereferencing" } */
+}                              /* { dg-error "invalid use of void expression" "" { target *-*-* } 16 } */
+                               /* { dg-error "invalid lvalue in asm output 0" "" { target *-*-* } 16 } */
+void
+f3 (void *x)
+{
+  __asm ("" : : "m" (*x));     /* { dg-warning "dereferencing" } */
+}
+
+void
+f4 (void *x)
+{
+  __asm ("" : "=m" (*x));      /* { dg-warning "dereferencing" } */
+}
+
+void
+f5 (void *x)
+{
+  __asm ("" : : "g" (*x));     /* { dg-warning "dereferencing" } */
+}                              /* { dg-error "invalid use of void expression" "" { target *-*-* } 34 } */
+
+void
+f6 (void *x)
+{
+  __asm ("" : "=g" (*x));      /* { dg-warning "dereferencing" } */
+}                              /* { dg-error "invalid use of void expression" "" { target *-*-* } 40 } */
+                               /* { dg-error "invalid lvalue in asm output 0" "" { target *-*-* } 40 } */
+void
+f7 (struct S *x)
+{
+  __asm ("" : : "r" (*x));     /* { dg-error "dereferencing pointer to incomplete type" } */
+}
+
+void
+f8 (struct S *x)
+{
+  __asm ("" : "=r" (*x));      /* { dg-error "dereferencing pointer to incomplete type" } */
+}                              /* { dg-error "invalid lvalue in asm output 0" "" { target *-*-* } 52 } */