+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>
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;
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;
+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.
--- /dev/null
+/* 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 } */
--- /dev/null
+/* 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 } */