middle-end/112487 - inline and parameter mismatch
When passing an aggregate to a implicitly declared function that's later declared as receiving a register type we can run into a sanity assert that cannot hold for such gross mismatches. Instead of asserting avoid emitting a debug temp that's invalid. PR middle-end/112487 * tree-inline.cc (setup_one_parameter): When the parameter is unused only insert a debug bind when there's not a gross mismatch in value and declared parameter type. Do not assert there effectively isn't. * gcc.dg/torture/pr112487.c: New testcase.
This commit is contained in:
parent
a0b2abef4e
commit
5021fa7076
2 changed files with 23 additions and 1 deletions
18
gcc/testsuite/gcc.dg/torture/pr112487.c
Normal file
18
gcc/testsuite/gcc.dg/torture/pr112487.c
Normal file
|
@ -0,0 +1,18 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-additional-options "-w -std=gnu89" } */
|
||||
|
||||
struct A { char i; };
|
||||
struct B {
|
||||
struct C *p;
|
||||
struct A *q;
|
||||
};
|
||||
struct C { struct B a[1]; };
|
||||
struct T { struct U *ptr; };
|
||||
|
||||
volatile struct T v;
|
||||
void f1(volatile struct T v) { f2(v); }
|
||||
void f2(volatile struct T *const v) { }
|
||||
void bar() {
|
||||
struct U *ptr;
|
||||
f1(v);
|
||||
}
|
|
@ -3562,7 +3562,11 @@ setup_one_parameter (copy_body_data *id, tree p, tree value, tree fn,
|
|||
it. */
|
||||
if (optimize && gimple_in_ssa_p (cfun) && !def && is_gimple_reg (p))
|
||||
{
|
||||
gcc_assert (!value || !TREE_SIDE_EFFECTS (value));
|
||||
/* When there's a gross type mismatch between the passed value
|
||||
and the declared argument type drop it on the floor and do
|
||||
not bother to insert a debug bind. */
|
||||
if (value && !is_gimple_reg_type (TREE_TYPE (value)))
|
||||
return NULL;
|
||||
return insert_init_debug_bind (id, bb, var, rhs, NULL);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue