|  | // Copyright (c) 2018, 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. | 
|  |  | 
|  | // Tests how nullability is inferred for a final field which is implicitly | 
|  | // initialized to null. This is a regression test for | 
|  | // https://github.com/flutter/flutter/issues/21957. | 
|  |  | 
|  | // VMOptions=--no_background_compilation --optimization_counter_threshold=10 | 
|  |  | 
|  | import "package:expect/expect.dart"; | 
|  |  | 
|  | class A {} | 
|  |  | 
|  | class X { | 
|  | final A? f; | 
|  | X.empty() : f = null; | 
|  | X.full() : f = A(); | 
|  | } | 
|  |  | 
|  | bool doit(bool choice) { | 
|  | X x = choice ? X.full() : X.empty(); | 
|  | return x.f == null; | 
|  | } | 
|  |  | 
|  | class Y { | 
|  | final A? f; | 
|  | Y.c0() : f = A(); | 
|  | Y.c1() : f = null; | 
|  | Y.c2() : f = A(); | 
|  | } | 
|  |  | 
|  | bool doit2(int choice) { | 
|  | late Y y; | 
|  | switch (choice) { | 
|  | case 0: | 
|  | y = new Y.c0(); | 
|  | break; | 
|  | case 1: | 
|  | y = new Y.c1(); | 
|  | break; | 
|  | case 2: | 
|  | y = new Y.c2(); | 
|  | break; | 
|  | } | 
|  | return y.f == null; | 
|  | } | 
|  |  | 
|  | void main() { | 
|  | for (int i = 0; i < 100; i++) { | 
|  | bool ping = (i & 1) == 0; | 
|  | bool result = doit(ping); | 
|  | Expect.equals(result, !ping); | 
|  |  | 
|  | bool result2 = doit2(i % 3); | 
|  | Expect.equals(result2, (i % 3) != 0 && (i % 3) != 2); | 
|  | } | 
|  | } |