| // Copyright (c) 2017, 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.7 | 
 |  | 
 | /*member: main:[null]*/ | 
 | main() { | 
 |   simpleDo(); | 
 |   doNull(); | 
 |   doNotNull(); | 
 |   doNullFalse(); | 
 |   doNotNullTrue(); | 
 |   doUnion(); | 
 | } | 
 |  | 
 | //////////////////////////////////////////////////////////////////////////////// | 
 | /// Simple int based do-while loop. | 
 | //////////////////////////////////////////////////////////////////////////////// | 
 |  | 
 | /*member: simpleDo:[null]*/ | 
 | simpleDo() { | 
 |   var i = 0; | 
 |   do { | 
 |     i = i /*invoke: [subclass=JSPositiveInt]*/ + 1; | 
 |   } while (i /*invoke: [subclass=JSPositiveInt]*/ < 10); | 
 |   i. /*invoke: [subclass=JSPositiveInt]*/ abs(); | 
 | } | 
 |  | 
 | //////////////////////////////////////////////////////////////////////////////// | 
 | /// Do-while loop with null test. | 
 | //////////////////////////////////////////////////////////////////////////////// | 
 |  | 
 | /*member: doNull:[exact=JSString]*/ | 
 | doNull() { | 
 |   var o; | 
 |   do { | 
 |     o = o. /*invoke: [null|exact=JSString]*/ toString(); | 
 |   } while (o == null); | 
 |   return o; | 
 | } | 
 |  | 
 | //////////////////////////////////////////////////////////////////////////////// | 
 | /// Do-while loop with not-null test. | 
 | //////////////////////////////////////////////////////////////////////////////// | 
 |  | 
 | /*member: doNotNull:[exact=JSString]*/ | 
 | doNotNull() { | 
 |   var o = ''; | 
 |   do { | 
 |     o = o. /*invoke: [exact=JSString]*/ toString(); | 
 |   } while (o /*invoke: [null|exact=JSString]*/ != null); | 
 |   return o; | 
 | } | 
 |  | 
 | //////////////////////////////////////////////////////////////////////////////// | 
 | /// Do-while loop with null test known to be false. | 
 | //////////////////////////////////////////////////////////////////////////////// | 
 |  | 
 | /*member: doNullFalse:[exact=JSString]*/ | 
 | doNullFalse() { | 
 |   var o = ''; | 
 |   do { | 
 |     o = o. /*invoke: [exact=JSString]*/ toString(); | 
 |   } while (o /*invoke: [null|exact=JSString]*/ == null); | 
 |   return o; | 
 | } | 
 |  | 
 | //////////////////////////////////////////////////////////////////////////////// | 
 | /// Do-while loop with not-null test known to be true. | 
 | //////////////////////////////////////////////////////////////////////////////// | 
 |  | 
 | /*member: doNotNullTrue:[exact=JSString]*/ | 
 | doNotNullTrue() { | 
 |   var o = null; | 
 |   do { | 
 |     o = o. /*invoke: [null|exact=JSString]*/ toString(); | 
 |   } while (o != null); | 
 |   return o; | 
 | } | 
 |  | 
 | //////////////////////////////////////////////////////////////////////////////// | 
 | /// Do-while loop with not-null test that mixes field accesses. | 
 | //////////////////////////////////////////////////////////////////////////////// | 
 |  | 
 | /*member: Class1.:[exact=Class1]*/ | 
 | class Class1 { | 
 |   /*member: Class1.field:[null|exact=Class2]*/ | 
 |   var field; | 
 | } | 
 |  | 
 | /*member: Class2.:[exact=Class2]*/ | 
 | class Class2 { | 
 |   /*member: Class2.field:[null|exact=Class1]*/ | 
 |   var field; | 
 | } | 
 |  | 
 | /*member: _doUnion:Union(null, [exact=Class1], [exact=Class2])*/ | 
 | _doUnion(/*[exact=Class1]*/ o) { | 
 |   do { | 
 |     o = o. /*Union(null, [exact=Class1], [exact=Class2])*/ field; | 
 |   } while (o != null); | 
 |   return o; | 
 | } | 
 |  | 
 | /*member: doUnion:[null]*/ | 
 | doUnion() { | 
 |   var c1 = Class1(); | 
 |   var c2 = Class2(); | 
 |   c1. /*update: [exact=Class1]*/ field = c2; | 
 |   c2. /*update: [exact=Class2]*/ field = c1; | 
 |   _doUnion(c1); | 
 | } |