| // Copyright (c) 2020, 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. |
| // |
| // VMOptions=--deterministic --optimization-counter-threshold=10 --unbox-numeric-fields |
| |
| import 'package:expect/expect.dart'; |
| |
| const magicDouble = 42.0; |
| |
| class C { |
| double d = magicDouble; |
| } |
| |
| class NoopSink { |
| void leak(C c) {} |
| } |
| |
| class RealSink { |
| static C o; |
| void leak(C c) { |
| o = c; |
| } |
| } |
| |
| void foo(sink) { |
| sink.leak(C()); |
| } |
| |
| void main(List<String> args) { |
| var c = C(); |
| for (var i = 0; i < 100; i++) c.d = 2.0; |
| |
| for (var i = 0; i < 100; i++) { |
| foo(NoopSink()); |
| } |
| |
| foo(RealSink()); |
| RealSink.o.d += 1234.0; |
| final TWO = args.length > 1024 ? "~" : 2; |
| Expect.equals(double.parse("4${TWO}.0"), magicDouble); |
| } |