library;
//
// Problems in library:
//
// pkg/front_end/testcases/general/expressions.dart:74:16: Error: Method not found: 'int.toString'.
//     print(int?.toString());
//                ^^^^^^^^
//
import self as self;
import "dart:core" as core;

static method foo({dynamic fisk = #C1}) → dynamic {
  core::print(fisk);
}
static method caller(dynamic f) → dynamic {
  f{dynamic}.call();
}
static method main() → dynamic {
  core::int* i = 0;
  core::print(i =={core::num::==}{(core::Object*) →* core::bool*} 1 ?{core::String*} "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; ) {
  }
  core::List<core::String*>* list = <core::String*>["Hello, World!"];
  core::print(list.{core::List::[]}(i){(core::int*) →* core::String*});
  list.{core::List::[]=}(i, "Hello, Brave New World!"){(core::int*, core::String*) →* void};
  core::print(list.{core::List::[]}(i){(core::int*) →* core::String*});
  i = 87;
  core::print(i.{core::int::unary-}(){() →* core::int*});
  core::print(i.{core::int::~}(){() →* core::int*});
  core::print(!(i =={core::num::==}{(core::Object*) →* core::bool*} 42));
  core::print(i = i.{core::num::-}(1){(core::num*) →* core::int*});
  core::print(i = i.{core::num::+}(1){(core::num*) →* core::int*});
  core::print(let final core::int* #t1 = i in let final core::int* #t2 = i = #t1.{core::num::-}(1){(core::num*) →* core::int*} in #t1);
  core::print(let final core::int* #t3 = i in let final core::int* #t4 = i = #t3.{core::num::+}(1){(core::num*) →* core::int*} in #t3);
  core::print(new core::Object::•());
  core::print(#C2);
  core::print(core::List::filled<core::String*>(2, null).{core::Object::runtimeType}{core::Type*});
  self::foo(fisk: "Blorp gulp");
  function f() → Null {
    core::print("f was called");
  }
  self::caller(f);
  self::caller(() → Null {
    core::print("<anon> was called");
  });
  function g([dynamic message = #C1]) → Null {
    core::print(message);
  }
  g("Hello, World"){([dynamic]) →* Null};
  self::caller(([dynamic x = #C1]) → Null {
    core::print("<anon> was called with ${x}");
  });
  function h({dynamic message = #C1}) → Null {
    core::print(message);
  }
  h(message: "Hello, World"){({message: dynamic}) →* Null};
  self::caller(({dynamic x = #C1}) → Null {
    core::print("<anon> was called with ${x}");
  });
  core::print((#C3).{core::Type::toString}(){() →* core::String*});
  core::print(#C3);
  core::print(let final core::Type* #t5 = #C3 in block {
    #t5.{core::Type::toString}(){() →* core::String*};
  } =>#t5);
  try {
    core::print(invalid-expression "pkg/front_end/testcases/general/expressions.dart:74:16: Error: Method not found: 'int.toString'.
    print(int?.toString());
               ^^^^^^^^");
    throw "Shouldn't work";
  }
  on core::NoSuchMethodError* catch(final core::NoSuchMethodError* e) {
    core::print("As expected: ${e}");
  }
  core::print(core::int::parse("42"));
}

constants  {
  #C1 = null
  #C2 = core::Object {}
  #C3 = TypeLiteralConstant(core::int*)
}


Constructor coverage from constants:
org-dartlang-testcase:///expressions.dart:
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
