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

class C extends core::Object {
  synthetic constructor •() → self::C*
    : super core::Object::•()
    ;
}
class D extends core::Object {
  synthetic constructor •() → self::D*
    : super core::Object::•()
    ;
}
class E extends core::Object {
  synthetic constructor •() → self::E*
    : super core::Object::•()
    ;
}
static method test(() →* void f) → void {
  try {
    dynamic x = 0;
    f.call();
  }
  on self::C* catch(no-exception-var) {
    dynamic x = 0;
  }
  on self::D* catch(final self::D* x) {
    dynamic x2 = x;
  }
  on self::E* catch(final self::E* x, final core::StackTrace* y) {
    dynamic x2 = x;
    dynamic y2 = y;
  }
  on dynamic catch(final dynamic x, final core::StackTrace* y) {
    dynamic x2 = x;
    dynamic y2 = y;
  }
}
static method main() → dynamic {}
