anchor.diff:          fileUri: enclosingClass.fileUri)
         ..fileOffset = enclosingClass.fileOffset
         ..parent = enclosingClass;
  +  }
  +
  +  /// Returns a string describing the signature of [procedure], along with the
  +  /// class it's in.
  +  ///
  +  /// Only used if [debugCovariance] is `true`.
  +  ///
  +  /// If [class_] is provided, it is used instead of [procedure]'s enclosing
  +  /// class.
  +  String _printProcedure(Procedure procedure, [Class class_]) {
  +    class_ ??= procedure.enclosingClass;
  +    var buffer = new StringBuffer();
  +    procedure.accept(new Printer(buffer));
  +    var text = buffer.toString();
  +    var newlineIndex = text.indexOf('\n');
  +    if (newlineIndex != -1) {
  +      text = text.substring(0, newlineIndex);
  +    }
  +    return '$class_: $text';
     }
   
     /// Determines which inherited member this node resolves to.
  
positive.code:               function.typeParameters[j].isGenericCovariantImpl = true);
          }
        }
      }
    }
  
  
negative.code: import 'package:front_end/src/fasta/type_inference/type_inferrer.dart';
  import 'package:kernel/ast.dart';
  import 'package:kernel/class_hierarchy.dart';
  import 'package:kernel/text/ast_to_text.dart';
  import 'package:kernel/type_algebra.dart';
  import 'package:kernel/type_environment.dart';
  
  /// Set this flag to `true` to cause debugging information about covariance
  /// checks to be printed to standard output.
  const bool debugCovariance = false;
  
  /// Type of a closure which applies a covariance annotation to a class member.
  ///
  