|  | // Copyright (c) 2015, 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=--optimization_counter_threshold=5 --no-background_compilation | 
|  | // | 
|  | // Basic null-aware operator test that invokes the optimizing compiler. | 
|  |  | 
|  | import "package:expect/expect.dart"; | 
|  |  | 
|  | class C { | 
|  | C(this.f); | 
|  | var f; | 
|  | m(a) => a; | 
|  | } | 
|  |  | 
|  | bomb() { | 
|  | Expect.fail('Should not be executed'); | 
|  | return 100; | 
|  | } | 
|  |  | 
|  | getNull() => null; | 
|  |  | 
|  | test() { | 
|  | var c; | 
|  | var d = new C(5); | 
|  | Expect.equals(null, c?.m(bomb())); | 
|  | Expect.equals(null, getNull()?.anything(bomb())); | 
|  | Expect.equals(1, d?.m(1)); | 
|  |  | 
|  | Expect.equals(1, new C(1)?.f); | 
|  | Expect.equals(null, c?.v); | 
|  | Expect.equals(10, c ?? 10); | 
|  | Expect.equals(d, d ?? bomb()); | 
|  |  | 
|  | var e; | 
|  | // The assignment to e is not executed since d != null. | 
|  | d ??= e ??= new C(100); | 
|  | Expect.equals(null, e); | 
|  | e ??= new C(100); | 
|  | Expect.equals(100, e?.f); | 
|  | e?.f ??= 200; | 
|  | Expect.equals(100, e?.f); | 
|  |  | 
|  | e.f = null; | 
|  | e?.f ??= 200; | 
|  | Expect.equals(200, e?.f); | 
|  |  | 
|  | c?.f ??= 400; | 
|  | Expect.equals(null, c?.f); | 
|  | Expect.equals(null, c?.f++); | 
|  | e?.f++; | 
|  | Expect.equals(201, e.f); | 
|  |  | 
|  | var x = 5 ?? bomb(); | 
|  | Expect.equals(5, x); | 
|  |  | 
|  | var y; | 
|  | x = y ?? 1; | 
|  | Expect.equals(1, x); | 
|  | Expect.equals(null, y); | 
|  | } | 
|  |  | 
|  | // Check that instructions without result do not crash. | 
|  | test2() { | 
|  | var c; | 
|  | c?.v; | 
|  | c?.m(bomb()); | 
|  | } | 
|  |  | 
|  | main() { | 
|  | for (int i = 0; i < 10; i++) { | 
|  | test(); | 
|  | test2(); | 
|  | } | 
|  | } |