anchor.diff:    Set<_FlowAssertion> computeNodeValue(Id id, AstNode node) {
       Set<_FlowAssertion> result = {};
       if (_flowResult.nullableNodes.contains(node)) {
  -      // We sometimes erroneously annotate a node as both nullable and
  -      // non-nullable.  Ignore for now.  TODO(paulberry): fix this.
  -      if (!_flowResult.nonNullableNodes.contains(node)) {
  -        result.add(_FlowAssertion.nullable);
  -      }
  +      result.add(_FlowAssertion.nullable);
       }
       if (_flowResult.nonNullableNodes.contains(node)) {
  -      // We sometimes erroneously annotate a node as both nullable and
  -      // non-nullable.  Ignore for now.  TODO(paulberry): fix this.
  -      if (!_flowResult.nullableNodes.contains(node)) {
  -        result.add(_FlowAssertion.nonNullable);
  -      }
  +      result.add(_FlowAssertion.nonNullable);
       }
       if (_flowResult.unreachableNodes.contains(node)) {
         result.add(_FlowAssertion.unreachable);
  
positive.code:   test_logicalOr_leftTrue() async {
      await trackCode(r'''
  void f(int x) {
    true || /*unreachable*/ (x == 1);
  }
  ''');
    }
  
negative.code:   /*stmt: unreachable*/ do {} while (b);
    /*stmt: unreachable*/ for (;;) {}
    /*stmt: unreachable*/ for (var _ in []) {}
    // TODO(paulberry): b shouldn't be considered both nullable and non-nullable.
    /*stmt: unreachable*/ if (/*nonNullable,nullable*/b) {}
    // TODO(paulberry): i shouldn't be considered both nullable and non-nullable.
    /*stmt: unreachable*/ switch (/*nonNullable,nullable*/i) {}
    /*stmt: unreachable*/ try {} finally {}
    // TODO(paulberry): b shouldn't be considered both nullable and non-nullable.
    /*stmt: unreachable*/ while (/*nonNullable,nullable*/b) {}
  }
  ''');
    }
  