[C++ Patch] PR 83921 ("[7/8 Regression] GCC rejects constexpr initialization of empty aggregate")

Jason Merrill jason@redhat.com
Tue Jan 23 18:01:00 GMT 2018


On 01/22/2018 05:13 PM, Paolo Carlini wrote:
> Hi again,
> 
> On 22/01/2018 22:50, Paolo Carlini wrote:
>> Ok. The below passes the C++ testsuite and I'm finishing testing it. 
>> Therefore, as you already hinted to, we can now say that what was 
>> *really* missing from potential_constant_expression_1 was the use of 
>> default_init_uninitialized_part, which does all the non-trivial work 
>> besides the later !DECL_NONTRIVIALLY_INITIALIZED_P check. 
>> check_for_uninitialized_const_var also provides the informs, which 
>> were completely missing.
> Grrr. Testing the library revealed immediately the failure of 
> 18_support/byte/ops.cc, because in constexpr_context_p == true, thus 
> from potential_constant_expression_1, the case CP_TYPE_CONST_P triggers. 
> I guess we really want to keep the existing constexpr_context_p == false 
> cases separate. I'm therefore restarting testing with the below.

> +      && ((!constexpr_context_p
> +	   && (CP_TYPE_CONST_P (type) || var_in_constexpr_fn (decl)))
> +	  || (constexpr_context_p && !DECL_NONTRIVIALLY_INITIALIZED_P (decl)))
>        && !DECL_INITIAL (decl))

I think I'd replace the DECL_INITIAL check with 
DECL_NONTRIVIALLY_INITIALIZED_P, which seems more precise.  So we ought 
to be ok with the simpler

&& (constexpr_context_p
     || CP_TYPE_CONST_P (type) || var_in_constexpr_fn (decl))
&& !DECL_NONTRIVIALLY_INITIALIZED_P (decl))

Jason



More information about the Gcc-patches mailing list