// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

interface A {
}

interface B extends A {
}

interface C extends A {
}

interface D {
}

class Super {
  A field;
  A get accessor { return null; }
  void set accessor(A newValue) { }
  A method() { return null; }
  
  var untypedField;
  get untypedAccessor { return null; }
  set untypedAccessor(newValue) { }
  untypedMethod() { return null; }
}

class Sub extends Super {
  B field;
  B get accessor { return null; }
  void set accessor(B newValue) { }
  B method() { return null; }
  
  B untypedField;
  B get untypedAccessor { return null; }
  set untypedAccessor(B newValue) { }
  B untypedMethod() { return null; }
  
  B b;
  C c;
  D d;
}
