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:
Jakub Jelinek 2007-06-20 08:37:17 +02:00 committed by Jakub Jelinek
parent 6a4e56a90e
commit f497c16c26
4 changed files with 34 additions and 0 deletions

View File

@ -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.

View File

@ -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)
{

View File

@ -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.

View 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" }
}