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

class Foo extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  operator +(dynamic other) → dynamic
    return null;
}
class Bar extends core::Object {
  constructor named() → void
    : super core::Object::•()
    ;
  operator +(dynamic other) → dynamic
    return null;
}
class IndexTester extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  operator [](dynamic _) → dynamic
    return null;
  operator []=(dynamic _a, dynamic _b) → void {}
}
static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/implicit_new.dart:18:18: Error: Method not found: 'Bar'.
  var y = prefix.Bar();
                 ^^^", "pkg/front_end/testcases/implicit_new.dart:19:10: Error: Method not found: 'Bar'.
  prefix.Bar();
         ^^^"]/* from null */;
static method testNSM() → dynamic {
  dynamic y = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Bar, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Bar, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
}
static method f(dynamic x) → dynamic
  return x;
static method main() → dynamic {
  self::Foo x = new self::Foo::•();
  x = new self::Foo::•();
  self::Bar z = new self::Bar::named();
  z = new self::Bar::named();
  self::f(new self::Foo::•());
  self::f(new self::Foo::•());
  self::f(new self::Bar::named());
  self::f(new self::Bar::named());
  core::List<core::Object> l = <core::Object>[new self::Foo::•(), new self::Bar::named()];
  l = <core::Object>[new self::Foo::•(), new self::Bar::named()];
  core::Map<core::String, core::Object> m = <core::String, core::Object>{"foo": new self::Foo::•(), "bar": new self::Bar::named()};
  m = <core::String, core::Object>{"foo": new self::Foo::•(), "bar": new self::Bar::named()};
  self::IndexTester i = new self::IndexTester::•();
  i.{self::IndexTester::[]}(new self::Foo::•());
  i.{self::IndexTester::[]}(new self::Foo::•());
  i.{self::IndexTester::[]}(new self::Bar::named());
  i.{self::IndexTester::[]}(new self::Bar::named());
  i.{self::IndexTester::[]=}(new self::Foo::•(), null);
  i.{self::IndexTester::[]=}(new self::Foo::•(), null);
  i.{self::IndexTester::[]=}(new self::Bar::named(), null);
  i.{self::IndexTester::[]=}(new self::Bar::named(), null);
  new self::Foo::•().{self::Foo::+}(new self::Bar::named());
  new self::Foo::•().{self::Foo::+}(new self::Bar::named());
  new self::Bar::named().{self::Bar::+}(new self::Foo::•());
  new self::Bar::named().{self::Bar::+}(new self::Foo::•());
}
