| // 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. |
| |
| // @dart = 2.9 |
| |
| // Regression test for dart2js and its SsaConstructionFieldTypes |
| // phase. |
| |
| import "package:expect/expect.dart"; |
| |
| class A { |
| var _field; |
| final other; |
| get field => _field; |
| A(this._field) : other = null; |
| A.fromOther(this.other) { |
| _field = other.field; |
| } |
| } |
| |
| class B { |
| var a; |
| B() { |
| try { |
| // Defeat inlining. |
| // An inlined generative constructor call used to confuse |
| // dart2js. |
| a = new A(42); |
| } catch (e) { |
| rethrow; |
| } |
| } |
| } |
| |
| var array = [new A(42), new B()]; |
| |
| main() { |
| // Surround the call to [analyzeAfterB] by two [: new B() :] calls |
| // to ensure the [B] constructor will be analyzed first. |
| new B(); |
| var a = analyzeAfterB(); |
| new B(); |
| Expect.equals(42, a._field); |
| } |
| |
| analyzeAfterB() { |
| try { |
| // Defeat inlining. |
| return new A.fromOther(array[0]); |
| } catch (e) { |
| rethrow; |
| } |
| } |