------- Comment #92 from pinskia at gcc dot gnu dot org 2007-05-18 18:55 ------- > So if that is not valid, and the placement new case is valid, then what is the > essential difference between the cases? The variable is being accessed via > two > different types. Why is that OK? > void f(double* p) { *(int*)p = 3; long *l = new (p) long; *l = 4; } > void g() { int i; f((double *)&i); }
Because the memory that p was pointing to, stops being an int once a placement new happens. For F, it goes: > void f(double* p) > { p points to an variable that is an int > *(int*)p = 3 access the int via an int. > long *l = new (p) long; The memory is no longer an int, it has become a long, it cannot be accessed as an int no longer as that would be undefined. > *l = 4; Access the memory as a long and since the type is a long, this is well defined. >} Now after this function returns the variable can only be accessed as a long (well and via a character type). Hopefully this explains why this is valid. Now should we do anything about it, I don't know because how often does this happen in real life, I don't know. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29286