Hi Jason,

On 2 Oct 2024, at 0:18, Jason Merrill wrote:

> On 10/1/24 12:44 PM, Simon Martin wrote:
>> Hi Jason,
>>
>> On 30 Sep 2024, at 19:56, Jason Merrill wrote:
>>
>>> On 9/23/24 4:44 AM, Simon Martin wrote:
>>>> Hi Jason,
>>>>
>>>> On 20 Sep 2024, at 18:01, Jason Merrill wrote:
>>>>
>>>>> On 9/20/24 5:21 PM, Simon Martin wrote:
>>>>>> The following code triggers an ICE
>>>>>>
>>>>>> === cut here ===
>>>>>> class base {};
>>>>>> class derived : virtual public base {
>>>>>> public:
>>>>>>      template<typename Arg> constexpr derived(Arg) {}
>>>>>> };
>>>>>> int main() {
>>>>>>      derived obj(1.);
>>>>>> }
>>>>>> === cut here ===
>>>>>>
>>>>>> The problem is that cxx_bind_parameters_in_call ends up 
>>>>>> attempting
>>>>>> to
>>>>
>>>>>> convert a REAL_CST (the first non artificial parameter) to
>>>>>> INTEGER_TYPE
>>>>>> (the type of the __in_chrg parameter), which ICEs.
>>>>>>
>>>>>> This patch teaches cxx_bind_parameters_in_call to handle the
>>>>>> __in_chrg
>>>>>> and __vtt_parm parameters that {con,de}structors might have.
>>>>>>
>>>>>> Note that in the test case, the constructor is not
>>>>>> constexpr-suitable,
>>>>>> however it's OK since it's a template according to my read of
>>>>>> paragraph
>>>>>> (3) of [dcl.constexpr].
>>>>>
>>>>> Agreed.
>>>>>
>>>>> It looks like your patch doesn't correct the mismatching of
>>>>> arguments
>>>>> to parameters that you describe, but at least for now it should be
>>>>> enough to set *non_constant_p and return if we see a VTT or
>>>>> in-charge
>>>>> parameter.
>>>>>
>>>> Thanks, it’s true that my initial patch was wrong in that we’d
>>>> leave
>>>> cxx_bind_parameters_in_call thinking the expression was actually a
>>>> constant expression :-/
>>>>
>>>> The attached revised patch follows your suggestion (thanks!).
>>>> Successfully tested on x86_64-pc-linux-gnu. OK for trunk?
>>>
>>> After this patch I'm seeing a regression on constexpr-dynamic10.C 
>>> with
>>> -fimplicit-constexpr; we also need to give an error here when
>>> (!ctx->quiet).
>> Thanks, good catch. TIL about --stds=impcx...
>>
>> The attached patch fixes the issue, and was successfully tested on
>> x86_64-pc-linux-gnu, including with “make -C gcc -k 
>> check-c++-all”.
>> OK for trunk?
>>
>> Note that it includes a new test that’s basically a copy of
>> constexpr-dynamic10.C, with -fimplicit-constexpr. Is that the right
>> thing to do or should I just leave the test suite as is, knowing that
>> someone/something will run the test suite with --stds=impcx at some
>> point before a release?
>
> I think leave it as is.
OK, it’s simpler :-)
>
>> And the next natural question is whether I should have also tested 
>> with
>> --stds=impcx before my initial submission?
>
> Probably a good idea when messing with constexpr.
ACK.
>
>> https://gcc.gnu.org/contribute.html#testing advises to test with 
>> “make
>> -k check”; maybe we need to also mention check-c++-all for changes 
>> to
>> the C++ front-end?
>
> Sounds good.
I sent 
https://gcc.gnu.org/pipermail/gcc-patches/2024-October/664275.html for 
that.
>
>> +      && constexpr_error (cp_expr_loc_or_input_loc (t),
>> +                          /*constexpr_fundef_p=*/false,
>> +                          "call to non-%<constexpr%> function %qD", fun))
>
> Let's use "error_at" here, like in cxx_eval_call_expression; 
> constexpr_error with fundef_p false is equivalent.
>
> OK with those adjustments.
Thanks. Merged as r15—4026.

Simon

Reply via email to