On Tue, Jan 24, 2017 at 1:31 PM, Nathan Sidwell <nat...@acm.org> wrote:
> On 01/23/2017 04:06 PM, Jason Merrill wrote:
>
>>> In this particular case we've also made the base object the containing
>>> class, not the unnamed struct member.  That means we're looking in the
>>> wrong
>>> CONSTRUCTOR and see CONSTRUCTOR_NO_IMPLICIT_ZERO is true.  Whereas for
>>> the
>>> subobj's CONSTRUCTOR it is false.
>>
>>
>> Why is it false?
>
>
> I thought it was because we're looking at a different level of ctor,
> investigation shows there may be a bug there too. because in one place we
> do:
>      if (*valp == NULL_TREE)
>         {
>           *valp = build_constructor (type, NULL);
>           CONSTRUCTOR_NO_IMPLICIT_ZERO (*valp) = no_zero_init;
> and another we do:
>       if (vec_safe_is_empty (*vec)
>           || (*vec)->last().index != field)
>         {
>           ctor = build_constructor (TREE_TYPE (field), NULL);
>           CONSTRUCTOR_APPEND_ELT (*vec, field, ctor);
>
> However, further looking at this problem, I discovered we're not properly
> checking the initialization of anonymous members.  Once we do that, we
> reject the ctor as a constexpr, because it fails to initialize the 'type'
> member (regardless of bitfieldness).
>
> This patch augments cx_check_missing_mem_inits.  I change the first parm to
> be the CTYPE not the FUN from whence we pull the CTYPE.  That way we don't
> have to cons up an empty CONSTRUCTOR for the recursive case of discovering
> no initializer at all for the anon member.
>
> With this in place we don't try and evaluate the constexpr in the original
> testcase.
>
> ok?

I'm not seeing the patch.

Jason

Reply via email to