http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48446
Richard Guenther <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |ice-on-valid-code Status|UNCONFIRMED |NEW Last reconfirmed| |2011.04.05 11:13:04 Ever Confirmed|0 |1 Known to fail| |4.3.5, 4.5.2, 4.6.0 --- Comment #1 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-04-05 11:13:04 UTC --- Confirmed. Seems to have always crashed. ICC accepts it. Reduced testcase: namespace std { typedef long unsigned int size_t; } typedef unsigned char uint8_t; template<typename T> class RefPtr { public: ~RefPtr(); T *operator->() const; }; class Message { public: typedef RefPtr<Message> Ptr; static Ptr create(const void *data, std::size_t len); }; template<std::size_t N> class BitArray { public: static const std::size_t byte_count = (N + 7) / 8; }; class Recipient { public: typedef RefPtr<Recipient> Ptr; BitArray<80> data; }; class Sender { Recipient::Ptr recipient(unsigned int i); void flush(); }; void Sender::flush() { uint8_t buffer[64 / (recipient(0)->data.byte_count + 2)][recipient(0)->data.byte_count + 2]; std::size_t wptr = 0; if (wptr == sizeof(buffer) / sizeof(*buffer)) { Message::Ptr msg = Message::create(buffer, wptr * sizeof(buffer[0])); } }