anchor.diff:      if (_relayoutSubtreeRoot != this) {
         final parent = this.parent; // TODO(ianh): Remove this once the analyzer is cleverer
         assert(parent is RenderObject);
  -      parent.markNeedsLayout();
  +      if (!_doingThisLayoutWithCallback) {
  +        parent.markNeedsLayout();
  +      } else {
  +        assert(parent._debugDoingThisLayout);
  +      }
         assert(parent == this.parent); // TODO(ianh): Remove this once the analyzer is cleverer
       } else {
         _nodesNeedingLayout.add(this);
  
positive.code:   bool get debugDoingThisLayout => _debugDoingThisLayout;
    static RenderObject _debugActiveLayout = null;
    static RenderObject get debugActiveLayout => _debugActiveLayout;
    bool _debugDoingThisLayoutWithCallback = false;
    bool _debugMutationsLocked = false;
    bool _debugCanParentUseSize;
    bool get debugCanParentUseSize => _debugCanParentUseSize;
    bool get debugCanPerformMutations {
      RenderObject node = this;
      while (true) {
        if (node._debugDoingThisLayoutWithCallback)
          return true;
        if (node._debugMutationsLocked)
          return false;
  
negative.code:       assert(_relayoutSubtreeRoot == this);
        RenderObject debugPreviousActiveLayout;
        assert(!_debugMutationsLocked);
        assert(!_doingThisLayoutWithCallback);
        assert(_debugCanParentUseSize != null);
        assert(() {
          _debugMutationsLocked = true;
  