Eric Lemings wrote:
>
>> Travis Vitek wrote:
>> 
>> So you see no problem with the following code failing at 
>> runtime due to misalignment or insufficient space?
>> 
>>   struct incomplete_t;
>> 
>>   // supposed to be 'suitable for use as uninitialized
>>   // storage for any object whose type listed and will
>>   // be at least Len bytes
>>   std::aligned_union<1, incomplete_t>::type aligned_buf;
>> 
>>   struct incomplete_t
>>   {
>>     long double val;
>>     // [...]
>>   };
>> 
>>   void save_value (const long double& v)
>>   {
>>       ((incomplete_t*)&aligned_buf)->val = v;
>>   }
>
>Yeah, that could be problematic...if the standard actually
>allows it.
>

With the wording that is currently provided, I believe that the above
code is completely legal. That is why I brought up the issue in the
first place.

>> 
>> I'm pretty sure that the standard assumes we will use
>> std::alignment_of<> and std::aligned_storage<> to implement
>> std::aligned_union<>. If that is the case, then the 
>> requirement for the type to be complete would be implied.
>
>The only other possible course of action that I see is to check
>for incomplete and other non-alignable types at compile-time
>and generate a diagnostic.  Not sure how you would do that
>with type traits but, if its possible, that might be more
>"well-behaved".

Actually, detection is quite easy. The implementation of
__rw_aligned_union that I wrote a while back should detect it [I use a
union internally you can't put an incomplete type in a union]. Honestly
it would actually be much more trouble to allow it, but I'm pretty sure
it could be done.

I'm hoping that Martin will eventually be able to provide some
clarification or file a defect report for us.

Travis

Reply via email to