https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88118
Bug ID: 88118 Summary: GCC keeps unnecessary calls to new Product: gcc Version: 9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: tiagomacarios at gmail dot com Target Milestone: --- With the code below clang generates: main: # @main mov eax, 2 ret GCC will get to the correct result, but will keep the new calls: main: sub rsp, 8 mov edi, 24 call operator new(unsigned long) mov edi, 24 call operator new(unsigned long) mov edi, 24 call operator new(unsigned long) mov eax, 2 add rsp, 8 ret https://godbolt.org/z/Q3nV2x namespace { struct Node { int value{}; Node* left{}; Node* right{}; constexpr Node(int i=0) noexcept : value(i) {}; }; auto constexpr left = &Node::left; auto constexpr right = &Node::right; template<typename T, typename... TP> constexpr Node* traverse(T np, TP... paths) noexcept { return (np ->* ... ->* paths); } } int main() { Node* const root = new Node{0}; root->left = new Node{1}; root->left->right = new Node{2}; Node* const node = traverse(root, left, right); return node->value; }