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
    try {
      core::int* x = 0;
      f.call();
    }
    on self::C* catch(no-exception-var) {
      core::int* x = 0;
    }
    on self::D* catch(final self::D* x) {
      self::D* x2 = x;
    }
    on self::E* catch(final self::E* x, final core::StackTrace* y) {
      self::E* x2 = x;
      core::StackTrace* y2 = y;
    }
    on dynamic catch(final dynamic x, final core::StackTrace* y) {
      dynamic x2 = x;
      core::StackTrace* y2 = y;
    }
  finally {
    core::int* x = 0;
  }
}
static method main() → dynamic {}
