This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: C++ PATCH for c++/48089 (ICE with invalid constexpr ctor)
On Wed, Mar 16, 2011 at 10:02 PM, Jason Merrill <jason@redhat.com> wrote:
> On 03/16/2011 10:43 PM, Gabriel Dos Reis wrote:
>>
>> The real problem is that the data member of the object is not initialized.
>> Fully constructed subobjects in constexpr constructor are still
>> be potential constant expressions.
>> For example, we should not reject
>>
>> ? ? ? struct S {
>> ? ? ? ? ? ?int i;
>> ? ? ? ? ? ?int j;
>> ? ? ? ? ? ?constexpr S(int a) : i(a), j(i*i) { }
>> ? ? ? };
>
> I thought about that, but it seems to me that the implementation complexity
> for supporting that usage would be much higher than it is worth. ?Nowhere
> else in constant expression evaluation do we have to deal with assigning a
> value at one point and then getting it back later.
A base class subobject of a literal class has similar property.
I am not sure we need more infrastructure or more complexity
in the implementation. The (C++98) language already requires
us to initialize subobjects in their order of declaration. That is what
we do here. All we need is to check that a member, whose value
is being used in the initialization of another member
(which might be itself like in this PR) is initialized. When we look up
`this' in the evaluation environment, we can tell whether a particular
slot has been initialized.
-- Gaby