Skip to content
Snippets Groups Projects
Commit 3bd61c1d authored by Richard Biener's avatar Richard Biener Committed by Richard Biener
Browse files

middle-end/119119 - re-gimplification of empty CTOR assignments

The following testcase runs into a re-gimplification issue during
inlining when processing

  MEM[(struct e *)this_2(D)].a = {};

where re-gimplification does not handle assignments in the same
way than the gimplifier but instead relies on rhs_predicate_for
and gimplifying the RHS standalone.  This fails to handle
special-casing of CTORs.  The is_gimple_mem_rhs_or_call predicate
already handles clobbers but not empty CTORs so we end up in
the fallback code trying to force the CTOR into a separate stmt
using a temporary - but as we have a non-copyable type here that ICEs.

The following generalizes empty CTORs in is_gimple_mem_rhs_or_call
since those need no additional re-gimplification.

	PR middle-end/119119
	* gimplify.cc (is_gimple_mem_rhs_or_call): All empty CTORs
	are OK when not a register type.

	* g++.dg/torture/pr11911.C: New testcase.
parent fdf846fd
No related branches found
No related tags found
No related merge requests found
...@@ -607,7 +607,7 @@ is_gimple_mem_rhs_or_call (tree t) ...@@ -607,7 +607,7 @@ is_gimple_mem_rhs_or_call (tree t)
else else
return (is_gimple_val (t) return (is_gimple_val (t)
|| is_gimple_lvalue (t) || is_gimple_lvalue (t)
|| TREE_CLOBBER_P (t) || (TREE_CODE (t) == CONSTRUCTOR && CONSTRUCTOR_NELTS (t) == 0)
|| TREE_CODE (t) == CALL_EXPR); || TREE_CODE (t) == CALL_EXPR);
} }
   
......
// { dg-do compile }
// { dg-require-effective-target c++17 }
struct b {
int a;
};
struct c {
b d{};
c() = default;
c(c &) = delete;
};
struct e {
c a{};
e() {}
};
inline e f() { return {}; }
struct g {
e cx;
g() : cx{f()} {}
};
void h() { g i; }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment