// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

/*@testedFeatures=inference*/
library test;

class C {}

class D {}

class E {}

void test(void f()) {
  try {
    var /*@type=int*/ x = 0;
    f();
  } on C {
    var /*@type=int*/ x = 0;
  } on D catch (x) {
    var /*@type=D*/ x2 = x;
  } on E catch (x, y) {
    var /*@type=E*/ x2 = x;
    var /*@type=StackTrace*/ y2 = y;
  } catch (x, y) {
    var /*@type=Object*/ x2 = x;
    var /*@type=StackTrace*/ y2 = y;
  } finally {
    var /*@type=int*/ x = 0;
  }
}

main() {}
