|  | // 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 | 
|  | // | 
|  | // 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) as C?; | 
|  | Expect.equals(null, c?.m(bomb())); | 
|  | Expect.equals(null, getNull()?.anything(bomb())); | 
|  | Expect.equals(1, d?.m(1)); | 
|  |  | 
|  | var c2 = new C(1) as C?; | 
|  | Expect.equals(1, c2?.f); | 
|  | Expect.equals(null, c?.v); | 
|  | Expect.equals(10, c ?? 10); | 
|  | Expect.equals(d, d ?? bomb()); | 
|  | var list = [[3]] as List<List<int>>?; | 
|  | Expect.equals( | 
|  | 3, | 
|  | list?.expand((i) => i).toList()[0]); | 
|  | Expect.equals(null, (null as dynamic)?.expand((i) => i)?.toList()); | 
|  |  | 
|  | 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 five = 5 as int?; | 
|  | var x = five ?? bomb(); | 
|  | } | 
|  |  | 
|  | // Check that instructions without result do not crash. | 
|  | test2() { | 
|  | var c; | 
|  | c?.v; | 
|  | c?.m(bomb()); | 
|  | } | 
|  |  | 
|  | class Bar { | 
|  | String? s; | 
|  | } | 
|  |  | 
|  | class Foo { | 
|  | Bar? _bar; | 
|  | String? str; | 
|  |  | 
|  | Foo(this._bar) : str = _bar?.s; | 
|  | } | 
|  |  | 
|  | // Check that ?? isn't incorrectly optimized as non-nullable | 
|  | // (DDC regression test) | 
|  | test3() { | 
|  | List? n = null; | 
|  | var func = n?.add; | 
|  | var result = func ?? 1; | 
|  | Expect.equals(result, 1); | 
|  |  | 
|  | String? x = null; | 
|  | Expect.equals(x?.split(',') ?? 'hello', 'hello'); | 
|  | } | 
|  |  | 
|  | main() { | 
|  | for (int i = 0; i < 10; i++) { | 
|  | test(); | 
|  | test2(); | 
|  | test3(); | 
|  | } | 
|  |  | 
|  | Expect.equals(null, new Foo(new Bar()).str); | 
|  | } |