Justin Lebar <justin.lebar@xxxxxxxxx> writes: > I'm trying to enable -fstrict-aliasing when building Firefox. One > class in particular is proving difficult to make work properly. We > use this class for lazily allocating objects on the stack. > > Code is included at the end of this e-mail. When I compile with -O2 > -Wall, I get > > main.cpp:20: warning: dereferencing pointer ‘this.0’ does break > strict-aliasing rules > > It seems that this warning is due to the cast in ~Lazy(). Note that I > can't rewrite Lazy<T>'s storage as a union because T may have a > constructor -- the whole purpose of the Lazy class is to let me > stack-allocate T without immediately calling its constructor. > > Also, changing > > T* obj = reinterpret_cast<T*>(bytes); > > to > > T* __attribute__((may_alias)) obj = reinterpret_cast<T*>(bytes); > > doesn't eliminate the warning. > > I'm out of ideas. Is there a way to accomplish what I'm trying to do > here without disabling strict aliasing? I'd hate to give up now. Your code looks OK to me by the C++ aliasing rules--at least it would look OK if your program actually called construct. In this case I think the warning is incorrect. Current mainline does not seem to give that warning. Ian