re PR inline-asm/32109 (ICE with inline-asm and class with destructor)
PR inline-asm/32109 * gimplify.c (gimplify_asm_expr): Issue error if type is addressable and !allows_mem. * g++.dg/ext/asm10.C: New test. From-SVN: r125874
This commit is contained in:
parent
6a4e56a90e
commit
f497c16c26
@ -1,5 +1,9 @@
|
||||
2007-06-20 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR inline-asm/32109
|
||||
* gimplify.c (gimplify_asm_expr): Issue error if type is addressable
|
||||
and !allows_mem.
|
||||
|
||||
PR middle-end/32285
|
||||
* calls.c (precompute_arguments): Also precompute CALL_EXPR arguments
|
||||
if ACCUMULATE_OUTGOING_ARGS.
|
||||
|
@ -4122,6 +4122,19 @@ gimplify_asm_expr (tree *expr_p, tree *pre_p, tree *post_p)
|
||||
parse_input_constraint (&constraint, 0, 0, noutputs, 0,
|
||||
oconstraints, &allows_mem, &allows_reg);
|
||||
|
||||
/* If we can't make copies, we can only accept memory. */
|
||||
if (TREE_ADDRESSABLE (TREE_TYPE (TREE_VALUE (link))))
|
||||
{
|
||||
if (allows_mem)
|
||||
allows_reg = 0;
|
||||
else
|
||||
{
|
||||
error ("impossible constraint in %<asm%>");
|
||||
error ("non-memory input %d must stay in memory", i);
|
||||
return GS_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
/* If the operand is a memory input, it should be an lvalue. */
|
||||
if (!allows_reg && allows_mem)
|
||||
{
|
||||
|
@ -1,5 +1,8 @@
|
||||
2007-06-20 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR inline-asm/32109
|
||||
* g++.dg/ext/asm10.C: New test.
|
||||
|
||||
PR middle-end/32285
|
||||
* gcc.c-torture/execute/20070614-1.c: New test.
|
||||
|
||||
|
14
gcc/testsuite/g++.dg/ext/asm10.C
Normal file
14
gcc/testsuite/g++.dg/ext/asm10.C
Normal file
@ -0,0 +1,14 @@
|
||||
// PR inline-asm/32109
|
||||
// { dg-do compile }
|
||||
// { dg-options "-O2" }
|
||||
|
||||
struct A { int i[3]; ~A (); };
|
||||
struct A a;
|
||||
struct B { struct A c; int i; B (); } b;
|
||||
|
||||
B::B ()
|
||||
{
|
||||
__asm ("" : : "r" (a)); // { dg-error "impossible constraint|non-memory input" }
|
||||
__asm ("" : : "r" (b.c)); // { dg-error "impossible constraint|non-memory input" }
|
||||
__asm ("" : : "r" (c)); // { dg-error "impossible constraint|non-memory input" }
|
||||
}
|
Loading…
Reference in New Issue
Block a user