------- Comment #153 from rguenther at suse dot de  2007-05-24 09:03 -------
Subject: Re:  [4.0/4.1/4.2/4.3 Regression] placement
 new does not change the dynamic type as it should

On Thu, 23 May 2007, gdr at cs dot tamu dot edu wrote:

> ------- Comment #151 from gdr at cs dot tamu dot edu  2007-05-24 00:58 -------
> Subject: Re:  [4.0/4.1/4.2/4.3 Regression] placement new does not change the
> dynamic type as it should
> 
> "rguenther at suse dot de" <[EMAIL PROTECTED]> writes:
> 
> [...]
> 
> | > Gaby's model says that we know less about dynamic types than we
> | > presently think we do, because there might be a union out there
> | > somewhere.  (Fortunately, as Joseph points out, C99 has already answered
> | > this question.  Surely we can agree that making C99 and C++ different in
> | > this respect is a bad idea.)
> | 
> | I don't think dragging in unions helps us here ;)  Maybe Gaby can clarify
> | if and how unions relate here, but I didn't percieve any previous comment
> | as making implicit unions relevant here apart from what GCC and
> | apperantly C99 agree to.
> 
> I believe we all agree that placement new changes the dynamic type.
> 
> 
> I brought in the union example to point of a fundamental problem with
> this issue.  I have been following the discussion without saying much,
> until I realized that the interpretation Mark was offering is a
> redefinition of the C++ object model that conflicts with the current
> standard text. That was the point of the union example.  In the
> example 
> 
>     void f(int* p, double* q) {
>         *p = 42;
>         *q = 3.12;
>     }
> 
> All we know is that after the store to *p, the object there will have
> type int (if it did not already have one).  Similarly, for the store
> to *q, the object there will have type double.  Can the stores be
> rearranged?  Under the current C++ rules (which were inherited from
> C90, and not C99) "yes" if we know that the objects are distinct.
> Can we infer the disjoinctness from the types?  "Not always" under
> current C++ rules for union, and in this specific case, the answer is 
> "no".

Right, current C++ rules forbid exchanging the stores.  But I read it
as it is because the stores may start lifetime of a different
dynamically typed object on the same memory location which p and q
may point to.  Whether there is a union "placed" at this memory
location is irrelevant.  I read the standard as if the above is
equivalent to

  *(new (p) int) = 42;
  *(new (q) double) = 3.12;

which as long as we cannot prove that p does not point to the
same memory location as q means that we cannot reorder the stores.

Richard.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29286

Reply via email to