// Formatted problems:
//
// pkg/front_end/testcases/implicit_new.dart:18:18: Warning: Method not found: 'Bar'.
//   var y = prefix.Bar();
//                  ^^^
//
// pkg/front_end/testcases/implicit_new.dart:19:10: Warning: Method not found: 'Bar'.
//   prefix.Bar();
//          ^^^

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

class Foo extends core::Object {
  synthetic constructor •() → self::Foo
    : super core::Object::•()
    ;
  operator +(dynamic other) → dynamic
    return null;
}
class Bar extends core::Object {
  constructor named() → self::Bar
    : super core::Object::•()
    ;
  operator +(dynamic other) → dynamic
    return null;
}
class IndexTester extends core::Object {
  synthetic constructor •() → self::IndexTester
    : super core::Object::•()
    ;
  operator [](dynamic _) → dynamic
    return null;
  operator []=(dynamic _a, dynamic _b) → void {}
}
static method testNSM() → dynamic {
  dynamic y = let dynamic _ = null in 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>{})));
  let dynamic _ = null in 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 {
  dynamic x = new self::Foo::•();
  x = new self::Foo::•();
  dynamic 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());
  dynamic l = <dynamic>[new self::Foo::•(), new self::Bar::named()];
  l = <dynamic>[new self::Foo::•(), new self::Bar::named()];
  dynamic m = <dynamic, dynamic>{"foo": new self::Foo::•(), "bar": new self::Bar::named()};
  m = <dynamic, dynamic>{"foo": new self::Foo::•(), "bar": new self::Bar::named()};
  dynamic i = new self::IndexTester::•();
  i.[](new self::Foo::•());
  i.[](new self::Foo::•());
  i.[](new self::Bar::named());
  i.[](new self::Bar::named());
  i.[]=(new self::Foo::•(), null);
  i.[]=(new self::Foo::•(), null);
  i.[]=(new self::Bar::named(), null);
  i.[]=(new self::Bar::named(), null);
  new self::Foo::•().+(new self::Bar::named());
  new self::Foo::•().+(new self::Bar::named());
  new self::Bar::named().+(new self::Foo::•());
  new self::Bar::named().+(new self::Foo::•());
}
