anchor.diff:    }
   
     // Returns the child which should be retained as the child of this node.
  -  UINode _syncChild(UINode node, UINode oldNode, dynamic slot) {
  -    assert(node != null);
  +  UINode syncChild(UINode node, UINode oldNode, dynamic slot) {
  +
  +    if (node == oldNode) {
  +      _traceSync(_SyncOperation.IDENTICAL, node == null ? '*null*' : node._key);
  +      return node; // Nothing to do. Subtrees must be identical.
  +    }
  +
  +    if (node == null) {
  +      // the child in this slot has gone away
  +      removeChild(oldNode);
  +      return null;
  +    }
       assert(oldNode == null || node._key == oldNode._key);
  -
  -    if (node == oldNode) {
  -      _traceSync(_SyncOperation.IDENTICAL, node._key);
  -      return node; // Nothing to do. Subtrees must be identical.
  -    }
   
       // TODO(rafaelw): This eagerly removes the old DOM. It may be that a
       // new component was built that could re-use some of it. Consider
  
positive.code:     UINode oldNode = null;
  
      void sync(int atIndex) {
        children[atIndex] = _syncChild(currentNode, oldNode, nextSibling);
        assert(children[atIndex] != null);
      }
  
  
negative.code: 
    void _sync(UINode old, dynamic slot) {
      UINode oldContent = old == null ? null : (old as ContentNode).content;
      content = syncChild(content, oldContent, slot);
      assert(content.root != null);
      root = content.root;
    }
  