http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54770
Bug #: 54770 Summary: sibling call optimization is not applied where it ought to be Classification: Unclassified Product: gcc Version: 4.5.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassig...@gcc.gnu.org ReportedBy: andy.m.j...@gmail.com Created attachment 28317 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=28317 Source file "g++ -O2 -Wall -Wextra" fails to apply the sibling call optimization in the attached program. The interesting portion is shown below: struct MainNode : Node { MainNode(NodePtr const & arg_) : Node(), arg(arg_) {} virtual ~MainNode() {} NodePtr arg; virtual void H() { // Extra scope guarantees there are no destructors following the tail call. { NodePtr tmp(arg); this->~Node(); new(this) MainNode(tmp); } this->H(); // sibling call } }; NodePtr is a class type. If it is simply changed to Node *, then the optimization is applied.