https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78193

--- Comment #4 from Eric Botcazou <ebotcazou at gcc dot gnu.org> ---
> This looks related to the ABI and was introduced by:
> 
> r241765 | jason | 2016-11-02 02:50:29 +0100 (Wed, 02 Nov 2016) | 53 lines
> 
>         Implement P0136R1, Rewording inheriting constructors.

The problem comes from build_over_call:

  if (current_function_decl
      && flag_new_inheriting_ctors
      && DECL_INHERITED_CTOR (current_function_decl)
      && cand->num_convs)
    /* Don't introduce copies when passing arguments along to the inherited
       constructor.  */
    CALL_FROM_THUNK_P (call) = true;

For the inherited constructor:

B::B(moveonly) [inherited from A] (struct B * const this, struct moveonly
D.1999)
{
  struct moveonly D.2080;
  struct moveonly D.2053;

  <bb 2>:
  A::A (this_2(D), D.2080);
  return;

}

D.2080 is passed indirectly in the call but was not initially TREE_ADDRESSABLE
so its RTL was already set to a REG before mark_addressable is invoked on it.

On the contrary, when CALL_FROM_THUNK_P is not set, a stack temporary is built
and passed in the call instead, which is naturally addressable.

Reply via email to