library test;
import self as self;
import "dart:core" as core;

class C extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  method test() → void {
    dynamic v1 = super.foo(self::f<dynamic>());
    dynamic v2 = super.bar;
    dynamic v3 = super.[](0);
    dynamic v4 = super.bar = self::f<dynamic>();
    dynamic v5 = let final core::int #t1 = 0 in let final dynamic #t2 = self::f<dynamic>() in let final void #t3 = super.[]=(#t1, #t2) in #t2;
  }
}
static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/unresolved_super.dart:12:38: Error: Superclass has no method named 'foo'.
    var /*@type=dynamic*/ v1 = super.foo(/*@typeArgs=dynamic*/ f());
                                     ^^^", "pkg/front_end/testcases/inference/unresolved_super.dart:13:38: Error: Superclass has no getter named 'bar'.
    var /*@type=dynamic*/ v2 = super.bar;
                                     ^^^", "pkg/front_end/testcases/inference/unresolved_super.dart:14:37: Error: Superclass has no method named '[]'.
    var /*@type=dynamic*/ v3 = super[0];
                                    ^", "pkg/front_end/testcases/inference/unresolved_super.dart:15:38: Error: Superclass has no setter named 'bar'.
    var /*@type=dynamic*/ v4 = super.bar = /*@typeArgs=dynamic*/ f();
                                     ^^^", "pkg/front_end/testcases/inference/unresolved_super.dart:16:37: Error: Superclass has no method named '[]='.
    var /*@type=dynamic*/ v5 = super[0] = /*@typeArgs=dynamic*/ f();
                                    ^"]/* from null */;
static method f<T extends core::Object>() → self::f::T
  return null;
static method main() → dynamic {}
