re PR c/48552 (ICE with void type expressions in asm inputs/outputs)
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
This commit is contained in:
parent
06eb52cab5
commit
bae5cddff8
5 changed files with 132 additions and 1 deletions
|
@ -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>
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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.
|
||||
|
|
53
gcc/testsuite/gcc.dg/pr48552-1.c
Normal file
53
gcc/testsuite/gcc.dg/pr48552-1.c
Normal file
|
@ -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 } */
|
53
gcc/testsuite/gcc.dg/pr48552-2.c
Normal file
53
gcc/testsuite/gcc.dg/pr48552-2.c
Normal file
|
@ -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 } */
|
Loading…
Add table
Reference in a new issue