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