| Index: tests/language/type_promotion_closure_test.dart
 | 
| diff --git a/tests/language/type_promotion_closure_test.dart b/tests/language/type_promotion_closure_test.dart
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..5c32a77a546ff01e363ae4c4b93b1635fc3eddde
 | 
| --- /dev/null
 | 
| +++ b/tests/language/type_promotion_closure_test.dart
 | 
| @@ -0,0 +1,161 @@
 | 
| +// Copyright (c) 2013, 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.
 | 
| +
 | 
| +// Test type promotion of locals potentially mutated in closures.
 | 
| +
 | 
| +class A {
 | 
| +  var a = "a";
 | 
| +  A operator +(int i) => this;
 | 
| +}
 | 
| +class B extends A {
 | 
| +  var b = "b";
 | 
| +}
 | 
| +class C extends B {
 | 
| +  var c = "c";
 | 
| +}
 | 
| +class D extends A {
 | 
| +  var d = "d";
 | 
| +}
 | 
| +class E implements C, D {
 | 
| +  var a = "";
 | 
| +  var b = "";
 | 
| +  var c = "";
 | 
| +  var d = "";
 | 
| +}
 | 
| +
 | 
| +func(x) => true;
 | 
| +
 | 
| +void main() {
 | 
| +  test1();
 | 
| +  test2();
 | 
| +  test3();
 | 
| +  test4();
 | 
| +  test5();
 | 
| +  test6();
 | 
| +  test7();
 | 
| +  test8();
 | 
| +  test9();
 | 
| +  test10();
 | 
| +  test11();
 | 
| +  test12();
 | 
| +}
 | 
| +
 | 
| +void test1() {
 | 
| +  A a = new E();
 | 
| +  if (a is B) {
 | 
| +    print(a.a);
 | 
| +    print(a.b); /// 01: static type warning
 | 
| +  }
 | 
| +  void foo() {
 | 
| +    a = new D();
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +void test2() {
 | 
| +  A a = new E();
 | 
| +  void foo() {
 | 
| +    a = new D();
 | 
| +  }
 | 
| +  if (a is B) {
 | 
| +    print(a.a);
 | 
| +    print(a.b); /// 02: static type warning
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +void test3() {
 | 
| +  A a = new E();
 | 
| +  void foo() {
 | 
| +    a = new D();
 | 
| +  }
 | 
| +  if (a is B) {
 | 
| +    print(a.a);
 | 
| +    print(a.b); /// 03: static type warning
 | 
| +    void foo() {
 | 
| +      a = new D();
 | 
| +    }
 | 
| +    print(a.a);
 | 
| +    print(a.b); /// 04: static type warning
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +void test4() {
 | 
| +  A a = new E();
 | 
| +  if (a is B) {
 | 
| +    func(() => a.b); /// 05: ok
 | 
| +    print(a.a);
 | 
| +    print(a.b);
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +void test5() {
 | 
| +  A a = new E();
 | 
| +  if (a is B) {
 | 
| +    func(() => a.b); /// 06: static type warning
 | 
| +    print(a.a);
 | 
| +  }
 | 
| +  a = null;
 | 
| +}
 | 
| +
 | 
| +void test6() {
 | 
| +  A a = new E();
 | 
| +  if (a is B) {
 | 
| +    func(() => a);
 | 
| +    print(a.a);
 | 
| +    print(a.b); /// 07: static type warning
 | 
| +  }
 | 
| +  a = null;
 | 
| +}
 | 
| +
 | 
| +void test7() {
 | 
| +  A a = new E();
 | 
| +  if (a is B && func(() => a)) {
 | 
| +    print(a.a);
 | 
| +    print(a.b); /// 08: ok
 | 
| +  }
 | 
| +  a = null;
 | 
| +}
 | 
| +
 | 
| +void test8() {
 | 
| +  A a = new E();
 | 
| +  if (a is B
 | 
| +      && func(() => a.b) /// 09: static type warning
 | 
| +                        ) {
 | 
| +    print(a.a);
 | 
| +  }
 | 
| +  a = null;
 | 
| +}
 | 
| +
 | 
| +void test9() {
 | 
| +  A a = new E();
 | 
| +  var b = a is B ? func(() => a.b) : false; /// 10: static type warning
 | 
| +  a = null;
 | 
| +}
 | 
| +
 | 
| +void test10() {
 | 
| +  List<A> a = <E>[new E()];
 | 
| +  if (a is List<B>) {
 | 
| +    func(() => a[0]);
 | 
| +    print(a[0].b); /// 11: static type warning
 | 
| +  }
 | 
| +  a = null;
 | 
| +}
 | 
| +
 | 
| +void test11() {
 | 
| +  List<A> a = <E>[new E()];
 | 
| +  if (a is List<B>) {
 | 
| +    func(() => a[0] = null);
 | 
| +    print(a[0].b); /// 12: static type warning
 | 
| +  }
 | 
| +  a = null;
 | 
| +}
 | 
| +
 | 
| +void test12() {
 | 
| +  A a = new E();
 | 
| +  if (a is B) {
 | 
| +    func(() => a++);
 | 
| +    print(a.a);
 | 
| +    print(a.b); /// 13: static type warning
 | 
| +  }
 | 
| +  a = null;
 | 
| +}
 | 
| 
 |