// Formatted problems:
//
// pkg/front_end/testcases/expressions.dart:74:16: Warning: Method not found: 'int.toString'.
//     print(int?.toString());
//                ^^^^^^^^

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

static method foo({dynamic fisk = null}) → dynamic {
  core::print(fisk);
}
static method caller(dynamic f) → dynamic {
  f.call();
}
static method main() → dynamic {
  core::int i = 0;
  core::print(i.==(1) ? "bad" : "good");
  core::print("${i}");
  core::print("'${i}'");
  core::print(" '${i}' ");
  core::print(" '${i}' '${i}'");
  core::print(" '${i}' '${i}'");
  core::print("foobar");
  core::print(" '${i}' '${i}' '${i}' '${i}'");
  try {
    throw "fisk";
  }
  on core::String catch(final core::String e, final core::StackTrace s) {
    core::print(e);
    if(!s.==(null))
      core::print(s);
  }
  for (; false; ) {
  }
  dynamic list = <dynamic>["Hello, World!"];
  core::print(list.[](i));
  list.[]=(i, "Hello, Brave New World!");
  core::print(list.[](i));
  i = 87;
  core::print(i.unary-());
  core::print(i.~());
  core::print(!i.==(42));
  core::print(i = i.-(1));
  core::print(i = i.+(1));
  core::print(let final dynamic #t1 = i in let final dynamic #t2 = i = #t1.-(1) in #t1);
  core::print(let final dynamic #t3 = i in let final dynamic #t4 = i = #t3.+(1) in #t3);
  core::print(new core::Object::•());
  core::print(const core::Object::•());
  core::print(core::List::•<core::String>(2).runtimeType);
  self::foo(fisk: "Blorp gulp");
  function f() → dynamic {
    core::print("f was called");
  }
  self::caller(f);
  self::caller(() → dynamic {
    core::print("<anon> was called");
  });
  function g([dynamic message = null]) → dynamic {
    core::print(message);
  }
  g.call("Hello, World");
  self::caller(([dynamic x = null]) → dynamic {
    core::print("<anon> was called with ${x}");
  });
  function h({dynamic message = null}) → dynamic {
    core::print(message);
  }
  h.call(message: "Hello, World");
  self::caller(({dynamic x = null}) → dynamic {
    core::print("<anon> was called with ${x}");
  });
  core::print(core::int.toString());
  core::print(core::int);
  core::print(let final dynamic #t5 = core::int in let final dynamic #t6 = #t5.toString() in #t5);
  try {
    core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#int.toString, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
    throw "Shouldn't work";
  }
  on core::NoSuchMethodError catch(final core::NoSuchMethodError e) {
    core::print("As expected: ${e}");
  }
  core::print(core::int::parse("42"));
}
